制御構造
制御構造はプログラミングにおいて、本当にタイヤが道に出会う場所です。それなしでは、プログラムは連続して実行される命令文の単なるリストです。制御構造があれば、andやorを繰り返すような条件的な確実なコードブロックを実行でいます。これらの基本的なブロックの作りが驚くほど洗練されたプログラムを作るのに結ばれます。
ここで、(if,elif,elseを含む)条件分と(for, while, 付随するbreak, continue, passを含む)ループ文に触れましょう。
条件分: if-elif-else:
条件分はしばしばif-then文のようにあらわされ、プログラマがいくつかの真偽条件に依存するコードの確実な部分を実行するたことを許可します。Pythonの条件文の基本的な例はこれです:
In [1]:
x = -15
if x == 0:
print(x, "is zero")
elif x > 0:
print(x, "is positive")
elif x < 0:
print(x, "is negative")
else:
print(x, "is unlike anything I've ever seen...")
-15はマイナスです。
特に、コードブロックをわけることを示すコロン(:)と空白の使用に留意しましょう。
Pythonは、他言語でしばしば使われるifとelseを採用しています。そのより固有なキーワードはelifです、"else if"に対応しています。これらの条件節では、elifとelseブロックは選択的なものです。加えて、選択的に少しあるいは多くのelif文を好きなだけ含むことができます。
forループ
Pythonのループは繰り返しいくつかのコード文を実行する方法です。そんなわけで、例えば、リストの各項目を表示したいなら、ループで書けます:
In [2]:
for N in [2, 3, 5, 7]:
print(N, end=' ') # print all on same line
2 3 5 7
forループの単純さに留意しましょう:使いたい変数、ループしたいシーケンスを特定して、それらを、直感的に読みやすい方法で、一緒にリンクするin演算子を使いましょう。より正確には、inの右のオブジェクトは任意のPythonのイテレータになります。イテレータは一般的なシーケンスとして考えられます、そして"Iterators"でそれらを話します。
例えば、Pythonでもっとも共通に使われるイテレータの一つはrange objectです、それは数値の連続を生み出します。
In [3]:
for i in range(10):
print(i, end=' ')
0 1 2 3 4 5 6 7 8 9
rangeはデフォルトで0ではじまることに留意しましょう、そして慣習的にrangeのトップは出力に含まれません。Rangeオブジェクトはまたより複雑な値をもてます:
In [4]:
# range from 5 to 10
list(range(5, 10))
Out[4]:
[5, 6, 7, 8, 9]
In [5]:
# range from 0 to 10 by 2
list(range(0, 10, 2))
Out[5]:
[0, 2, 4, 6, 8]
rangeの引数の意味は、リストで網羅したスライシングシンタックスにとてもにていることに気づくかもしれません。
range()のふるまいがPython2とPython3での違いの一つであることに留意しましょう。Python2ではrange()はリストを作りますが、Python3ではrange()は反復のオブジェクトを作ります。
whileループ
Pythonのループの他のタイプはwhileループです、いくつかの条件が一致するまで反復します:
In [6]:
i = 0
while i < 10:
print(i, end=' ')
i += 1
0 1 2 3 4 5 6 7 8 9
whileループの引数は、真偽の文として評価されます、そしてループは文がFalseに評価されるまで実行されます。
breakとcontinue: ループのよい調整
二つの使いやすい文があります、それはループの中で実行のされ方をよく調整するためにループの中で使われます。
break文は全体的にループを外へでます。
continue文は現在のループの残りをスキップします、そして次の反復にいきます。
これらはforとwhileループ両方で使われます。
奇数の文字列を表示するために、continueを使う例があります。この場合、その結果はif-else文を使うのとちょうど同じように完成されます。しかし、ときどきcontinue文は、気にかけているアイデアを表現する、より便利な方法です。
In [7]:
for n in range(20):
# if the remainder of n / 2 is 0, skip the rest of the loop
if n % 2 == 0:
continue
print(n, end=' ')
1 3 5 7 9 11 13 15 17 19
ここにちょっとした少ないタスクのために使われるbreak文の例があります。このループは、すべてのフィボナッチ数をある値までリストを埋めるでしょう。
In [8]:
a, b = 0, 1
amax = 100
L = []
while True:
(a, b) = (b, a + b)
if a > amax:
break
L.append(a)
print(L)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
while True ループ を使っていることに留意しましょう、break文をもたないなら永遠にループするでしょう!
elseブロックをもったループ
Pythonで利用できるパターンをまれに使うもので、forやwhileループの一部としてのelse文があります。以前にelseブロックについて話しました:それは、ifすべてとifとelif文がFalseに評価される場合に実行します。loop-elseは多分Pythonでより困惑させる名前の命令文の一つです。nobreak文としてのそれを考えることを言及します。すなわち、elseブロックは、break文に出会わずに、ループが自然におわるときだけ実行されます。
これが使いやすくなるかもしれない場所の例として、次の(最適化されていない)Sieve of Eratosthenes の実装を考えましょう、素数を見つけるのによく知られたアルゴリズムです。
In [9]:
L = []
nmax = 30
for n in range(2, nmax):
for factor in L:
if n % factor == 0:
break
else: # no break
L.append(n)
print(L)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
else文は唯一、factorsの内与えられた数を除算しきれない場合のみ実行されます。else文はwhileループでも同様に動作します。