測開之函數進階· 第4篇《匿名函數》

堅持原創輸出,點擊藍字關注我吧

作者:清菡
部落格:oschina、雲+社區、知乎等各大平台都有。

由於微信公眾號推送改為了資訊流的形式,防止走丟,請給加個星標 ⭐,你就可以第一時間接收到本公眾號的推送!

目錄

  • 一、匿名函數
    • 1.匿名函數格式
    • 2.匿名函數適用的場景
    • 3.如何調用 lambda 函數
    • 4.運算符的優先順序
    • 5.用 lambda 實現過濾
    • 6.在列表推導式中怎麼用?
  • 二、三目運算符
  • 三、精彩推薦

一、匿名函數

Python 中有一種特殊的函數,不需要使用def去定義,也不用給函數起名字。用lambda表達式來定義,這種函數叫做匿名函數。

1.匿名函數格式

lambda 參數:表達式(返回值)

lambda定義函數和def定義函數的時候,格式是不一樣的。

這個匿名函數lambda a,b:a+b和這個普通函數:

def func(a,b):
    return a+b

效果是一樣的。

def後面跟著函數名字func()lambda後面是沒有函數名字的,直接寫參數,參數後面是個冒號。冒號後面的a+b就是個返回值。

2.匿名函數適用的場景

簡單的函數定義(只有一個表達式)。

例如普通函數:

def func(a,b):
    c = a+b
    print(c)
    return a+b

這個函數裡面有多條語句,這種的話就不適用於這個匿名函數lambda a,b:a+b語句。

lambda只有一條return的內容。return根據參數進行相關操作,進行返回。

3.如何調用 lambda 函數

錯誤方式一:

lambda a,b:a+b(11,22)

沒看到輸出結果。其實是調用了,只是你沒看到。調用完畢後,返回值需要接收一下。

這樣是調用不了的:

res = lambda a,b:a+b(11,22)
print(res)

列印一個 lambda 函數對象:

lambda a,b:a+b這塊是個匿名函數,lambda a,b:a+b(11,22)這樣寫,會把a+b(11,22)全部當作一個表達式。

res = lambda a,b:a+b(11,22)
print(res(11,22))

這時候運行就會報錯:

報錯提示:int對象沒有調用的方法。

錯誤方式二:

還有,這種寫法定義函數,也不會去用:

f=lambda a:a*9
f(10)

匿名函數講究即用即釋放,就是定義這個函數,使用完畢後,記憶體裡面就釋放這個記憶體了。

因為沒有任何變數指向這個函數,所以記憶體就馬上釋放了,可以節約記憶體。

定義完畢後:

f=lambda a:a*9
f(10)

f 就相當於一個函數名了,調用完畢後,再想用這個 f, 還是可以夠得到的。那這個函數始終都存在記憶體裡面了。

正確調用方式:

res = lambda a,b:a+b
print(res(11,22))

4.運算符的優先順序

如果分不清哪個先用,哪個後用,可以加個括弧把它擴起來:

(lambda a,b:a+b)(1,2)

res = (lambda a,b:a+b)(1,2)
print(res)

通過lambda直接定義直接調用,例如(lambda a,b:a+b)(1,2)(lambda a,b:a+b)調用完畢後,馬上從記憶體里給刪除掉了,立馬釋放記憶體。

5.用 lambda 實現過濾

lambda 用的最多的是在 filter()zip()函數。

li = [1, 2, 122, 331, 11, 22, 33, 4, 6, 7, 2, 88, 31]

res2=filter(lambda x:x<10,li)
print(list(res2))

這樣就實現了一個快速的過濾,之前還要定義一個函數,這樣寫更加節省記憶體,而且語法更加舒適:

x<10的都保留下來,當然你也可以修改成x<33或者其它的,具體看列表裡面的元素,設置的條件不一樣,輸出的結果就不同。

res2=filter(lambda x:x<10,li)中過濾條件是lambda x:x<10,後面傳可迭代對象li

6.在列表推導式中怎麼用?

生成 10 個數:

li2=[(lambda x:x%5==0)(i) for i in range(10)]
print(li2)

lambda x:x%5==0這是個lambda的表達式,需要個x的參數,是能夠被 5 整除的意思。

二、三目運算符

a=100
if a>100:
    print(100)
else:
    print(22)

寫成三目運算符是這樣:

print(100) if a>100 else print(22)

三目運算符適用於條件成立的時候做什麼事情,條件不成立的時候做什麼事情。有些很簡單的條件控制,通過這種方式來做。

lambda一樣,可以簡化程式碼。原來需要定義這個函數,再傳進去,通過lambda表達式也可以把函數直接寫在那行程式碼裡面了,不需要去單獨去定義函數了。lambda表達式用得多,三目運算符用得少。

三、精彩推薦


公眾號 清菡軟體測試 首發,更多原創文章:清菡軟體測試 113+原創文章,歡迎關注、交流,禁止第三方擅自轉載。