python中將函數賦值給變數時需要注意的一些問題,python賦值
前言
本文主要給大家介紹的是關於python將函數賦值給變數時需要注意的一些問題,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:
見過兩種函數賦值給變數的形式,一種是
a=f
另一種是
a=f()
這兩種形式是有區別的,分別總結一下。
1.a=f型屬於將變數指向函數。
用代碼驗證一下:
>>> f = abs>>> f(-10)10
說明變數f現在已經指向了abs函數本身。直接調用abs()函數和調用變數f()完全相同。這是廖雪峰老師python教程上的例子,現在調用f()和調用abs()是一樣的了。
再舉一個工廠函數的例子:
def maker(N): def action(X): return X**N return action
這個嵌套函數的外層傳回值為內層函數的函數名,注意沒有括弧,這裡有無括弧是有很大區別的。此時調用外部函數:
f=maker(2)
那麼如上所述,f便指向了action函數,且限制條件為N=2,可以理解為f為N等於2時的action函數。我們來調用它:
>>> f(3)9
證明f和action函數是一樣的。
2.a=f()型屬於將f()的傳回值賦值給a的過程
這裡的a僅僅接收f()的傳回值,如果f()沒有傳回值,那麼a即被賦值為None。這裡值得注意的一點是,在a=f()的執行過程中,f()會運行一次,這也是我剛剛搞明白的,如:
>>> def add(x,y): z=x+y print(z)>>>a=add(3,4)7
這裡雖然只有一個指派陳述式執行了,但是卻輸出了結果7,說明賦值過程函數add執行了,然而a的值為None,且只能通過print語句才可以顯示。不只是賦值過程函數會執行,寫在return語句中也會如此。
>>>def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper>>>@log>>>def now(): print('2015-3-25')
這是廖雪峰老師python教程裝飾器一節的常式,剛開始我以為return func(*args,**kw)這個語句是返回了now()函數(即func函數)的傳回值,後來發現now函數沒有傳回值,即為None,所以其實是這個語句在賦值過程,
func(*args,**kw)執行了,即函數now的print語句執行了。
下面的習題中,一個變形是要求在函數調用的前後列印出'begin call'和'end call',下面一位網友的程式是這麼寫的:
def wrapper(*args,**kw): print(t+'begin call') result=func(*args,**kw) print(t+'end call') return result
開始不太理解為什麼使用result=func(*args,**kw)這句,後來理解後才明白其實賦值本身並沒有意義,只是這句話同時使得func函數運行了,所以寫成
def wrapper(*args,**kw): print(t+'begin call') func(*args,**kw) print(t+'end call')
結果也是一樣的。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。