日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础教程:迭代和解析

發(fā)布時間:2025/3/20 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础教程:迭代和解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python中的迭代是指按照元素的順序逐個調(diào)用的過程,迭代概念包括:迭代協(xié)議、可迭代對象和迭代器三個概念。

迭代協(xié)議是指有__next__()函數(shù)的對象會前進(jìn)到下一個結(jié)果,而到達(dá)系列的末尾時,則會引發(fā)StopIteration異常。為了支持迭代協(xié)議,Python內(nèi)置了兩個函數(shù):iter()和next()函數(shù)。iter()從可迭代對象中獲得一個迭代器,迭代器含有next()函數(shù)。next()函數(shù)的作用就是調(diào)用對象的__next__()函數(shù),從而遞進(jìn)進(jìn)到下一項。

在Python中,任何支持迭代協(xié)議的對象都是可迭代的。如果對象是序列類型,或者在迭代工具中一次產(chǎn)生一個結(jié)果,那么就是可迭代的,這就以為著,序列(字符串、元組和列表)是可迭代對象。

迭代器是Python中實現(xiàn)迭代協(xié)議的對象,具體指的是iter()返回的,支持next()函數(shù)的對象。

Python中的迭代工具會自動調(diào)用iter()和next()函數(shù)以實現(xiàn)迭代,迭代工具主要有:for循環(huán)、列表解析、in成員關(guān)系測試以及map內(nèi)置函數(shù)等。

一,手動迭代

列表不是自身的迭代器,對于這樣的可迭代對象,可以調(diào)用iter()函數(shù)來啟動迭代,調(diào)用next()函數(shù)遞進(jìn)到下一項:

>>> a=list(range(0,5)) >>> a is iter(a) False >>> a=iter(a) >>> next(a) 0

像for循環(huán)等迭代工具,會自動調(diào)用iter()和next()函數(shù),以實現(xiàn)序列的自動迭代:

>>> for i in range(0,5): print(i,end=' ') 0 1 2 3 4

二,生成器

生產(chǎn)器是一個延遲產(chǎn)生結(jié)果的工具,在需要的時候才產(chǎn)生結(jié)果,而不是立即產(chǎn)生結(jié)果。

1,生成器函數(shù)

Python提供了yield語句以實現(xiàn)生成器函數(shù),以實現(xiàn)在需要的時候才產(chǎn)生結(jié)果,而不是立即產(chǎn)生結(jié)果。Python的生產(chǎn)器函數(shù)是指:編寫為常規(guī)的def語句,但是使用yield語句,一次返回一個結(jié)果,在每個結(jié)果之間掛起和繼續(xù)的狀態(tài)。

生產(chǎn)器函數(shù)自動實現(xiàn)迭代協(xié)議,每次調(diào)用只返回一個值,下次調(diào)用時,會從其退出的地方繼續(xù)執(zhí)行。

生產(chǎn)器函數(shù)和常規(guī)函數(shù)的不同之處在于:生產(chǎn)器yield一個值,而不是return一個值。yield語句掛起該函數(shù),并向調(diào)用者發(fā)送一個值,但是,保留足夠的狀態(tài)以使得函數(shù)能夠從它離開的地方繼續(xù)執(zhí)行。當(dāng)繼續(xù)時,函數(shù)在上一個yield返回后繼續(xù)執(zhí)行。這使得生產(chǎn)器函數(shù)每次調(diào)用只返回一個值,窮盡調(diào)用會產(chǎn)生一系列的值。

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> def seq_int(n):for i in range(n):yield i**2>>> for i in seq_int(5):print(i,end =' ')0 1 4 9 16

生產(chǎn)器函數(shù)返回的對象就是迭代器,可以使用next()前進(jìn)到下一項:

>>> func=seq_int(5) >>> iter(func) is func True >>> next(func) 0

2,生產(chǎn)器表達(dá)式

另外一個實現(xiàn)生產(chǎn)器的對象是生產(chǎn)器表達(dá)式,從語法上講,生成器表達(dá)式是在小括號中的表達(dá)式。從執(zhí)行過程來講,生產(chǎn)器表達(dá)式不在內(nèi)存中構(gòu)建結(jié)果,而是返回一個生成器對象,這個對象支持迭代協(xié)議。

>>> a=(x**2 for x in range(0,5)) >>> a is iter(a) True

三,解析

