Python3 ループいろいろ - かもメモ

かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Python3 ループいろいろ

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の使いみちがイマイチ謎ぃ

ハッシュ?辞書?のループはまた今度。


[参考]