見出し画像

定着するまで何度でも・・・

何度か登場しているforによる反復処理

イテレータ(イテレーションごとにリスト、辞書などから要素を1つずつ取り出して返すもの)を使えば、データ構造がどれくらいのサイズなのか、どのように実装されているのかを知らなくても、データ構造の各要素を操作可能。
その場で作ったデータもforで受け付けられるので、コンピュータのメモリに全部収めきれないようなデータストリームも処理できる。

>>> rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']
>>> current = 0
>>> while current < len(rabbits):
...     print(rabbits[current])
...     current += 1
... 
Flopsy
Mopsy
Cottontail
Peter
>>> 

上記よりも、下記の方がPythonらしいコードとなる

>>> for rabbit in rabbits:
...     print(rabbit)
... 
Flopsy
Mopsy
Cottontail
Peter
>>> 

 rabbits のようなリストは、文字列、タプル、辞書、集合、その他とともに、Pythonのイテラブルオブジェクト。タプルやリストを for で処理すると、一度に1つずつ要素が取り出される。文字列を for で処理すると、下記のようになる。

>>> word = 'cat'
>>> for letter in word:
...     print(letter)
... 
c
a
t
>>> 

 辞書(または辞書の keys 関数を for で処理すると、キーが返される。
下記をご参照ください ↓

>>> recommends = {'Mandheling Tobako':'French Roast', 'Mocha Mattari':'City Roast', 'Brazil Chocola':'High Roast'}
>>> for recommend in recommends: #または for recommend in recommends.keys():
...     print(recommend)
... 
Mandheling Tobako
Mocha Mattari
Brazil Chocola
>>> 

キーではなく、値を反復処理したい場合には、辞書の values() 関数を使う。

>>> for recommend in recommends.values():
...     print(recommend)
... 
French Roast
City Roast
High Roast
>>>

キーと値の両方をタプルの形で返したい場合は、items() 関数を使う。

>>> for item in recommends.items():
...     print(item)
... 
('Mandheling Tobako', 'French Roast')
('Mocha Mattari', 'City Roast')
('Brazil Chocola', 'High Roast')
>>> 
>>> for recommend in recommends.items():
...     print(recommend)
... 
('Mandheling Tobako', 'French Roast')
('Mocha Mattari', 'City Roast')
('Brazil Chocola', 'High Roast')
>>> 

タプルの各要素を個別の変数に代入する作業は、ワンステップでできることを覚えておく。items() が返す個々のタプルについて、第1のキーを bean、第2の値をcontents に代入可能。

>>> for bean, contents in recommends.items():
...     print(contents, 'is recommended for', bean, '.')
... 
French Roast is recommended for Mandheling Tobako .
City Roast is recommended for Mocha Mattari .
High Roast is recommended for Brazil Chocola .
>>> 

break による中止

for ループに break を入れると、while ループのときと同様に、そこでループを中止する。

continue による次のイテレーションの開始

for ループに continue を入れると、while ループのときと同様に、ループの次のイテレーションにジャンプする。

else による break のチェック

while と同様に、for は正常終了したかどうかをチェックするオプションのelseを持っている。break が呼び出されなければ、else 文が実行される
 この機能は、for ループが break 呼び出しで途中で終了しておらず、最後まで実行されたことを確かめたいときに役立つ。次の例の for ループは、目的のコーヒー豆があれば、その豆の名前を表示して break する。

>>> beans = []
>>> for bean in beans:
...     print('This shop has some rich', bean)
...     break
... else:
...     print("Unfortunately, I don't have  the beans that I want...")
... 
Unfortunately, I don't have  the beans that I want...
>>> 

while の時と同時に、for ループの else はわかりにくいが、何かを探すために for ループを使い、それが見つからなかった時に else が呼び出されると考えるとわかりやすい。
else を使わずに同じ効果を得るためには、次に示すように、for ループ内で探していたものが見つかったかどうかを示す変数を使わなければならない。

>>> beans = []
>>> found_one = False
>>> for bean in beans:
...     found_one = True
...     print('This shop has some rich', bean)
...     break
... 
>>> if not found_one:
...     print('This is not much of a coffee shop, is it?')
... 
This is not much of a coffee shop, is it?
>>> 

zip() を使った複数のシーケンスの反復処理

for ループには、もう1つ巧妙なテクニックがある。zip()関数を使えば、複数のシーケンスを並列的に反復処理可能。



最後までお読みいただき、本当にありがとうございます。 明日も継続して学習のアウトプットを続けていきたいと思いますので、また覗きにきていただけると嬉しいです! 一緒に学べる仲間が増えると、もっと喜びます!笑 これからも宜しくお願い致しますm(__)m