戻り関数
関数の戻りオブジェクトは、戻ったときにすぐには実行されないが、戻りオブジェクトが呼び出されたときに実行される関数にすることができます。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
ときにlazy_sum
機能がsum
されて返され、関連するパラメータや変数がクロージャと呼ばれて返される関数、に格納されています。
クロージャーでループ変数を参照しないようにしてください。参照しないと、問題が発生する可能性があります。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
#解决办法 是另外定义一个函数 固定住参数
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
#
def createCounter():
num = 0
def counter():
nonlocal num
num=num+1
return num
return counter
# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
クロージャを使用してカウンタ関数を返します。呼び出されるたびに、インクリメントする整数が返されます。
非ローカルはグローバル変数を意味します
匿名関数
無名関数には式が1つしかないため、関数名の競合を心配して直接呼び出す必要はありません。ラムダx、xはパラメーターを表します。
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
L = list(filter(lambda n: n % 2 == 1, range(1, 20)))
print(L)#打印奇数
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
デコレータ
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
#@语法,把decorator置于函数的定义处
@log
def now():
print('2015-3-25')
>>> now()
call now():
2015-3-25
wrapper()
(*args, **kw)
したがって、関数のパラメーター定義は次のとおりです。したがって、関数はwrapper()
任意のパラメーターを使用した呼び出しを受け入れることができます。ではwrapper()
機能、最初のログを印刷した後、元の関数を呼び出します。
より複雑な使用法:
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
#__name__等属性复制到wrapper()
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
デコレータを設計します。任意の関数に作用し、関数の実行時間を出力できます。
import time, functools
def metric(func):
@functools.wraps(func)
def wrapper(*args, **kw):
s = time.time()
x = func(*args, **kw)
e = time.time()
print('%s executed in %s ms' % (func.__name__, (e-s)*1000.0))
return x
return wrapper
# 测试
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
部分機能
functools.partial
の役割は、関数の特定のパラメーターを修正し(つまり、デフォルト値を設定し)、新しい関数を返し、この新しい関数を簡単に呼び出すことです。
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
参照元:https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145929440