クロージャ、イテレータ、発電機

閉鎖

  1. ネストされた関数では、外部の非内部関数のグローバル変数を使用して
  2. 役割:データのセキュリティ保護
  3. 自然デコレータはクロージャです
def func():
    avg_lst = []  # 自由变量
    def foo(pirce):
        avg_lst.append(pirce)
        avg = sum(avg_lst) / len(avg_lst)
        return avg
    return foo
ret = func()
print(ret(150000))
print(ret.__closure__) # 查询是不是闭包
print(ret.__code__.co_freevars) # 获取的是自由变量
print(ret.__code__.co_varnames) # 获取的是局部变量

二つのイテレータ

2.1反復可能オブジェクト

ビューDIR()

内部含有__iter__方法的对象,都是可迭代对象。

利点:柔軟な、あなたは値を直接見ることができます

短所:総メモリではなく、反復の値

2.2イテレータ

只要具有__iter__()方法__next__()方法就是迭代器

利点:メモリ、メモリメカニズムを保存

短所:柔軟ではない、操作が複雑である、あなたは直接の要素を見ることができません

特徴:1回(なくなって実行)、不可逆性(引き込まれていない)、不活性メカニズム

2.3反復可能オブジェクトは、イテレータを変換しました

lst = [1,2,3,4,6]
new_list = lst.__iter__()  #将可迭代对象转换成迭代器

ループのためのエッセンス2.4

lst = [1,2,3,4,5,6,7,8,9]
new_lst = lst.__iter__()    #先转换成迭代器
while 1:
    try:
        print(new_lst.__next__())
    except StopIteration:
        break

三つの発電機

本質的に異なるイテレータとイテレータBuilderはPythonが構築されているイテレータである、彼らはコードジェネレータを内蔵している使用しました

3.1発電機を内蔵しています

  1. 独自の発電機の機能を書き込むことにより、
  2. 派生ジェネレータによって
  3. 組み込み関数やモジュールのpython

3.2ジェネレータ機能

1.収量

収量への復帰の機能、それはFUNC機能ではないようではなく、ファンクション・ジェネレータ

def func():
    print(11)
    yield 22
ret = func()   #产生一个生成器
print(ret)

出力結果:<0x000000000223FE08でジェネレータオブジェクトの機能>

私たちは関数本体のコードの関数を呼び出すとき、実行は、キーワードを生成するときに実行された場合、我々はビルダーを宣言したいことを見つけられるだろう。Builderプログラムは、私たちのリターンを得られます

ジェネレータとイテレータ同じ値

def func():
    print("111")
    yield 222
    print("333")
    yield 444
gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__()
# 最后一个yield执行完毕,再次__next__()程序报错
print(ret3)

ジェネレータ機能は、プログラムが、収率の最後に実行されている場合、それはイテレータのように、次、次の収率の数を超え、エラーう収率に対応する、次の()プログラムを説明するの背後に実行を継続し、より多くの収量を書き込むことができます。

print(func().__next__()) # 坑 -- 会产生新的生成器
print(func().__next__())

収量との違いを返します。

一般的にはリターン機能は一つだけ、彼の役割は、機能を終了することで、機能の実行の戻り値に提供されます。

複数設けられていてもよいジェネレータ関数を得て、彼は機能を停止しないことを、次の対応する捕捉要素が生成もたらします。収率は、実行場所、収率を記録し、関数内のwhileループのために一時的に停止することができるであろう

2.種子

def gen(name):
    print(f'{name} ready to eat')
    while 1:
        food = yield
        print(f'{name} start to eat {food}')
dog = gen('alex')
next(dog)
dog.send('骨头') # 还可以给上一个yield发送值
dog.send('狗粮')
dog.send('香肠')

違いを送信し、次の():

同じポイント:

発電機は一度下方対応を得ることができるように送信し、次の()。

降伏値が生成され得ることができます。

違い:

第1の取得収率値は、次の((なし)を送信することができない)送信することはできません使用することができます。

設定値が送信され得るために送信することができます。

(のpython3)から3の収率は、要素ごとのリターンイテレート可能オブジェクトであります

def func():
    lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
    lst2 = ['馒头', '花卷', '豆包', '大饼']
    yield from lst1
    yield from lst2
g = func()
for i in g:
    print(i)

戻り最初のすべての要素のリストの後、第2のリストに戻ります

おすすめ

転載: www.cnblogs.com/lav3nder/p/11801564.html