三元表達式、列表推導式、生成器表達式、lambda表達式(匿名函數)

目錄:

  • 三元表達式

  • 各類推導式

  • 生成器表達式

  • lamda表達式

1、三元表達式

  語法:爲真時的結果 if 斷定條件 else 爲假時的結果python

  實例:面試

>>> a = "zjk"
>>> print("666") if a == "zjk" else print("888") 666

2、各類推導式

  說明:推導式又稱解析式,是python的一種獨有特性。推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體,共有三種推導;ide

  列表推導式、字典推導式、集合推導式;函數

1.列表推導式

  說明:使用 [ ] 生成listspa

  格式:3d

variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res:  列表生成元素表達式,能夠是有返回值的函數。 for out_exp in input_list:  迭代input_list將out_exp傳入out_exp_res表達式中。 if out_exp == 2:  根據條件過濾哪些值能夠。

  實例:code

#實例一:計算30內能夠被3整除的數
>>> li = [i for i in range(30) if i % 3 == 0] >>> print(li) [0, 3, 6, 9, 12, 15, 18, 21, 24, 27] #實例二:計算30內能夠被3整除的數的平方
>>> li = [i**2 for i in range(30) if i % 3 == 0] >>> print(li) [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

2.字典推導式

  說明:字典推導和列表推導的使用方法是相似的,只不中括號該改爲大括號;blog

  實例:get

#實例一:將key變爲小寫,併合並全部相同key以及key對應的value
>>> dic = {"a":10,"b":34,"A":7,"Z":56} >>> dic_zjk = {n.lower():dic.get(n.lower(),0) + dic.get(n.upper(),0) for n in dic if n.lower() in ["a","b","z"]} >>> print(dic_zjk) {'a': 17, 'b': 34, 'z': 56} #實例二:快速更換key和value
>>> print(dic_zjk) {'a': 17, 'b': 34, 'z': 56} >>> dic = { v:k for k,v in dic_zjk.items()} >>> print(dic) {17: 'a', 34: 'b', 56: 'z'}

3.集合推導式

  說明:它們跟列表推導式也是相似的。 惟一的區別在於它使用大括號{};input

>>> se = {n**2 for n in [1,-1,2,3]} >>> print(se) {1, 4, 9}

 

3、生成器表達式

  說明:生成器表達式能夠建立一個生成器;

>>> gener = (i for i in range(5)) >>> print(gener) <generator object <genexpr> at 0x7f9b7123d8b8>
>>> print(gener.__next__()) 0 >>> print(gener.__next__()) 1
>>> print(gener.__next__()) 2
#能夠看出由生成器表達式生成了一個gener生成器;

  與生成器相關的兩道面試題:

#面試題1:
def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) g2=(i for i in g1) print(list(g1)) print(list(g2)) #說出最後的打印結果; #分析:demo生成器函數生成一個g生成器;而後由生成器表達式生成了g1和g2; #當打印print(list(g1))時,程序先去運算g1,g1是由(i for i in g)生成器表達式建立出來的,因此要再先計算(i for i in g),這個表達式又會去找g生成器,因此g1就是0123,此時已經將g的生成器裏的值運算完畢了,裏面沒有值了; #當打印g2時,g2會去找g1,g1去找g,由於g生成器已經沒有值了,因此g2會獲得空;
--------------------- 輸出結果-----------------------------
>>> def demo(): ... for i in range(4): ... yield i ... >>> g=demo() >>> 
>>> g1=(i for i in g) >>> g2=(i for i in g1) >>> 
>>> print(list(g1)) [0, 1, 2, 3] >>> print(list(g2)) []
面試題1
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) print(list(g)) ---------------------- 輸出結果 ----------------------------------
>>> def add(n,i): ... return n+i ... >>> def test(): ... for i in range(4): ... yield i ... >>> g=test() >>> for n in [1,10]: ... g=(add(n,i) for i in g) ... >>> print(list(g)) [20, 21, 22, 23] #此例子咱們下面畫圖解
面試2

  面試2例題圖解:

    

  那麼,咱們在對面試2題進行升級:

