Python Cookbook [Manually Consuming an Iterator : 手作業によるイテレーション操作] 投稿一覧へ戻る
Published 2020年4月24日21:08 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
今回からイテレーション関連の tips を取り上げていきます。
イテラブル (iterable) 中の要素を for ループを使わずに処理しろ、って、無茶言うよ、本当に。
手作業でイテラブルを処理するには next() 関数を利用し、コード内で StopIteration 例外を捕まえるようにします。
例えば、ファイルから手作業で1行1行読み込んでいく処理は以下のようになります。
一般的には StopIteration がイテレーションの終了シグナルとして用いられますが、next() を「生身」で利用している場合には None のような値を代わりの終了シグナルとして返すことも可能です。
イテラブルを処理する場合、for ステートメントを使用するケースがほとんどだと思います。
ただ、より綿密な反復処理コントロールが必要な場面に出くわさないとも限りません。
ですから、イテラブル処理において水面下で行われていることを知っておいても無駄ではないでしょう。
次の例は、イテレーション操作の基本的なメカニズムを示したものです。
今回紹介した事項が次回以降のイテレーション関連の 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')
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 = '')
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:
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 の大元になっています。
忘れずに頭の片隅に入れて置いてください。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -