python高級(jí)特性

1.切片
切片可以取list、tuple、string的元素
python語(yǔ)言中把字符串看做一個(gè)tuple,因此可以通過(guò)for in 循環(huán)取出所有的字符,同樣可以通過(guò)切片取出一部分字符
list/tuple/string變量名[a:b:c]
a表示開(kāi)始取得索引位置,b表示結(jié)束的索引位置(不包括在內(nèi),因此可以比最后的索引大1,即swift中的endindex)
c表示間隔多少個(gè)取值,可以是負(fù)數(shù),倒著取值
a、b可以省略,表示取到終點(diǎn),c可以省略,默認(rèn)為1
被取得變量是什么類(lèi)型,取完還是什么類(lèi)型

2.如1中所述,for循環(huán)的對(duì)象可以是多種類(lèi)型,這些類(lèi)型叫做可迭代對(duì)象。
當(dāng)我們使用for循環(huán)時(shí),只要作用于一個(gè)可迭代對(duì)象,for循環(huán)就可以正常運(yùn)行
如何判斷一個(gè)對(duì)象是可迭代對(duì)象:通過(guò)collections模塊的Iterable類(lèi)型判斷
python內(nèi)置函數(shù)isinstance():判斷一個(gè)變量是否是已知的類(lèi)型,具體見(jiàn)內(nèi)置函數(shù)頁(yè)
其中沒(méi)有iterable(可迭代類(lèi)型),需要我們手動(dòng)導(dǎo)入。
from collections import Iterabl

然后用instance(a,iterable)來(lái)判斷是否是可迭代對(duì)象(可用if),然后打印:
for 變量(可多個(gè)) in 可迭代對(duì)象(此時(shí)會(huì)自動(dòng)給變量賦值) print(變量)

如果對(duì)象中沒(méi)有這么多變量,則出現(xiàn)錯(cuò)誤
ValueError: not enough values to unpack (expected m, got n)

對(duì)于dict需要說(shuō)明的是,其中對(duì)象只有一個(gè)即key,value需要寫(xiě)
for i in dict.values()
(這與swift不同,swift中把key與value作為兩個(gè)變量)
dict.values實(shí)際上也是一個(gè)迭代器 迭代的時(shí)候不可以少(),此類(lèi)函數(shù)如reversed都是如此,輸出需要()
輸出key與value用到dict.items()
否則提示:
TypeError: 'builtin_function_or_method' object is not iterable該函數(shù)或方法不可迭代

3.列表生成式(省略循環(huán)步驟生成一個(gè)list)

[要生成的式子關(guān)于x的函數(shù) for x in range(a, b)]

for循環(huán)后面還可以加上if判斷
還可以使用多層循環(huán),如:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

4.生成器generator(為了節(jié)省空間不計(jì)算只儲(chǔ)值)
在Python中,可以簡(jiǎn)單地把列表生成式改成generator,也可以通過(guò)函數(shù)實(shí)現(xiàn)復(fù)雜邏輯的generator。
(1)把列表生成式改成generator:把列表生成式[]變?yōu)?)即可得到
(2)定義函數(shù)時(shí)將print()改為yield

怎么打印出generator的每一個(gè)元素呢?
如果要一個(gè)一個(gè)打印出來(lái),可以通過(guò)next()函數(shù)獲得generator的下一個(gè)返回值直到出現(xiàn)StopIteration的錯(cuò)誤
或用循環(huán)打印

是generator和函數(shù)的執(zhí)行流程不一樣。函數(shù)是順序執(zhí)行,遇到return語(yǔ)句或者最后一行函數(shù)語(yǔ)句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí)從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行。如果用for、print()執(zhí)行,實(shí)際上也相當(dāng)于不斷地next()、遇到y(tǒng)ield返回、再次next()。(這點(diǎn)在迭代器中會(huì)繼續(xù)提到)
因此你會(huì)發(fā)現(xiàn),如果一直用next()、或者循環(huán)調(diào)用函數(shù),你無(wú)法得到結(jié)束語(yǔ)句return中的信息(從執(zhí)行順序理解)

a = (x for x in range(10)) next(a) 0 next(a) 1 next(a) 2 next(a) 3 next(a) 4

for m in a:\ print(m) 5 6 7 8 9

generator中元素用過(guò)后不可以再調(diào)用

如何得到return語(yǔ)句:如果想要拿到返回值,必須捕獲StopIteration錯(cuò)誤,返回值包含在StopIteration的value中:

except StopIteration as e: print('Generator return value:', e.value) break

在except里面用except Exception as e 接受異常,然后把這個(gè)e打印出來(lái)看

5.迭代器

可以直接作用于for循環(huán)的數(shù)據(jù)類(lèi)型有以下幾種:
(1)集合數(shù)據(jù)類(lèi)型,如list、tuple、dict、set、str等;
(2)generator,包括生成器和帶yield的generator function。
這些可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱(chēng)為可迭代對(duì)象:Iterable。

Python的for循環(huán)本質(zhì)上就是通過(guò)將對(duì)象變?yōu)橐粋€(gè)迭代器再不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的。

而可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱(chēng)為迭代器:Iterator。
可迭代對(duì)象不一定是迭代器。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象
from collections import Iterator isinstance((x for x in range(10)), Iterator) True isinstance([], Iterator) False isinstance({}, Iterator) False isinstance('abc', Iterator) False

生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):

isinstance(iter([]), Iterator) True isinstance(iter('abc'), Iterator) True

why:可以把迭代器這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。
Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流
所以list、tuple、string已知長(zhǎng)度,不能看做iterator

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、高級(jí)特性切片 對(duì)這種經(jīng)常取指定索引范圍的操作,用循環(huán)十分繁瑣,因此,Python提供了切片(Slice)操作符...
    zzj丶閱讀 599評(píng)論 0 1
  • 1、切片(slice)L[0:3]表示,從索引0開(kāi)始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3...
    bjchenli閱讀 290評(píng)論 0 0
  • 掌握了Python的數(shù)據(jù)類(lèi)型、語(yǔ)句和函數(shù),基本上就可以編寫(xiě)出很多有用的程序了。 比如構(gòu)造一個(gè)1, 3, 5, 7,...
    齊天大圣李圣杰閱讀 1,478評(píng)論 0 1
  • python高級(jí)特性 iteration迭代 對(duì)list,tuple的遍歷被稱(chēng)為迭代。對(duì)list實(shí)現(xiàn)類(lèi)似Java那...
    咚咚董dyh閱讀 708評(píng)論 0 0
  • 許久,一直在醞釀一個(gè)關(guān)于老師的題材,卻不知如何提筆…… 直到一日與朋友聊天,說(shuō)起老師這個(gè)職業(yè),朋友漏出一臉的不屑:...
    我是周太太閱讀 1,359評(píng)論 17 5

友情鏈接更多精彩內(nèi)容