イテラブルとイテレータ

INPUT · スライド

2つのならびを同時に回す

01 / 06

2つを突き合わせたい

名前のリストと点数のリストが別々にある。「ゆいは90点」と並べて出したい。

前のレッスンの enumerate を使えば、番号で引きなおして書ける。でも番号が出てくるぶん、読むときに一手間かかるね。

namaes = ["ゆい", "そう"]tens = [90, 60]for i, namae in enumerate(namaes):    print(namae, tens[i])

実行結果

ゆい 90
そう 60

02 / 06

zip で横に並べる

これを素直に書けるのが zip(ジップ)。服のファスナーと同じ言葉で、2つのならびの歯をかみ合わせるイメージだよ。

for namae, ten in zip(namaes, tens): と書けば、1周ごとに両方から1つずつが届く。番号はもうどこにも出てこないね。

namaes = ["ゆい", "そう"]tens = [90, 60]for namae, ten in zip(namaes, tens):    print(f"{namae}は{ten}点")

実行結果

ゆいは90点
そうは60点

03 / 06

中身は組のならび

zip が配っているのも、enumerate と同じタプルだよ。そのまま print しても中身は見えない。

print(zip(namaes, tens))<zip object at 0x1234abcd>

list を通すと、かみ合わせた組がぜんぶ見える。左のならびの1つめと右のならびの1つめが、ちゃんと組になっているのが分かるよ。

namaes = ["ゆい", "そう"]tens = [90, 60]print(list(zip(namaes, tens)))

実行結果

[('ゆい', 90), ('そう', 60)]

04 / 06

短いほうに合わせて止まる

長さがちがったらどうなるか。短いほうが尽きたところで終わるよ。エラーにはならない。

下の例では名前が3つ、点が2つ。3人めの あお は出てこない。エラーが出ないので、うっかりデータを落としても気づきにくいんだ。

数がそろっているはずのものを zip するなら、そろっているかを自分で確かめるのが安心だよ。

namaes = ["ゆい", "そう", "あお"]tens = [90, 60]for namae, ten in zip(namaes, tens):    print(namae, ten)

実行結果

ゆい 90
そう 60

05 / 06

3つ以上でもいい

zip に渡せるならびは2つまでではない。3つ渡せば、受け取る名前も3つになるよ。

リストと文字列を混ぜてもいい。イテラブルならなんでも横に並べられる——この章のはじめに開けたふたが、ここで効いてくるね。

namaes = ["ゆい", "そう"]tens = [90, 60]hyokas = ["A", "C"]for namae, ten, hyoka in zip(namaes, tens, hyokas):    print(namae, ten, hyoka)

実行結果

ゆい 90 A
そう 60 C

06 / 06

章のまとめ

この章では、新しくできることはほとんど増えなかった。かわりに、ずっと使っていた for の中身が見えるようになった。

  • 回せるものがイテラブル
  • 1つずつ配る係がイテレータ
  • for は iter と next をくり返しているだけ
  • 番号がほしいなら enumerate、2つ並べたいなら zip

enumerate と zip は、知っているかどうかでコードの見た目が変わる2つだよ。番号を自分で増やしたくなったら、まずこの2つを思い出してみて。

次の章では、リストから新しいリストを1行で作る書きかたを覚えるよ。