亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

イテレータとジェネレータの包括的な例

イテレータとジェネレータは基本的に相互運(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 つ以上のシーケンス パラメーターを受け入れることができることを述べておきます。

學(xué)び続ける