#說出程序執行過程當中的打印輸出結果以及最後的打印結果
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10,5,8]: g=(add(n,i) for i in g) print(g.__next__()) print(list(g)) ------------------ 打印輸出 --------------------------------
1
21
17
35 [] #一樣,咱們在下面進行圖解:

  面試2升級圖解:

 

 

4、lambda表達式(又稱匿名函數)

1.說明:

  lambda函數是一種快速定義單行你的最小函數,也是一種匿名函數,是從Lisp借用來的,能夠用在任何須要函數的地方;須要注意的是lambda只能寫一行;不能多行;

2.格式:

  lambda 參數:返回值

3.實例:

#1.咱們用普通函數計算一下兩個數的和;
>>> def sum(x,y): ... return x+y ... >>> sum(5,6) 11


#2.咱們使用lambda函數進行計算;
>>> sum1 = lambda x,y:x+y >>> sum1(5,6) 11

  能夠看到,兩個函數獲得的結果同樣,而對於實現簡單功能的函數來講,使用lambda函數來定義更加精簡靈活,還能夠直接把函數賦值給一個變量,用變量名來表示函數名。;

  其實lambda函數在不少時候都是不須要賦值給一個變量的。

  注意事項:  lambda 函數能夠接收任意多個參數 (包括可選參數) 而且返回單個表達式的值。  lambda 函數不能包含命令,包含的表達式不能超過一個;

 4.查看函數名稱:

  不少時候,在咱們進行調用函數時不必定就是咱們本身寫的函數,多是別人寫的,那麼咱們如何查看被調用的函數是什麼函數呢?

  __name__:這個方法是用來查看函數名的,好比:

>>> def zjk(): ... pass ... >>> a = lambda x:x >>> print(zjk.__name__) zjk >>> print(a.__name__) <lambda>

#注意,凡是由匿名函數定義的函數。名稱都是匿名函數;
lambda()函數名

5.關於lambda的多個返回值留下的「坑」:

  下面看一個例子,請說出打印結果:

>>> zjk = lambda x,y:x,y >>> print(zjk(10,20)) #請問打印結果是什麼? # #可能不少同窗立馬回答,這不就是lambda表達式返回多個值嗎,打印結果固然是10和20了, #那麼咱們來看一下實際狀況是什麼
Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'y' is not defined #what?報錯了,提示y沒有定義,神馬狀況,這怎麼和普通的函數不同啊,普通的函數返回多個值的時候不是將這多個值用逗號隔開,而後組成元組返回嗎,爲何在匿名函數這裏就報錯了呢? #解釋: #緣由是這樣的,咱們拆分來看一下,zjk = lambda x,y:x , y #也就是說等號右邊在系統的定義中,是由兩部分元素組成的,一個是匿名函數,一個是y,系統不會認爲這裏的x,y是匿名函數的返回值,而是把lambda和y組成成元組傳遞給zjk,因爲y沒有定義,因此就報錯了; #那麼,我想要x,y是一體的該怎麼辦呢? #咱們能夠用元組或列表將其添加,組成一個總體,這樣的話就成爲一個總體了;具體以下:
>>> zjk = lambda x,y:(x,y) >>> print(zjk(10,20)) (10, 20)
關於lambda函數在返回多值時可能會迷惑的地方

6.lambda函數例子:

#用戶隨意輸入數字,求最大值;
>>> ma = lambda *args,**kwargs:max(*args,*kwargs.values()) >>> print(ma(1,3,4,2,*[7,8,9],z=444,**{"k":555})) 555
>>> print(ma(1,3,4,2,*[7,8,9],z=444)) 444
>>> print(ma(1,3,4,2,*[7,8,9])) 9
使用lambda求最大值
相關文章
相關標籤/搜索