cover_python_cookbook

Python Cookbook [Manually Consuming an Iterator : 手作業によるイテレーション操作] 投稿一覧へ戻る

Tags: Python , Cookbook , next , StopIteration , iterable , iteration

Published 2020年4月24日21:08 by T.Tsuyoshi

今回からイテレーション関連の tips を取り上げていきます。

Problem:

イテラブル (iterable) 中の要素を for ループを使わずに処理しろ、って、無茶言うよ、本当に。

Solution:

手作業でイテラブルを処理するには next() 関数を利用し、コード内で StopIteration 例外を捕まえるようにします。


例えば、ファイルから手作業で1行1行読み込んでいく処理は以下のようになります。

with open('../data/products.txt') as f:
try:
while True:
line = next(f)
print(line, end = '')
except StopIteration:
print('finish')



一般的には StopIteration がイテレーションの終了シグナルとして用いられますが、next() を「生身」で利用している場合には None のような値を代わりの終了シグナルとして返すことも可能です。

with open('../data/products.txt') as f:
while True:
line = next(f, None)
if line is None:
break
print(line, end = '')



イテラブルを処理する場合、for ステートメントを使用するケースがほとんどだと思います。


ただ、より綿密な反復処理コントロールが必要な場面に出くわさないとも限りません。


ですから、イテラブル処理において水面下で行われていることを知っておいても無駄ではないでしょう。


次の例は、イテレーション操作の基本的なメカニズムを示したものです。

items = [1, 2, 3]
my_iter = iter(items) # → items.__iter__() を呼び出してイテレーターを取得します。
next(my_iter) # → 1 [my_iter.__next__() を呼び出してイテレーターを動作させます。
next(my_iter) # → 2
next(my_iter) # → 3
next(my_iter) # → Traceback (most recent call last) StopIteration:



今回紹介した事項が次回以降のイテレーション関連の tips の大元になっています。


忘れずに頭の片隅に入れて置いてください。

この投稿をメールでシェアする

1 comment

Comment 1 by CharlesNeuro 2020年4月29日18:46

Hello

コメントを追加する(不適切と思われるコメントは削除する場合があります)