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

清菡發表於2020-12-29

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

作者:清菡
部落格: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+原創文章,歡迎關注、交流,禁止第三方擅自轉載。

相關文章