閉鎖機能
クロージャの機能は何ですか
組み込み関数、参照される外部変数の関数、インライン関数は、閉鎖機能になることでした
外部関数の定義と呼ばれているが、可変内部リファレンス機能自由変数
クロージャネストされた関数は、少なくともの関数であり、
def f1(x):
def f2():
print(x)
return f2
num = f1(2)
num()
def outer(x,y):
def inner():
nonlocal x ,y
x += 1
y += 2
print(f'x:{x},y:{y}')
return inner
test = outer(2,5)
test()
test()
グローバル変数、関数内でカプセル化された内側と外側の機能ではなく、外部コールを使用してクロージャを削除する機能を使用しました。
実行が完了外側の関数、そのパラメータxであるとき、彼らは閉鎖されているので、yが残って、それが回復することはありません。
デコレーター
デコレータパラメータは伝達関数であるアドバンストアプリケーションデコレータ閉鎖機能に対応する、クロージャの伝達関数パラメータは、可変です。デコレーションは、ソースコードを変更するために使用されていないと機能は、元の関数に追加する方法を呼び出します。
- デコレータ自体は関数であるが、それは装飾的な機能で飾らなければ使用しました
- 装飾的な装飾的な関数は、関数を装飾するためにソースコードを変更しません
- 装飾された機能を変更しないデコレータ装飾関数が呼び出されます
import time
def index():
"""被装饰的函数"""
print('index')
time.sleep(1)
# time_count装饰器:对被装饰函数计时
def time_count(func): # func才是真正的index
"""装饰器"""
def wrapper():
start = time.time()
func()
end = time.time()
print(end - start)
return wrapper
index = time_count(index) # index == wrapper
index() # wrapper()
デコレータの戻り値
import time
def index():
"""被装饰的函数"""
print('x',x)
print('index')
time.sleep(1)
return 'index'
# time_count装饰器:对被装饰函数计时
def time_count(func): # func才是真正的index
"""装饰器"""
def wrapper():
start = time.time()
res = func() # index()
end = time.time()
print(end - start)
return res
return wrapper
index = time_count(index) # index == wrapper
res = index() # wrapper()
print(res)
関数の戻り値については、我々は戻り値を受け取る変数名を取ることができます
RESの= funcを()その後、RESを返します
引数デコレータがあります。
import time
def index(x,y,z=10):
"""被装饰的函数"""
print('x',x)
print('index')
time.sleep(1)
return 'index'
# time_count装饰器:对被装饰函数计时
def time_count(func): # func才是真正的index
"""装饰器"""
def wrapper(*args,**kwargs): # (10, 20) # *args和**kwargs接收了所有的参数
start = time.time()
res = func(*args,**kwargs) # index() # *(10,20) # *args和**kwargs打散参数传给真正的index
end = time.time()
print(end - start)
return res
return wrapper
index = time_count(index) # index == wrapper
res = index(10,20,320) # wrapper()
print(res)
私たちは、元の関数のパラメータの何がわからない場合、我々は、可変長のパラメータのデコレータを使用することができます
デフラッパー(* argsを、** kwargsから):
RESの= funcを(* argsを、** kwargsから)
使用に値の最後に、再送信
デコレータのシンタックスシュガー
@デコレータ関数名
インデックス= time_count(インデックス)== @time_count
装飾的な機能の上に書き込むためのデコレータ機能、@以下飾ら関数を記述します。
装飾的なテンプレート
要約すると、我々は直接使用適用されたときのようなテンプレートデコレータを得ることができます
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
pass
return res
return wrapper
@decp
def show(name, age):
print(name,age)
show('ly',10)