処理制御はpythonの構文の中でも非常に重要なもので、よく使われる判定文やループ、様々な式があります。
判定文
最も有名な判定文はifとelseの組み合わせで、多くの言語でこの形式が使われていますが、elifについては言語によって形式が異なる場合があります:
In [1]: x = 5
In [2]: if x>0:
...: print('正の整数')
...: elif x<0:
...: print('負の整数')
...: else:
...: print('
...:
elifは省略可能です。elifというキーワードはelse ifの略で、pythonはインデントが非常に厳しいので、この書き方はインデントが深くなりすぎないようにするのに有効です。 if ... elif ... elif ... シーケンスは他の言語では switch 文や case 文の代わりとして使われます。
ループ文
forループ
Python の for 文は、任意のシーケンスの子要素を、シーケンスに現れる順番に繰り返し処理します。
In [3]: str1 = 'mao'
In [4]: for i in str1:
...: print(i)
...:
m
a
o
リストのループ処理は、子項目が異なることを除けば、文字列とほとんど同じです。
In [5]: list1 = ['a','aa','aaa']
In [6]: for i in list1:
...: print(i,len(i))
...:
a 1
aa 2
aaa 3
非常に一般的な組み合わせは、for文とrange関数の組み合わせです。
In [8]: for j in range(len(list1)):
...: print(j,list1[j])
...:
0 a
1 aa
2 aaa
In [9]: for i,v in enumerate(list1):
...: print(i,v)
...:
0 a
1 aa
2 aaa
例えば、while文
In [10]: i = 1
In [11]: list2 = []
In [12]: while i<=5:
...: list2.append(i)
...: i+=1
In [14]: list2
Out[14]: [1, 2, 3, 4, 5]
式の要素は、次の for 文と if 文によって計算されます。
break文は、forループやwhileループから抜け出すときに使います。
In [15]: for i in range(0,5):
...: if i == 3:
...: break
...: else:
...: print(i)
0
1
2
forループに判定文が追加され、iが3に等しいときにforループがジャンプして続行されないようになり、出力がセマンティクスと一致するようになっていることがわかります。
continue文は、次の反復を継続するための文であり、どのような条件で実行を継続するか、またはどのような条件でループからジャンプするかを決定するために、judgement文と組み合わせて使用することができます。
In [20]: for i in range(2,7):
...: if i%2==0:
...: print('An even number',i)
...: continue
...: if i>4:
...: print('beyond 4')
...: break
...:
An even number 2
An even number 4
beyond 4
pass文は主にプレースホルダーの役割を果たし、if、for、whileのようにemptyを続けることができない文がありますが、passプレースホルダーを使用することができ、エラーはありません。
In [1]: while True:
...: pass
イテレータ、ジェネレータ
iter () メソッドでイテレータを構築し、next () メソッドでイテレータ内の値を返したり、イテレータから返り値を取り出したりすることができます。
In [1]: it = iter('python')
In [2]: print(it)
<str_iterator object at 0x00000187ADA75A00>
In [3]: next(it)
Out[3]: 'p'
In [4]: next(it)
Out[4]: 'y'
次のメソッドが最後の値まで反復されると、次のメソッドを呼び続けるとエラーがポップアップします。もちろん、forループを使って出力を繰り返し処理することもできます:
In [6]: for i in it:
...: print(i)
t
h
o
n
Pythonを深く掘り下げると、ジェネレータは関数と組み合わせることでより使いやすくなることがわかります。ジェネレータのキーワードは yield です。 ジェネレータには next() メソッドもありますし、for ループを使って出力を繰り返し処理することもできます。
In [8]: def reverse(data):
...: for i in range(len(data)-1,-1,-1):
...: yield data[i]
In [9]: gen = reverse('mao')
In [10]: print(gen)
<generator object reverse at 0x00000187AD99FDD0>
In [11]: next(gen)
Out[11]: 'o'
In [12]: for i in gen:
...: print(i)
a
m
括弧で囲まれた式は、ジェネレーターを作成するために使用することができます。
In [14]: gen2 = (i for i in range(0,5))
In [15]: print(gen2)
<generator object <genexpr> at 0x00000187ADA18D60>
表达式
リスト式
通常の方法は、シーケンスの各メンバーに何らかの演算を適用してリストを作成し、返された要素からリストを作成するか、特定の条件を満たす要素から部分シーケンスを作成します。例えば、10までの正方形の数を取得したい場合は、以下のように通常のメソッドを使用します:
In [16]: squares = []
In [17]: for i in range(10):
...: squares.append(i ** 2)
In [18]: squares
Out[18]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
しかし、リスト式がシンプルであることを示しています。
In [20]: squares = [x**2 for x in range(10)]
In [21]: squares
Out[21]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
上記のリスト式は比較的単純なものですが、フィルター条件として式中に判定文を追加することもできます。
In [22]: list2 = [x*2 for x in range(10) if x*2>3]
In [23]: list2#0と2は除外される。
Out[23]: [4, 6, 8, 10, 12, 14, 16, 18]
リスト式はさらに、2つのリストの要素を組み合わせることによって形成することができます。
In [24]: list3 = [(x,y) for x in [1,2] for y in [2,3]if x!=y]
In [25]: list3
Out[25]: [(1, 2), (1, 3), (2, 3)]
もう少し複雑なリスト式には入れ子型がありますが、そのような式の欠点は、22の行列を置くなど、詳細を考える必要があるため、あまり読みやすいものではないということです。
In [28]: mat = [[1,2,3],[4,5,6]]
In [29]: list3 = [[row[i] for row in mat] for i in range(3)]
In [31]: list3
Out[31]: [[1, 4], [2, 5], [3, 6]]
セット式
セット式はリスト式と2つの点で異なります:
- 1、コレクション式は{}を使用する必要があります。
- 2, set 式はコレクションを返すので、要素は強調されません。
In [32]: set1 = {i for i in 'abcdddddd' if i not in 'abc'}
In [33]: set1
Out[33]: {'d'}
for文の中の文字列にはもともとたくさんのdがあり、条件付きフィルタリングとセットによるウェイト除去の後、最後には1つしか残っていないことがわかります。
もちろん、set()メソッドでリスト式をセットに変換することも可能です。
In [34]: set2 = set([(x,y) for x in range(2) for y in range(2)])
In [35]: set2
Out[35]: {(0, 0), (0, 1), (1, 0), (1, 1)}
辞書式
辞書はpythonでは非常に一般的なデータ型なので、辞書式も特に重要です。辞書式も {} を使って構築されますが、式が {} の形式である必要があります。
In [36]: dict1 = {x:x**2 for x in range(1,4)}
In [37]: dict1
Out[37]: {1: 1, 2: 4, 3: 9}
辞書式をいくつかのメソッドやステートメントと組み合わせることで、より多くの機能を実現することもできます。
In [38]: dict2 = {x:len(x) for x in ['aa','bb','ccc']}
In [39]: dict2
Out[39]: {'aa': 2, 'bb': 2, 'ccc': 3}
キーと値のペアの変換は、items() メソッドを使用して簡単に実装できますが、辞書のキーが一意である必要があることに注意する必要があります。
In [40]: dict3 = {v:k for k,v in dict2.items()}
In [41]: dict3
Out[41]: {2: 'bb', 3: 'ccc'}
上記の例からわかるように、式は括弧で囲まれた式の後にfor文が続き、その後に0個以上のfor文またはif文が続き、最終的に指定されたデータ型を返します。