イテレータとジェネレータの包括的な例
イテレータとジェネレータは基本的に相互運(yùn)用可能であるため、いくつかの知識(shí)ポイントを統(tǒng)合する必要があります
1. 逆反復(fù)
逆反復(fù)、これも一般的です。たとえば、最初から繰り返す例では、1 から 5
list1 = [1,2,3,4,5] for num1 in list1 : print ( num1 , end = ' ' )
という出力リストの要素があります。では、5 から 1 まではどうすればよいでしょうか?これも非常に単純です。Python には組み込み関數(shù) reversed() があります。
list1 = [1,2,3,4,5] for num1 in reversed(list1) : print ( num1 , end = ' ' )
方向性反復(fù)は非常に単純ですが、注意すべき點(diǎn)が 1 つあります。逆方向反復(fù)は、オブジェクトのサイズが指定できる場合にのみ機(jī)能します。事前に設(shè)定されているか、オブジェクトが __reversed__( ) を?qū)g裝して有効になります。両方が満たされない場合は、まずオブジェクトをリストに変換する必要があります。
実際、多くの場合、カスタム クラスに __reversed__() メソッドを?qū)g裝することで逆反復(fù)を?qū)g裝できます。ただし、これまでの章で觸れていない知識(shí)もありますが、適宜読み進(jìn)めていただければ、プログラミングの基礎(chǔ)を持っている方は上記の知識(shí)を?qū)Wんだ上で理解できるはずです。
# -*- 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)
出力結(jié)果は 1 から 30、次に 30 から 1 で、それぞれ順番に出力され、逆順に出力されます。
2 複數(shù)のシーケンスを同時(shí)に繰り返します
各シーケンスから毎回 1 つの要素を取得して、複數(shù)のシーケンスを同時(shí)に反復(fù)処理したいとします。そのようなニーズに遭遇したことはありますか?
複數(shù)のシーケンスを同時(shí)に反復(fù)するには、zip() 関數(shù)を使用します。具體例:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '兩點(diǎn)水'] ages = [18, 19, 20] for name, age in zip(names, ages): print(name,age)
出力結(jié)果:
laingdianshui 18 twowater 19 兩點(diǎn)水 20
実際には、zip(a , b) は、タプル (x, y) を返す反復(fù)子を生成します。ここで、x は a から、y は b から得られます。シーケンスの 1 つが最後に到達(dá)すると、反復(fù)は終了します。したがって、反復(fù)の長さは、パラメーター內(nèi)の最も短いシーケンスの長さと一致します。この文の理解に注意してください。つまり、a と b の長さが一致しない場合は、短い方が標(biāo)準(zhǔn)として使用され、走査は終了します。
zip() 関數(shù)を使用すると、次のようにキー リストと値リストから dict (辭書) を生成することもできます:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '兩點(diǎn)水'] ages = [18, 19, 20] dict1= dict(zip(names,ages)) print(dict1)
次の結(jié)果を出力します:
{'laingdianshui': 18, 'twowater': 19, '兩點(diǎn)水': 20}
ここで、zip() は 2 つだけではなく、3 つ以上のシーケンス パラメーターを受け入れることができることを述べておきます。