for
s = '' for i in range(3): s += str(i) print(i) # => 2 print(s) # => '012' s = '' # 3<= i < 10 でループ for i in range(3, 10): s += str(i) print(s) # => '3456789'
リストをループ
s = '' arg = ['foo', 'bar', 'buz'] for i in arg: s += i print(s) # => 'foobarbuz'
リストのインデックスは取れない
リストのインデックスを取得するループ
enumerate()
を使う
enumerate(iterable, start=0) - 2. 組み込み関数 — Python 3.6.5 ドキュメント
arg = ['foo', 'bar', 'buz'] for index, val in enumerate(arg): print( 'arg[{0}] = {1}'.format(index, val) ) # => arg[0] = foo # => arg[1] = bar # => arg[2] = buz
len()
でリストの要素数を取ってループ
arg = ['foo', 'bar', 'buz'] for i in range( len(arg) ): print( 'arg[{0}] = {1}'.format(i, arg[i]) ) # => arg[0] = foo # => arg[1] = bar # => arg[2] = buz
enumerate()
の方がクールな感じ
while
i = 0 while i < 10: print(i, end=', ') i += 1 # => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
breakとcontinue
break
- ループから抜ける
i = 10 while i > 0: if i == 3: break print(i, end=", ") i -= 1 # => 10, 9, 8, 7, 6, 5, 4,
continue
- 処理をスキップ
for i in range(10): if i == 3 or i == 7: continue print(i, end=', ') # => 0, 1, 2, 4, 5, 6, 8, 9,
複数のリストを同時にループで回す
zip
zip(*iterables)
それぞれのイテラブルから要素を集めたイテレータを作ります。この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。このイテレータは、入力イテラブルの中で最短のものが尽きたときに止まります。
出典: zip(*iterables) - 2. 組み込み関数 — Python 3.6.5 ドキュメント
リストの要素数が異なる時は最も要素が少ないリスト長でのループになる
names = ['Mika', 'Aki', 'Mikko'] ages = [18, 17, 16] for name, age in zip(names, ages): print(name, age) # => Mika 18 # => Aki 17 # => Mikko 16 roles = ['boss', 'gunner', 'driver', 'correspondent'] for name, role, age in zip(names, roles, ages): print(name, role, age) # => Mika boss 18 # => Aki gunner 17 # => Mikko driver 16
zip_longest
tertools.zip_longest(*iterables, fillvalue=None)
各 iterable の要素をまとめるイテレータを作成します。iterable の長さが違う場合、足りない値は fillvalue で埋められます。最も長い itarable が尽きるまでイテレーションします。
出典: itertools.zip_longest(*iterables, fillvalue=None) - 10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.6.5 ドキュメント
異なるリストの要素数が異なる時、足りない要素を任意の値で埋めて最も長い要素数でループすることができる
from itertools import zip_longest names = ['Mika', 'Aki', 'Mikko'] ages = [18, 17, 16] roles = ['boss', 'gunner', 'driver', 'correspondent'] for name, role, age in zip_longest(names, roles, ages, fillvalue = '---'): print(name, role, age) # => Mika boss 18 # => Aki gunner 17 # => Mikko driver 16 # => --- correspondent ---
fillvalue
で埋める値を指定しない場合はNone
が出力される
from itertools import zip_longest
が無くてもPython v3.6.5だとエラーにならなかったので、このimportが必要なのかどうか不明
ループ - else
ループにelse
節を続けるとelse
節の中がループの終了時に実行される
for i in range(10): if i == 3 or i == 7: continue print(i, end=', ') else: print("loop end!") # => 0, 1, 2, 4, 5, 6, 8, 9, loop end!
↓ 下記と実質的に同じ気が....
for i in range(10): if i == 3 or i == 7: continue print(i, end=', ') print("loop end!") # => 0, 1, 2, 4, 5, 6, 8, 9, loop end!
ループ後のelseの使いみちがイマイチ謎ぃ
ハッシュ?辞書?のループはまた今度。
[参考]
- Python基礎講座(9 反復)
- Python配列のループ処理
- Python, zip関数の使い方: 複数のリストの要素をまとめて取得 | note.nkmk.me
- 2. 組み込み関数 — Python 3.6.5 ドキュメント
- 10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.6.5 ドキュメント
- 発売日: 2016/06/22
- メディア: Amazonビデオ
- この商品を含むブログを見る