使用場景:後續**中仍可能需要使用的函式
返回函式即使呼叫相同的引數,返回的也是不同的新函式
def
lazy_sum
(*args)
:def
sum():
ax =
0for n in args:
ax = ax + n
return ax
return
sum
呼叫lazy_sum(*args)時,每次返回新的函式
>>
> f1 = lazy_sum(1,
3,5,
7,9)
# f1返回的是函式sum
>>
> f1
<
locals
>
.sum at 0x102f32158
>
>>
> f1()25
>>
> f2 = lazy_sum(1,
3,5,
7,9)
# f2返回的是乙個新的函式sum
>>
> f1 == f2 # f1與f2傳入相同的引數,但在呼叫的時候,每次返回新的函式
false
閉包:呼叫乙個函式返回乙個函式後,其區域性變數被新函式引用
>>
>
defcount()
:... fs =
...for i in
range(1
,4):
...def
func()
:...
return i*i..
...return fs
>>
> f = count(
)# 返回三個函式組成的列表
>>
> f # 三個函式不相同
[<
locals
>
.f at 0x1091540d0
>
,<
locals
>
.f at 0x109154400
>
,<
locals
>
.f at 0x109154488
>
]>>
> f[1]
()# 先返回三個函式,後執行函式。故此時,他們引用的變數均為3
9>>
> f[2]
()9>>
> f[3]
()9
tips:返回閉包時,返回函式盡量不要引用迴圈變數,或後續會發生變化的變數
lambda()
使用場景:傳入不需要顯示定義的函式
使用限制:只能有乙個表示式,不能return,返回表示式的結果
>>
>
list
(filter
(lambda x : x %2==
1,range(1
,20))
)[1,
3,5,
7,9,
11,13,
15,17,
19]
使用場景:呼叫函式前自動列印日誌,但不修改函式定義
自定義裝飾器decorator步驟:
def
log(text ='')
:def
decorator
(func)
:def
(*args,
**kw)
:# func.__name__用於獲取函式名
print
('%s %s():'
%(text, func.__name__)
)return func(
*args,
**kw)
return decorator
@log(
'execute'
)def
now():
print
('2019-05-06'
)
相當於:
>>
> log(
'execute'
)(now)()
):execute now():
2019-05
-06
解決方案: 使用python內建的functions.wraps
import functools
deflog
(text ='')
:def
decorator
(func)
: @functions.wraps(
)def
(*args,
**kw)
:print
('%s %s():'
%(text, func.__name__)
)return func(
*args,
**kw)
return decorator
偏函式partial function:通過設定引數預設值,降低函式呼叫的難度
>>
>
import functools
>>
> int2 = functools.partial(
int, base=2)
# 將int()函式中base引數設定預設值為2
functools.partial設定預設引數後,可在函式呼叫時傳入其他值;
functools.partial最後接受函式物件、*args和**kw三部分引數
import functools
defadd
(*args,
**kwargs)
:print
(*args)
print
('-'*20
)for key, value in kwargs.items():
print
('%s : %s'
%(key, value)
)add_partial = functools.partial(add,
10, k1 =
10, k2 =20)
print add_partial(10,
2,3, k1 =
40, k3 =
30)
返回結果為
10 10 2 3
--------------------
k1 : 40
k2 : 20
k3 : 30
廖雪峰python教程學習筆記(函式)
1.max函式可以接收任意多個引數,並返回最大的那個 2.函式名其實就是指向乙個函式物件的引用,完全可以把函式名賦給乙個變數,相當於給這個函式起了乙個別名 3.在python中,定義乙個函式要用def語句,依次寫出函式名 括號 括號中的引數和冒號,然後在縮排塊中編寫函式體,函式的返回值用return...
廖雪峰 python 函式(學習筆記)
1.直接呼叫 函式名加引數 呼叫函式的時候如果傳入的引數不對,會報typeerror錯誤 可在互動式命令列中利用help 來檢視函式的用法 2.間接呼叫 將函式名賦給乙個變數 利用變數名來呼叫函式 用def 語句,依次寫出函式名和引數,注意後面加上冒號 縮排 塊中寫實現過程,用return 返回 將...
廖雪峰的Python學習筆記二 函式
在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。e.g.自定義求絕對值的函式my abs def my abs x if x 0 return x else return x小結 定義函式時,需...