L13 理解Python中的特殊的返回值 函式

2021-09-29 15:43:35 字數 1835 閱讀 1413

在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)

# 這裡輸出的是函式物件

print

(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時,可能會導致意料之外的結果 。請看如下示例。

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(

)print

(f1(

), f2(

), f3())

# 9,9,9

你可能認為呼叫f1(),f2()和f3()結果應該是1,4,9,但實際是 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(

)print

(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 按照索...