在Python中,代碼不是越多越好,而是越少越好。代碼不是越復(fù)雜越好,而是越簡單越好。請始終牢記,代碼越少,開發(fā)效率越高。
△切片
取一個(gè)list或tuple或字符串的指定索引范圍的部分元素,Python提供了切片(Slice)操作符。
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3,如果第一個(gè)索引是0,還可以省略;記住倒數(shù)第一個(gè)元素的索引是-1。
△迭代
如果給定一個(gè)list或tuple,我們可以通過for循環(huán)來遍歷這個(gè)list或tuple,這種遍歷我們稱為迭代(Iteration)。
在Python中,迭代是通過for...in來完成的。只要作用于一個(gè)可迭代對象,for循環(huán)就可以正常運(yùn)行。
如何判斷一個(gè)對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
1>>>fromcollectionsimportIterable
2>>>isinstance('abc',Iterable)#str是否可迭代
3True
4>>>isinstance([1,2,3],Iterable)#list是否可迭代
5True
6>>>isinstance(123,Iterable)#整數(shù)是否可迭代
7False
Python內(nèi)置的enumerate函數(shù)可以把一個(gè)list變成索引-元素對:
1>>>fori,valueinenumerate(['A','B','C']):
2...print(i,value)
3...
40A
51B
62C
△列表生成式
列表生成式即ListComprehensions,是Python內(nèi)置的非常簡單卻強(qiáng)大的可以用來創(chuàng)建list的生成式。
寫列表生成式時(shí),把要生成的元素x*x放到前面,后面跟for循環(huán),for循環(huán)后面還可以加上if判斷:
1
2>>>[x*xforxinrange(1,11)ifx%2==0]
[4,16,36,64,100]
△生成器
在Python中,這種列表元素可以按照某種算法推算出來,一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。
要?jiǎng)?chuàng)建一個(gè)generator,有很多種方法。
第一種方法很簡單,只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator:
1>>>L=[x*xforxinrange(10)]#列表生成式
2>>>L
3[0,1,4,9,16,25,36,49,64,81]
4>>>g=(x*xforxinrange(10))#生成器
5>>>g
6at0x1022ef630>
打印出generator的每一個(gè)元素,正確的方法是使用for循環(huán),因?yàn)間enerator也是可迭代對象:
1>>>g=(x*xforxinrange(10))
2>>>forning:
3...print(n)
4...
50
61
74
89
916
1025
1136
1249
1364
1481
定義generator的另一種方法。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator。
generator和函數(shù)的執(zhí)行流程不一樣。函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。但是用for循環(huán)調(diào)用generator時(shí),發(fā)現(xiàn)拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯(cuò)誤,返回值包含在StopIteration的value中:
小結(jié)
generator是非常強(qiáng)大的工具,在Python中,可以簡單地把列表生成式改成generator,也可以通過函數(shù)實(shí)現(xiàn)復(fù)雜邏輯的generator。
要理解generator的工作原理,它是在for循環(huán)的過程中不斷計(jì)算出下一個(gè)元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。對于函數(shù)改成的generator來說,遇到return語句或者執(zhí)行到函數(shù)體最后一行語句,就是結(jié)束generator的指令,for循環(huán)隨之結(jié)束。
請注意區(qū)分普通函數(shù)和generator函數(shù),普通函數(shù)調(diào)用直接返回結(jié)果,generator函數(shù)的“調(diào)用”實(shí)際返回一個(gè)generator對象。
以上內(nèi)容為大家介紹了python高級特性,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。