Pythonのジェネレータ(発電機)&反復子(イテレータ)

ビルダー&パイソンイテレータ

発電機(ジェネレータ)

式のリスト

リスト式が書かれた式が、リストを生成するために使用されるが、ストレージがその計算され、生成されたリストメモリサイズが制限されている
例:

a = [x ** 2 for x in range(5)]
print(a)

出力:

[0, 1, 4, 9, 16]

発電機(ジェネレータ)

発電機はまた、リストを生成するために使用することができるが、各コールに、発生アルゴリズムを保存されnext、得られたメモリのサイズ制限はなくなりますので、結果を計算するときにリスト
の例:

a = (x ** 2 for x in range(5))
print(a)
for i in range(6):
    print(next(a))

出力:

<generator object <genexpr> at 0x107da7870>
0
1
4
9
16
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration

各呼び出しはnext()、最後の要素への計算まで、再びフロント要素の値を取得することはできません、次の要素の値を算出し、これ以上の元素、スローを呼び出すとStopIterationエラー

ジェネレータ関数

機能が表示されたらyield、この関数はジェネレータ関数となったとき
の時間の実装に遭遇した発電機yieldが一時停止し、現在の動作情報をすべて、戻りセーブyield値を、次のパフォーマンスをnext()するときの方法現在の場所から動作を継続します
。例:

def fib(max_n):
    """斐波那契数列生成器"""
    n, a, b = 0, 0, 1
    while n < max_n:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


def main():
    f = fib(6)
    while True:
        try:
            x = next(f)
            print(x)
        except StopIteration as e:
            print("Generator return value:", e.value)
            break


if __name__ == '__main__':
    main()

出力:

1
1
2
3
5
8
Generator return value: done

以下の場合には並行処理動作による効果を得るシングルスレッド

例:

import time


def consumer(name):
    print("%s开始吃包子了" % name)    
    while True:
        produce = yield                                # 函数在此暂停,等待唤醒
        print("%s吃了第%i笼包子" % (name, produce+1))      # 唤醒后执行


def producer(name):
    c = consumer("A")
    c2 = consumer("B")
    c.__next__()    
    c2.__next__()
    print("%s准备开始生产" % name)
    for i in range(3):
        time.sleep(1)
        print("已经做了%i笼包子" % (i+1))
        c.send(i)                                       # 将i发送给produce,并唤醒函数
        c2.send(i)

producer("C")

出力:

A开始吃包子了
B开始吃包子了
C准备开始生产
已经做了1笼包子
A吃了第1笼包子
B吃了第1笼包子
已经做了2笼包子
A吃了第2笼包子
B吃了第2笼包子
已经做了3笼包子
A吃了第3笼包子
B吃了第3笼包子

順番に生産者と消費者C2のC関数は、関数を呼び出す
send()next()にも同じことが発電機を覚ますことができますが、yield伝統的な価値観

イテレータ(反復子)

反復可能オブジェクト(反復可能)

これは、データの次の二つのタイプのループに直接作用することがあります。

  1. クラスは、データ型、リストなど、タプル、辞書、集合、STR等の集合であります
  2. 一つは、発電機および収率で生成関数を含む、発電機である
    ループイテレート可能オブジェクトとして参照されるオブジェクトに直接作用することができます

例:

def fib(max_n):
    """斐波那契数列生成器"""
    n, a, b = 0, 0, 1
    while n < max_n:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


def main():
    f = fib(6)
    for i in f:
        print(i)


if __name__ == '__main__':
    main()

出力:

1
1
2
3
5
8

イテレータ(反復子)

することができるnext()機能は、オブジェクトを返し、イテレータの次の値に進み呼ばれる呼ばれる
ジェネレータイテレータオブジェクトされているが、リスト、辞書、STR反復処理可能、イテレータではないが
辞書、リスト、STRは、反復処理可能イテレータを使用することができるとなり、他のiter()機能
例:

a = [1, 2, 3, 4, 5, 6, 7]
b = a.__iter__()
c = iter(a)

print(a, b, c)

出力:

[1, 2, 3, 4, 5, 6, 7] <list_iterator object at 0x11d271f60> <list_iterator object at 0x11d260160>

B、Cはにイテレータ内には
、B、Cは、ループのために使用することができます。

for i in a:
    print(i)
for i in b:
    print(i)

一貫性のある結果

コントラスト

発電機(ジェネレータ)はイテレータ(反復子)であるが、必ずしもジェネレータイテレータ、ならびにによってiter()なるイテレータ反復可能

おすすめ

転載: www.cnblogs.com/dbf-/p/11877251.html