在python中,一切函式即物件。函式同時也可視作變數,作為乙個返回值。下面通過實際案例來說明下,當函式作為返回值時的使用方式與注意事項
def
calc_sum
(*args)
: ax =
0for n in args:
ax = ax + n
return ax
# 場景1:執行函式,會立即執行,並得到結果集
calc_sum(1,
3,9)
下面來看看,當給定一組相同的輸入引數,得到兩個不同的返回函式物件是否相等。# 另一種場景,不需要立即求和,
deflazy_sum
(*args)
:def
sum():
ax =
0for n in args:
ax = ax+n
return ax
return
sumf = lazy_sum(1,
3,9)
# 這裡輸出的是函式物件
(f)# 再呼叫函式 f() ,得到執行結果
f()
可見,雖然輸入引數一樣,但二者並不是同乙個物件。# 每次呼叫lazy_sum()時,都會返回乙個新的函式
f1 = lazy_sum(1,
3,9)
f2 = lazy_sum(1,
3,9)
# 且是不同的物件
f1 is f2
# false
內部函式sum()引用外部函式lazy_sum()的區域性變數 *args時,可能會導致意料之外的結果 。請看如下示例。
你可能認為呼叫f1(),f2()和f3()結果應該是1,4,9,但實際是 9,9,9。def
count()
: fs =
# 外部函式的區域性變數i
for i in
range(1
,4):
# 注: 這裡定義f()函式時,並未傳入引數
deff()
:# 對外部變數作運算操作、並返回
return i*i
# 新增的是函式物件f,而不是f(),更不是f(i)
# 返回列表物件
return fs
# 執行
f1, f2, f3 = count(
(f1(
), f2(
), f3())
# 9,9,9
正是因為內部函式中引用了外部函式中的變數 i ,但它並非立即執行,等3個函式都返回時,變數i已經變為了3,導致最終結果為 9
謹記返回函式不要引用任何迴圈變數,或者後續會發生變化的變數
如何避免?
再建立乙個函式,用該函式的引數繫結迴圈變數當前的值。
無論該迴圈變數後續如何更改,已繫結到函式引數的值不變
def
count()
: fs =
for i in
range(1
,4):
deff
(i):
defg()
:return i*i
return g
# 新增的是 f(i) ,不是f,也不是f()
)return fs
f1, f2, f3 = count(
(f1(
), f2(
), f3(
))
深入理解Python 中的特殊常量None
false 不同,它不表示 0,也不表示空字串,而表示沒有值,也就是空值。none 有自己的資料型別,我們可以在 idle 中使用 type 函式檢視它的型別,執行 如下 type none class nonetype none的定義如下 class nonetype object methods...
python中的特殊的函式
lambda map reduce filter 學習這幾個函式之前首先我先舉乙個例子,個人感覺這個例子牛皮的不行 實現列表中的每個元素加3 n range 1,10 way1 i 3 for i in n way2 n2 lam lambda x x 3 for i in n way3 deffo...
python類中的特殊方法
python類特殊方法 方法功能說明 new 類的靜態方法,用於確定是否建立物件 init 建構函式,生成物件時呼叫 del 析構函式,釋放物件時呼叫 add sub mul truediv floordiv mod pow repr 列印,轉換 setitem 按照索引賦值 getitem 按照索...