閉鎖機能
閉鎖は、(内部関数function)を含むパッケージ(内部関数ではなく、グローバルスコープの変数外側範囲への参照)を閉じました。
外部基準ではなく、グローバルスコープのスコープの内部機能の機能:閉鎖を指します。
包接機能の閉鎖:次いで、パッケージとの両方の機能を有する缶閉鎖機能+変数内部閉鎖機能の内部には、戻り値アウトフォームから返さ。
閉鎖機能を備えています:関数が関数に関わらず優先外層はその範囲を包んだ場合の呼び出しを行い、また層に包まれたスコープ機能、外、オブジェクトだけでなく、関数オブジェクトを返します。
def f1(url):
def f2():
print(url)
return f2
res = f1() # res = f2
res() # res() == f2()
デコレーター
デコレータ:装飾的な関数オブジェクトを追加するために使用される種類は、追加の機能である機能
特徴:
- コードの本来の機能を変更しません
- これは、元の関数が呼び出された変更されません。
import time
def index():
print('hello world')
time.sleep(1)
def f2():
print('f2')
time.sleep(2)
start = time.time()
index()
end = time.time()
print(f'run time is {end-start}')
start = time.time()
f2()
end = time.time()
print(f'run time is {end-start}')
あなたがそれらを使用するための関数を定義することができ、コードを簡単にする方法を見つけるためにそれらを呼び出すことができるようにインデックスと同じ機能のF2、およびその用途に見つけることができますが、同じです。
第一の方法:方法の呼び出しを変更します
import time
def index():
print('hello world')
time.sleep(1)
def time_count(func):
start = time.time()
func()
end = time.time()
print(f'{func} run time is {end-start}')
time_count(index)
そうする方法を見つけるし、得られた結果は上記と同じですが、インデックスのアプローチは同じではありません使用して見つけることができますすることができます。
第二の方法:パケット関数 - アウトソーシング
import time
def index():
print('hello world')
time.sleep(1)
def time_count(func):
def wrapper():
start = time.time()
func()
end = time.time()
print(f'{func} run time is {end-start}')
return wrapper
# f = time_count(index)
# f() # 这里的f其实就是在调用index函数,但如果命名为f,用户就不知道你在调用index
index = time_count(index)
index() # 新变量也命名为index,对用户来说,就是在调用之前的index,只不过功能更新了
ソースコードを変更していないインデックスは、time_countウェイ指数関数呼び出し、変更されていない機能はデコレータです。
私たちは、インデックス機能は、実際にラッパー関数を呼び出していること最後の呼び出しを見つけたので、私たちは、インデックスが値を返す場合、そのラッパー関数は、ラッパーとしての指数関数の戻り値を受け取る変数、および関数でなければならない、と思いました戻って返します。
私たちは、以下の調整を行いました。
import time
def index():
print('hello world')
time.sleep(1)
return 123
def time_count(func):
def wrapper():
start = time.time()
res = func()
end = time.time()
print(f'{func} run time is {end-start}')
return res
return wrapper
index = time_count(index)
res = index()
print(f'res:{res}')
最後に、関数は戻り値123のインデックスを返すことができます。
元のインデックス()メソッドは、質量参加を必要とする場合、我々の以前の方法は=インデックスを()wrapper_に起因して、達成することができないので、パラメータを渡すためのラッパー()関数を与えます。
import time
def home(name):
print(f'welcome {name} to home page')
time.sleep(1)
return name
def time_count(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f'{func} time is {end - start}')
return res
return wrapper
home = time_count(home) # 前一个home = wrapper , 括号里的home = home函数
res = home('egon') # == wrapper('egon')
print(f'res:{res}')
デコレータのシンタックスシュガー
装飾的な機能ですぐ上、および別の行に書かれています@装饰器名
import time
def time_count(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f'{func} run time is {end-start}')
return res
return wrapper
@time_count
def home(name):
print(f'welcome {name} to home page')
time.sleep(1)
return name
res = home('egon')
print(f'res:{res}')
効果と上記のような方法
装飾的なテンプレート
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
ライン上のテンプレートに従って書かれました
三のデコレータ
デコレータ3セット
username_list = []
def sanceng(role):
def login_deco(func):
def wrapper(*args,**kwargs):
if username_list:
print('请勿重复登录')
res = func(*args,**kwargs)
return res
username_lnp = input('请输入用户名:')
pwd_inp = input('请输入密码:')
with open(f'{role}_info.txt','r',encoding='utf8') as fr:
for user_info in fr:
username,pwd = user_info.strip().split(':')
if username_lnp == username and pwd_inp== pwd:
print('登录成功')
username_list.append(username)
res = func(*args,**kwargs)
return res
else:
print('登陆失败')
return wrapper
return login_deco
@sanceng('user')
def index(x,y):
print('index')
print('x,y',x,y)
return 123
res = index(10,20)
イテレータ導入
反復可能オブジェクト
__iter__メソッドを含有する反復可能オブジェクトと呼ばれています
イテレータ
イテレータと呼ば__iter__と__next__方法を含みます
ジェネレータ
yieldキーワードを含む関数は、発電機と呼ばれています