閉鎖
- ネストされた関数では、外部の非内部関数のグローバル変数を使用して
- 役割:データのセキュリティ保護
- 自然デコレータはクロージャです
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発電機を内蔵しています
- 独自の発電機の機能を書き込むことにより、
- 派生ジェネレータによって
- 組み込み関数やモジュールの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のリストに戻ります