前言
見過兩種函式賦值給變數的形式,一種是?
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
*
args,
*
*
kw):
print
(
'call %s():'
%
func.__name__)
return
func(
*
args,
*
*
kw)
return
>>>@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
*
args,
*
*
kw):
print
(t
+
'begin call'
)
result
=
func(
*
args,
*
*
kw)
print
(t
+
'end call'
)
return
result
開始不太理解為什麼使用result=func(*args,**kw)
這句,後來理解後才明白其實賦值本身並沒有意義,只是這句話同時使得func函式執行了,所以寫成?
def
*
args,
*
*
kw):
print
(t
+
'begin call'
)
func(
*
args,
*
*
kw)
print
(t
+
'end call'
)
結果也是一樣的。
總結
python中將函式賦值為變數
最近看 被變數賦值搞得頭暈,略微整理一下。t.py defhello print hello return 1 main1.py from t import hello hello 1 hello指向1,從此開始,匯入的hello函式丟失。h hello 報錯 int object is not c...
python中將函式賦值給變數時需要注意的一些問題
見過兩種函式賦值給變數的形式,一種是 a f另一種是 a f 這兩種形式是有區別的,分別總結一下。1.a f型屬於將變數指向函式。用 驗證一下 f abs f 10 10說明變數f現在已經指向了abs函式本身。直接呼叫abs 函式和呼叫變數f 完全相同。這是廖雪峰老師python教程上的例子,現在呼...
python中將函式賦值給變數時需要注意的一些問題
見過兩種函式賦值給變數的形式,一種是 a f另一種是 a f 這兩種形式是有區別的,分別總結一下。1.a f型屬於將變數指向函式。用 驗證一下 f abs f 10 10說明變數f現在已經指向了abs函式本身。直接呼叫abs 函式和呼叫變數f 完全相同。這是廖雪峰老師python教程上的例子,現在呼...