イテレータとジェネレータの包括的な例
イテレータとジェネレータは基本的に相互運用可能であるため、いくつかの知識ポイントを統合する必要があります
1. 逆反復
逆反復、これも一般的です。たとえば、最初から繰り返す例では、1 から 5
list1 = [1,2,3,4,5] for num1 in list1 : print ( num1 , end = ' ' )
という出力リストの要素があります。では、5 から 1 まではどうすればよいでしょうか?これも非常に単純です。Python には組み込み関数 reversed() があります。
list1 = [1,2,3,4,5] for num1 in reversed(list1) : print ( num1 , end = ' ' )
方向性反復は非常に単純ですが、注意すべき点が 1 つあります。逆方向反復は、オブジェクトのサイズが指定できる場合にのみ機能します。事前に設定されているか、オブジェクトが __reversed__( ) を実装して有効になります。両方が満たされない場合は、まずオブジェクトをリストに変換する必要があります。
実際、多くの場合、カスタム クラスに __reversed__() メソッドを実装することで逆反復を実装できます。ただし、これまでの章で触れていない知識もありますが、適宜読み進めていただければ、プログラミングの基礎を持っている方は上記の知識を学んだ上で理解できるはずです。
# -*- coding: UTF-8 -*- class Countdown: def __init__(self, start): self.start = start def __iter__(self): # Forward iterator n = self.start while n > 0: yield n n -= 1 def __reversed__(self): # Reverse iterator n = 1 while n <= self.start: yield n n += 1 for rr in reversed(Countdown(30)): print(rr) for rr in Countdown(30): print(rr)
出力結果は 1 から 30、次に 30 から 1 で、それぞれ順番に出力され、逆順に出力されます。
2 複数のシーケンスを同時に繰り返します
各シーケンスから毎回 1 つの要素を取得して、複数のシーケンスを同時に反復処理したいとします。そのようなニーズに遭遇したことはありますか?
複数のシーケンスを同時に反復するには、zip() 関数を使用します。具体例:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '两点水'] ages = [18, 19, 20] for name, age in zip(names, ages): print(name,age)
出力結果:
laingdianshui 18 twowater 19 两点水 20
実際には、zip(a , b) は、タプル (x, y) を返す反復子を生成します。ここで、x は a から、y は b から得られます。シーケンスの 1 つが最後に到達すると、反復は終了します。したがって、反復の長さは、パラメーター内の最も短いシーケンスの長さと一致します。この文の理解に注意してください。つまり、a と b の長さが一致しない場合は、短い方が標準として使用され、走査は終了します。
zip() 関数を使用すると、次のようにキー リストと値リストから dict (辞書) を生成することもできます:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '两点水'] ages = [18, 19, 20] dict1= dict(zip(names,ages)) print(dict1)
次の結果を出力します:
{'laingdianshui': 18, 'twowater': 19, '两点水': 20}
ここで、zip() は 2 つだけではなく、3 つ以上のシーケンス パラメーターを受け入れることができることを述べておきます。