語法:爲真時的結果 if 斷定條件 else 爲假時的結果python
實例:面試
>>> a = "zjk" >>> print("666") if a == "zjk" else print("888") 666
說明:推導式又稱解析式,是python的一種獨有特性。推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體,共有三種推導;ide
列表推導式、字典推導式、集合推導式;函數
說明:使用 [ ] 生成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]
說明:字典推導和列表推導的使用方法是相似的,只不中括號該改爲大括號;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'}
說明:它們跟列表推導式也是相似的。 惟一的區別在於它使用大括號{};input
>>> se = {n**2 for n in [1,-1,2,3]} >>> print(se) {1, 4, 9}
說明:生成器表達式能夠建立一個生成器;
>>> 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)) []
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題進行升級:
#說出程序執行過程當中的打印輸出結果以及最後的打印結果 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升級圖解:
lambda函數是一種快速定義單行你的最小函數,也是一種匿名函數,是從Lisp借用來的,能夠用在任何須要函數的地方;須要注意的是lambda只能寫一行;不能多行;
lambda 參數:返回值
#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 函數不能包含命令,包含的表達式不能超過一個;
不少時候,在咱們進行調用函數時不必定就是咱們本身寫的函數,多是別人寫的,那麼咱們如何查看被調用的函數是什麼函數呢?
__name__:這個方法是用來查看函數名的,好比:
>>> def zjk(): ... pass ... >>> a = lambda x:x >>> print(zjk.__name__) zjk >>> print(a.__name__) <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)
#用戶隨意輸入數字,求最大值; >>> 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