deflazy_sum(*args):defsum():
ax = 0forninargs:
ax = ax + nreturnaxreturnsum
當我們呼叫lazy_sum()
時,返回的並不是求和結果,而是求和函式:
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<functionlazy_sum..sum
at 0x101c6ed90>
呼叫函式f
時,才真正計算求和的結果:
>>> f()
25
在這個例子中,我們在函式lazy_sum
中又定義了函式sum
,並且,內部函式sum
可以引用外部函式lazy_sum
的引數和區域性變數,當lazy_sum
返回函式sum
時,相關引數和變數都儲存在返回的函式中,這種稱為「閉包(closure)」的程式結構擁有極大的威力。
請再注意一點,當我們呼叫lazy_sum()
時,每次呼叫都會返回乙個新的函式,即使傳入相同的引數:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
false
f1()
和f2()
的呼叫結果互不影響。
練習:
請用匿名函式改造下面的**:
def is_odd(n):
return n % 2 == 1
l = list(filter(is_odd, range(1, 20)))
修改:
l=list(filter(lambda n:n%2==1,range(1,20)))
print(l)
偏函式(partial function)
functools.partial
就是幫助我們建立乙個偏函式的,不需要我們自己定義int2()
,可以直接使用下面的**建立乙個新的函式int2
:
>>>importfunctools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64>>> int2('1010101')
85
所以,簡單總結functools.partial
的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。
注意到上面的新的int2
函式,僅僅是把base
引數重新設定預設值為2
,但也可以在函式呼叫時傳入其他值:
>>> int2('1000000', base=10)
1000000
functools.partial
就是幫助我們建立乙個偏函式的,不需要我們自己定義int2()
,可以直接使用下面的**建立乙個新的函式int2
:
>>>importfunctools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64>>> int2('1010101')
85
所以,簡單總結functools.partial
的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。
注意到上面的新的int2
函式,僅僅是把base
引數重新設定預設值為2
,但也可以在函式呼叫時傳入其他值:
>>> int2('1000000', base=10)
1000000
python返回函式 python中返回函式
python的函式不但可以返回int str list dict等資料型別,還可以返回函式!例如,定義乙個函式 f 我們讓它返回乙個函式 g,可以這樣寫 deff print call f 定義函式g defg print call g 返回函式g return g 仔細觀察上面的函式定義,我們在函...
python學習之返回函式
在學習返回函式的時候,函式只是在呼叫的時候才會執行一直不理解,隔天後在來看的時候明白了一些,記錄一下。看 def fun1 n deffun2 x return pow x,n return fun2 pow2 fun1 2 pow2 fun2 at 0x7f8bdfe2e378 pow2 9 81...
python返回 python 返回函式
返回函式 1.高階函式除了能夠接收函式作為引數外,還能把函式作為結果返回 2.例如乙個求和函式,通常情況下的定義以及呼叫 def sum nums x 0for n in nums x x n return x sum 1,2,3,4,5 不返回求和的結果,而是返回求和的函式 def sum 1 n...