はじめに
機械学習の勉強を始めたVBAユーザです。
備忘録としてPython・Rの文法をVBAと比較しながらまとめていきたいと思います。
目次
繰り返し処理
今回は、繰り返し処理(ループ処理)についてまとめます。
for文
まずは、for文です。
シンプルな例
シンプルなfor文の例です。
Python
# for文
foriinrange(5):print(i)# 0
# 1
# 2
# 3
# 4
print(range(5))# range(0, 5)
print(type(range(5)))# <class 'range'>
print(list(range(5)))# [0, 1, 2, 3, 4]
Pythonではfor文のブロックをインデント(字下げ)で表現します。range(5)
は 0,1,2,3,4 という整数を順番に返すイテラブルオブジェクト(iterable object)(反復可能オブジェクト)で、list(range(5))
でリスト[0, 1, 2, 3, 4]
になります。
R
for(iin0:4){print(i)}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4print(0:4)# 0 1 2 3 4
0:4
は 0 から 4 までの整数値のベクトルです。
VBA
For i = 0 To 4
Debug.Print i
Next i
' 0
' 1
' 2
' 3
' 4
他の例
Python
Ns=[2,3,5,7,11]foriinrange(len(Ns)):print(Ns[i])# 2
# 3
# 5
# 7
# 11
Ns=[2,3,5,7,11]forninNs:print(n)# 2
# 3
# 5
# 7
# 11
Pythonでは、リストもイテラブルオブジェクトなので、in
の後に指定できます。
R
Ns<-c(2,3,5,7,11)for(iin1:length(Ns)){print(Ns[i])}# [1] 2# [1] 3# [1] 5# [1] 7# [1] 11Ns<-c(2,3,5,7,11)for(ninNs){print(n)}# [1] 2# [1] 3# [1] 5# [1] 7# [1] 11
Rでも、in
の後にベクトルを指定できます。
VBA
A = Array(2, 3, 5, 7, 11)
For i = LBound(A) To UBound(A)
Debug.Print A(i)
Next i
' 2
' 3
' 5
' 7
' 11
VBAで、A = Array(2, 3, 5, 7, 11)
と書くと、配列Aのインデックスは(デフォルトの設定では)0から4の整数になります。LBound(A)
は配列Aの最小のインデックス(ここでは0)、UBound(A)
は配列Aの最大のインデックス(ここでは4)を返します。
さらに
Pythonではこのような書き方もできます。
enumerate関数
enumerate関数は、イテラブルオブジェクトに対して(要素番号, 要素)
の形のタプルを1つずつ返すイテラブルオブジェクトを返す組み込み関数です。
Python
Ns=[2,3,5,7,11]fori,ninenumerate(Ns):print('Ns['+str(i)+'] = '+str(n))# Ns[0] = 2
# Ns[1] = 3
# Ns[2] = 5
# Ns[3] = 7
# Ns[4] = 11
Ns=[2,3,5,7,11]fori,ninenumerate(Ns):print('Ns[{}] = {}'.format(i,n))# Ns[0] = 2
# Ns[1] = 3
# Ns[2] = 5
# Ns[3] = 7
# Ns[4] = 11
同じことをRとVBAで書くならこうなります。
R
Ns<-c(2,3,5,7,11)for(iin1:length(Ns)){n=Ns[i]cat(paste0("Ns[",i,"] = ",n,"\n"))}# Ns[1] = 2# Ns[2] = 3# Ns[3] = 5# Ns[4] = 7# Ns[5] = 11
VBA
A = Array(2, 3, 5, 7, 11)
For i = LBound(A) To UBound(A)
Debug.Print "Ns[" & CStr(i) & "] = " & Str(A(i))
Next i
' Ns [0] = 2
' Ns [1] = 3
' Ns [2] = 5
' Ns [3] = 7
' Ns [4] = 11
zip関数
zip関数は、複数のイテラブルオブジェクトに対してそれぞれからの要素のペアを1つずつ返すイテラブルオブジェクトを返す組み込み関数です。
Python
numbers=list(range(5))alphabets='abcde'hiraganas='あいうえお'forn,s,hinzip(numbers,alphabets,hiraganas):print('{}-{}-{}'.format(n,s,h))# 0-a-あ
# 1-b-い
# 2-c-う
# 3-d-え
# 4-e-お
while文
次は、while文です。
Python
i=0whilei<5:print(i)i=i+1# 0
# 1
# 2
# 3
# 4
i=0whilei<5:print(i)i+=1# 0
# 1
# 2
# 3
# 4
i = i + 1
は複合代入演算子+=
を使ってi += 1
とも書けます。
R
i<-0while(i<5){print(i)i=i+1}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4
VBA
i = 0
Do While i < 5
Debug.Print i
i = i + 1
Loop
' 0
' 1
' 2
' 3
' 4
VBAでは、While
の他にUntil
もあります。
i = 0
Do Until i = 5
Debug.Print i
i = i + 1
Loop
' 0
' 1
' 2
' 3
' 4
同じことをPythonとRで書くならこうなります。
Python
i=0whilenoti==5:print(i)i=i+1# 0
# 1
# 2
# 3
# 4
R
i<-0while(!(i==5)){print(i)i=i+1}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4
ループの終了
途中でループを抜ける(繰り返し処理を終了する)方法です。
Python
foriinrange(5):ifi==2:breakprint(i)# 0
# 1
R
for(iin0:4){if(i==2){break}print(i)}# [1] 0# [1] 1
VBA
For i = 0 To 4
If i = 2 Then
Exit For
End If
Debug.Print i
Next i
' 0
' 1
VBAでループを抜けるには、Forループの場合はExit For
、Doループの場合はExit Do
を使います。
ループのスキップ
途中のループを飛ばして(スキップして)次のループに移る(次の繰り返し処理に進む)方法です。
Python
foriinrange(5):ifi==2:continueprint(i)# 0
# 1
# 3
# 4
R
for(iin0:4){if(i==2){next}print(i)}# [1] 0# [1] 1# [1] 3# [1] 4
VBA
For i = 0 To 4
If i = 2 Then
GoTo continue
End If
Debug.Print i
continue:
Next i
' 0
' 1
' 3
' 4
VBAにはPythonのcontinue
文やRのnext
文のようなループをスキップする文はありません。どうしても使いたいならGoTo
を使います。
その他
Rにはrepeat
文というのもありますが、これはwhile (TRUE)
(while
文の条件式にTRUE
(常に真)を入れたもの)と同じことですので、あまり使い道がなさそうです。
R
i<-0repeat{if(i==2){break}print(i)i=i+1}# [1] 0# [1] 1i<-0while(TRUE){if(i==2){break}print(i)i=i+1}# [1] 0# [1] 1
同じことをPythonとVBAで書くならこうなります。
Python
i=0whileTrue:ifi==2:breakprint(i)i+=1# 0
# 1
VBA
i = 0
Do While True
If i = 2 Then
Exit Do
End If
Debug.Print i
i = i + 1
Loop
' 0
' 1
まとめ
一覧
各言語で使用する書き方等を一覧にまとめます。
Python | R | VBA | |
---|---|---|---|
for文 | for i in ...: ... | for (i in ...) { ... } | For i = ... To ... ... Next i |
while文 | while ...: ... | while (...) { ... } | Do While ... ... Loop |
until文 | while not ...: ... | while (!(...)) { ... } | Do Until ... ... Loop |
repeat文 | while True: ... | repeat { ... } | Do While True ... Loop |
break文 | break | break | Exit For Exit Do |
continue文 | continue | next |
プログラム全体
参考までに使ったプログラムの全体を示します。
Python
# for文
foriinrange(5):print(i)# 0
# 1
# 2
# 3
# 4
print(range(5))# range(0, 5)
print(type(range(5)))# <class 'range'>
print(list(range(5)))# [0, 1, 2, 3, 4]
Ns=[2,3,5,7,11]foriinrange(len(Ns)):print(Ns[i])# 2
# 3
# 5
# 7
# 11
Ns=[2,3,5,7,11]forninNs:print(n)# 2
# 3
# 5
# 7
# 11
Ns=[2,3,5,7,11]fori,ninenumerate(Ns):print('Ns['+str(i)+'] = '+str(n))# Ns[0] = 2
# Ns[1] = 3
# Ns[2] = 5
# Ns[3] = 7
# Ns[4] = 11
Ns=[2,3,5,7,11]fori,ninenumerate(Ns):print('Ns[{}] = {}'.format(i,n))# Ns[0] = 2
# Ns[1] = 3
# Ns[2] = 5
# Ns[3] = 7
# Ns[4] = 11
numbers=list(range(5))alphabets='abcde'hiraganas='あいうえお'forn,s,hinzip(numbers,alphabets,hiraganas):print('{}-{}-{}'.format(n,s,h))# 0-a-あ
# 1-b-い
# 2-c-う
# 3-d-え
# 4-e-お
# while文
i=0whilei<5:print(i)i=i+1# 0
# 1
# 2
# 3
# 4
i=0whilei<5:print(i)i+=1# 0
# 1
# 2
# 3
# 4
# untilの代わり
i=0whilenoti==5:print(i)i=i+1# 0
# 1
# 2
# 3
# 4
# break文
foriinrange(5):ifi==2:breakprint(i)# 0
# 1
# continue文
foriinrange(5):ifi==2:continueprint(i)# 0
# 1
# 3
# 4
# repeat文の代わり
i=0whileTrue:ifi==2:breakprint(i)i+=1# 0
# 1
R
# for文for(iin0:4){print(i)}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4print(0:4)# 0 1 2 3 4Ns<-c(2,3,5,7,11)for(iin1:length(Ns)){print(Ns[i])}# [1] 2# [1] 3# [1] 5# [1] 7# [1] 11Ns<-c(2,3,5,7,11)for(ninNs){print(n)}# [1] 2# [1] 3# [1] 5# [1] 7# [1] 11Ns<-c(2,3,5,7,11)for(iin1:length(Ns)){n=Ns[i]cat(paste0("Ns[",i,"] = ",n,"\n"))}# Ns[1] = 2# Ns[2] = 3# Ns[3] = 5# Ns[4] = 7# Ns[5] = 11# while文i<-0while(i<5){print(i)i=i+1}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4# untilの代わりi<-0while(!(i==5)){print(i)i=i+1}# [1] 0# [1] 1# [1] 2# [1] 3# [1] 4# break文for(iin0:4){if(i==2){break}print(i)}# [1] 0# [1] 1# next文for(iin0:4){if(i==2){next}print(i)}# [1] 0# [1] 1# [1] 3# [1] 4# repeat文i<-0repeat{if(i==2){break}print(i)i=i+1}# [1] 0# [1] 1i<-0while(TRUE){if(i==2){break}print(i)i=i+1}# [1] 0# [1] 1
VBA
Sub test_repeat()
Dim i As Integer
Dim A As Variant
' for文
For i = 0 To 4
Debug.Print i
Next i
' 0
' 1
' 2
' 3
' 4
A = Array(2, 3, 5, 7, 11)
For i = LBound(A) To UBound(A)
Debug.Print A(i)
Next i
' 2
' 3
' 5
' 7
' 11
A = Array(2, 3, 5, 7, 11)
For i = LBound(A) To UBound(A)
Debug.Print "Ns[" & CStr(i) & "] = " & Str(A(i))
Next i
' Ns [0] = 2
' Ns [1] = 3
' Ns [2] = 5
' Ns [3] = 7
' Ns [4] = 11
' while文
i = 0
Do While i < 5
Debug.Print i
i = i + 1
Loop
' 0
' 1
' 2
' 3
' 4
' until文
i = 0
Do Until i = 5
Debug.Print i
i = i + 1
Loop
' 0
' 1
' 2
' 3
' 4
' ループからExit
For i = 0 To 4
If i = 2 Then
Exit For
End If
Debug.Print i
Next i
' 0
' 1
' Doループの場合は、Exit Do
' GoToを使ってcontinue文をVBAで実現
For i = 0 To 4
If i = 2 Then
GoTo continue
End If
Debug.Print i
continue:
Next i
' 0
' 1
' 3
' 4
' repeat文の代わり
i = 0
Do While True
If i = 2 Then
Exit Do
End If
Debug.Print i
i = i + 1
Loop
' 0
' 1
End Sub