よく使うことになる文法,命令などを説明する.反復処理のfor文と条件判定のif文である.
同じような処理を繰り返し行いたいときに用いる.1~10の整数を一つずつ足し上げるプログラムでみてみよう.
1 2 3 4 | a = 0
for i in [1,2,3,4,5,6,7,8,9,10]:
a = a + i
print(a)
|
実行結果は以下のようになる.
1
3
6
10
15
21
28
36
45
55
1行目:見ての通り,=(イコール)の左側にある変数に,右側の値を代入している.変数aに整数0を代入である.実に自然な書き方だと思うが,これはpythonならではである. C言語などその他の言語で変数を使うときには,まず変数の型(整数,浮動小数点,文字列など)を宣言する必要がある. しかし,pythonでは整数の0が代入されることでaが整数の型を持った変数である.としてくれる.a=0.と実数を代入したら,aは実数になる.
2行目:反復処理の命令,for文である.変数iにinの後ろに示されるリストから要素を一つずつ代入し,その都度その下に書かれている処理を実行する. まずiに1を代入しa=a(=0)+i(=1)を実行する(a=1になる).そしてaを印字する.次にiに2を代入し、またa=a(=1)+i(=2)を行う.これをi=10まで全部で10回繰り返す.
3,4行目:for文で処理すべき中身(ブロック)である.字下げ(インデント)がされているが,これは見た目を意識したのではない.for文の処理内容は,「Tab」で字下げした後に記す決まりである. スペースキーで空白をいくつか並べれば見た目は同じになるがfor文の中身と認識されない,要注意である.
Note
整数のリストを作ることができるrangeを使うと便利である. 例えば,range(1,11,1)=[1,2,3,4,5,6,7,8,9,10]である.初期値1から,1ずつ増やす,11以上になったら終わり. である.小さくしていくこともできる.range(10,-10,-2)=[10,8,6,4,2,0,-2,-4,-6,-8].増減分は省略できて1と解釈される. range(1,11)=[1,2,3,4,5,6,7,8,9,10]さらに初期値も省略することができるが,range(11)=[0,1,2,3,4,5,6,7,8,9,10]の通り,初期値は0になっている.
1 2 3 4 | a = 0
for i in range(11):
a = a + i
print(a)
|
この場合,最後のprint文の前にtabによる字下げがないので,printの命令はfor文による反復処理の範囲外である. 反復処理の終了後に1回だけ実行されるので,aの最終値55だけを印字することになる.printの前に字下げを入れれば,上と同じ結果を印字する.
ある条件の真偽に応じて実行する処理を分けたいときに用いる.100までの整数のうち,19の倍数を見つけるプログラムを以下に示す.
1 2 3 4 | i1 = 19
for i in range(1,100):
if i%i1 == 0:
print(str(i)+ ' is multiple of ' + str(i1))
|
実行結果は以下のようになる.
19 is multiple of 19
38 is multiple of 19
57 is multiple of 19
76 is multiple of 19
95 is multiple of 19
1行目: i1という変数に19を代入する.
2行目: iに1から100までの整数を代入するという反復処理.
3行目:「i%i1」は,iをi1で割り算した時の余りを計算する命令. ifはその後ろに書かれる条件が満たされた時に,その下の処理を実行する. つまり,ここでは,1〜100までの整数が入るiをi1=19で割り算した時の余りを0と比較し,それらが等しい(==)のときは,printを実行せよ,ということである.
4行目:ifの条件が満たされたときに実行される命令.変数(i,i1)の値と文字列「’ is multiple of ‘」を一緒に印字したいのだが, 異なる型を組み合わせて印字することはできない.そこで,数値型をstr()を使って文字列に変換している. 文字列型同士は足し算でつなぎ合わせることができるので,つなぎ合わせて作った文章をprintで印字している.
Note
if文の条件式における比較演算は,以下のようなものがある.
「\(a = b\) : a == b」,「\(a \neq b\) : a != b」,「\(a \gt b\) : a > b」, 「\(a \lt b\) : a < b」,「\(a \geq b\) : a >= b」,「\(a \leq b\) : a <= b」
さらに,19の倍数のうちで,偶数だけを選び出すには,
1 2 3 4 5 | i1 = 19
for i in range(1,100):
if i%i1 == 0:
if i%2 == 0:
print(str(i)+' is multiple of ' + str(i1) + ' and is even number')
|
追記した4行目のif文は,3行目のif文の条件が満たされた時だけ実行される.以下のような結果を印字する.
38 is multiple of 19 and is even number
76 is multiple of 19 and is even number
以下のように書いても,同じ結果を得ることができる.
1 2 3 4 | i1 = 19
for i in range(1,100):
if i%i1 ==0 and i%2 == 0:
print(str(i)+' is multiple of ' + str(i1) + ' and is even number')
|
これは「and」の左右にある二つの条件が両方も満たされるかどうかを判定している. 「19で割った時の余りが0」 かつ「2で割った時の余りが0」であるならば,である. もちろん「あるいは(or)」も用意されている.
次は整数の正負,ゼロを判定するプログラムである.
1 2 3 4 5 6 7 | for i in range(-5,6,1):
if i < 0:
print(str(i)+' is negative')
elif i > 0:
print(str(i)+' is positive')
else:
print(str(i)+' is zero')
|
まずは,負であるかどうかを判定する.ここで真ではなかった(つまり負ではない)場合は, 次のelifに書かれた条件(正であるか)で判定を行う.elifは「else if」の意味である. さらにelif文でも真でない(正でもない)場合は,elseで,ゼロだよねと印字している.
-5 is negative
-4 is negative
-3 is negative
-2 is negative
-1 is negative
0 is zero
1 is positive
2 is positive
3 is positive
4 is positive
5 is positive
多次元配列やその演算,各種の数学関数を扱う機能を提供するnumpyモジュールを利用してみる.
モジュールをimportして(取り込んで),その機能を使用できるようにする. 以下ではすべて,numpyのzerosという機能を使用する. zerosは,要素がゼロの配列を作る.
1 2 3 import numpy a = numpy.zeros(10) print(a)
1行目でnumpyの機能を取り込み可能にする. 2行目で全てゼロの10個の要素を持った配列を作っている. モジュールの機能を使う時は,その前にモジュール名を(ここでは「numpy.」)をつける必要がある.
1 2 3 import numpy as np a = np.zeros(10) print(a)
numpyをnpと名称変更して取り込む. npと名称変更しているので,zerosの前につける接頭語が「np.」に変わる.
1 2 3 from numpy import zeros a = zeros(10) print(a)
numpyから機能zerosを取り込んでいる. この場合は,接頭語なしで使用できる.
上記の3つで,配列aを印字した結果はいずれも以下の通り.
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
ところで,続けて配列の中身を印字してみると...
print(a[0],a[9])
print(a[10])
a[0],a[9]に対しては,それぞれ格納されている値0.0を印字してくれるが, a[10]をprintしようとすると,「index out of bounds(配列の要素を超えている)」と怒られる. zeros(10)で,10個の要素を持っている配列を作っているので,10番目の要素としてa[10]がありそうな気がするが, 要素は0番目から数え始めるので,10個目の要素は9番,a[9]である.ということで,a[10]は範囲外である.