解析分為列表解析,集合解析和字典解析。

  • 列表解析的格式是:[ f(x) for x in seq ],對應(yīng)的生成器表達(dá)式是:list( f(x) for x in seq )
  • 集合解析的格式是:{ f(x) for x in seq },對應(yīng)的生成器表達(dá)式是:set(f(x) for x in seq )
  • 字典解析的格式是:{key:value for (key, value) in zip(keys,values)},對應(yīng)的生成器表達(dá)式是:dict((x,f(x)) for x in items )

從語法上講,列表解析是在中括號中的表達(dá)式;從執(zhí)行過程來講,列表解析對序列中的每一個元素執(zhí)行一個操作;從執(zhí)行的結(jié)果來講,列表解析產(chǎn)生的一個新的列表對象。

由于列表解析產(chǎn)生的結(jié)果是一個列表對象,包含所有的序列項,不屬于延遲產(chǎn)生結(jié)果的工具。

>>> a=[x**2 for x in range(0,5)] >>> isinstance(a,list) True

四,內(nèi)置的迭代器函數(shù)

這一節(jié),總結(jié)Python 3.0中內(nèi)置的迭代器函數(shù),除了range()函數(shù)之外,其余的函數(shù)都會產(chǎn)生迭代器對象,延遲產(chǎn)生結(jié)果。

1,range 迭代對象

range返回一個可迭代對象,該迭代對象根據(jù)需要產(chǎn)生范圍中的數(shù)字,而不是在內(nèi)存中構(gòu)建一個列表。如果需要一個范圍列表的話,必須使用list( range(…))來強(qiáng)制返回一個列表。

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> r = range(0,5) >>> iter(r) is r False >>> list(r) [0, 1, 2, 3, 4] >>> r=iter(r) >>> next(r) 0

2,zip實現(xiàn)并行遍歷

zip()函數(shù)用于合并序列,按照序列中元素的位置,把序列的元素組合成元組,元組項的數(shù)量就是zip合并的序列的個數(shù)。當(dāng)序列的長度不同時,zip會以最短序列的長度為準(zhǔn)來截斷所得到的元組。

例如,zip把序列a和b合并為一個序列c,c的元素的元組(0,5),(1,6),(2,7),(3,8),(4,9)。

>>> a = range(0,5) >>> b = range(5,10) >>> c = zip(a,b) >>> iter(c) is c True >>> next(c) (0, 5) >>> list(c) [(1, 6), (2, 7), (3, 8), (4, 9)]

3,map對序列應(yīng)用函數(shù)

map()函數(shù)對一個序列的各個元素應(yīng)用函數(shù),返回函數(shù)調(diào)用的結(jié)果序列。

>>> m=map(ord,'abcd') >>> iter(m) is m True >>> list(m) [97, 98, 99, 100]

4,產(chǎn)生偏移和元素

enumerate是Python內(nèi)置的函數(shù),作用于每一個序列項,獲取每一個序列項偏移,并把偏移和序列項組合成元組(index, item)返回。原始序列的每個元素及其索引都能得到。

enumerate()函數(shù)返回一個迭代器對象,使用next()方法會返回下一個元素:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> t=enumerate('abcd') >>> iter(t) is t True >>> list(t) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

在for循環(huán)結(jié)構(gòu)中,每次迭代,for循環(huán)都會自動調(diào)用next()函數(shù)以返回下一個元組(index,item):

>>> [c * i for (i,c) in enumerate('abcd')] ['', 'b', 'cc', 'ddd']

5,filter迭代器

filter()函數(shù)對一個序列的各個元素應(yīng)用函數(shù),返回結(jié)果為True的元素。

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> f=filter(bool, ['a','','b',None]) >>> iter(f) is f True >>> list(f) ['a', 'b']

6,reduce() 函數(shù)

注意:reduce()函數(shù)并不是一個迭代器,它是functools模塊中的一個工具函數(shù)。

reduce()用于對序列的元素依次應(yīng)用函數(shù),并把函數(shù)調(diào)用的結(jié)果作為參數(shù)傳遞給函數(shù),最終返回函數(shù)調(diào)用的結(jié)果。

>>> from functools import reduce >>> reduce((lambda x,y:x+y),range(0,5)) 10

reduce()函數(shù)執(zhí)行流程等價于下面的代碼塊:

x=list(range(0,5)] res=x[0] for i in x[1:] :res+=i

總結(jié)

以上是生活随笔為你收集整理的Python基础教程:迭代和解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。