真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是Python迭代器和生成器-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了瀘州免費(fèi)建站歡迎大家使用!

什么是Python迭代器和生成器?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

迭代器與可迭代對(duì)象

概念

迭代器:是訪問(wèn)數(shù)據(jù)集合內(nèi)元素的一種方式,一般用來(lái)遍歷數(shù)據(jù),但是他不能像列表一樣使用下標(biāo)來(lái)獲取數(shù)據(jù),也就是說(shuō)迭代器是不能返回的。

Iterator:迭代器對(duì)象,必須要實(shí)現(xiàn) next 魔法函數(shù)

Iterable:可迭代對(duì)象,繼承 Iterator,必須要實(shí)現(xiàn) iter 魔法函數(shù)

比如:

from collections import Iterable,Iterator
a = [1,2,3]
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))

返回結(jié)果

False
True

在 Pycharm 中使用 alt+b 進(jìn)去 list 的源碼中可以看到,在 list 類中有 iter 魔法函數(shù),也就是說(shuō)只要實(shí)現(xiàn)了 iter 魔法函數(shù),那么這個(gè)對(duì)象就是可迭代對(duì)象。

上面的例子中 a 是一個(gè)列表,也是一個(gè)可迭代對(duì)象,那么如何才能讓這個(gè) a 變成迭代器呢?使用 iter() 即可。

from collections import Iterable,Iterator
a = [1,2,3]
a = iter(a)
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))
print(next(a))
print('----')
for x in a:
    print(x)

返回結(jié)果

True
True
1
----
2
3

可以看到現(xiàn)在 a 是可迭代對(duì)象又是一個(gè)迭代器,說(shuō)明列表 a 中有 iter 方法,該方法返回的是迭代器,這個(gè)時(shí)候使用 next 就可以獲取 a 的下一個(gè)值,但是要記住迭代器中的數(shù)值只能被獲取一次。

梳理迭代器 (Iterator) 與可迭代對(duì)象 (Iterable) 的區(qū)別:

可迭代對(duì)象:繼承迭代器對(duì)象,可以用 for 循環(huán)(說(shuō)明實(shí)現(xiàn)了 iter 方法)

迭代器對(duì)象:可以用 next 獲取下一個(gè)值(說(shuō)明實(shí)現(xiàn)了 next 方法),但是每個(gè)值只能獲取一次,單純的迭代器沒(méi)有實(shí)現(xiàn) iter 魔法函數(shù),所以不能使用 for 循環(huán)

只要可以用作 for 循環(huán)的都是可迭代對(duì)象

只要可以用 next() 函數(shù)的都是迭代器對(duì)象

列表,字典,字符串是可迭代對(duì)象但是不是迭代器對(duì)象,如果想變成迭代器對(duì)象可以使用 iter() 進(jìn)行轉(zhuǎn)換

Python 的 for 循環(huán)本質(zhì)上是使用 next() 進(jìn)行不斷調(diào)用,for 循環(huán)的是可迭代對(duì)象,可迭代對(duì)象中有 iter 魔法函數(shù),可迭代對(duì)象繼承迭代器對(duì)象,迭代器對(duì)象中有 next 魔法函數(shù)

一般由可迭代對(duì)象變迭代器對(duì)象

大家在學(xué)python的時(shí)候肯定會(huì)遇到很多難題,以及對(duì)于新技術(shù)的追求,這里推薦一下我們的Python學(xué)習(xí)扣qun:784758214,這里是python學(xué)習(xí)者聚集地??!同時(shí),自己是一名高級(jí)python開(kāi)發(fā)工程師,從基礎(chǔ)的python腳本到web開(kāi)發(fā)、爬蟲(chóng)、django、數(shù)據(jù)挖掘等,零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)的資料都有整理。送給每一位python的小伙伴!每日分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié)

可迭代對(duì)象

可迭代對(duì)象每次使用 for 循環(huán)一個(gè)數(shù)組的時(shí)候,本質(zhì)上會(huì)從類中嘗試調(diào)用 iter 魔法函數(shù),如果類中有 iter 魔法函數(shù)的話,會(huì)優(yōu)先調(diào)用iter魔法函數(shù),當(dāng)然這里切記 iter 方法必須要返回一個(gè)可以迭代的對(duì)象,不然就會(huì)報(bào)錯(cuò)。

如果沒(méi)有定義 iter 魔法函數(shù)的話,會(huì)創(chuàng)建一個(gè)默認(rèn)的迭代器,該迭代器調(diào)用 getitem 魔法函數(shù),如果你沒(méi)有定義 iter 和 getitem 兩個(gè)魔法函數(shù)的話,該類型就不是可迭代對(duì)象,就會(huì)報(bào)錯(cuò)。

比如:

class s:
    def __init__(self,x):
        self.x = x
    def __iter__(self):
        return iter(self.x)
        # 這里必須要返回一個(gè)可以迭代的對(duì)象
    # def __getitem__(self, item):
    #     return self.x[item]
# iter和getitem其中必須要實(shí)現(xiàn)一個(gè)
a = s('123')
# 這里的a就是可迭代對(duì)象
# 這里不能調(diào)用next(a)方法,因?yàn)闆](méi)有定義
for x in a:
    print(x)

這里把注釋符去掉返回結(jié)果也是一樣的,返回結(jié)果:

迭代器對(duì)象

一開(kāi)始提起,iter 搭配 Iterable 做可迭代對(duì)象,next 搭配 Iterator 做迭代器。next() 接受一個(gè)迭代器對(duì)象,作用是獲取迭代器對(duì)象的下一個(gè)值,迭代器是用來(lái)做迭代的,只會(huì)在需要的時(shí)候產(chǎn)生數(shù)據(jù)。

和可迭代對(duì)象不同,可迭代對(duì)象一開(kāi)始是把所有的列表放在一個(gè)變量中,然后用 getitem 方法不斷的返回?cái)?shù)值,getitem 中的 item 就是索引值。

但是 next 方法并沒(méi)有索引值,所以需要自己維護(hù)一個(gè)索引值,方便獲取下一個(gè)變量的位置。

class s:
    def __init__(self,x):
        self.x = x
        # 獲取傳入的對(duì)象
        self.index = 0
        # 維護(hù)索引值
    def __next__(self):
        try:
            result = self.x[self.index]
            # 獲取傳入對(duì)象的值
        except IndexError:
            # 如果索引值錯(cuò)誤
            raise StopIteration
        # 拋出停止迭代
        self.index += 1
        # 索引值+1,用來(lái)獲取傳入對(duì)象的下一個(gè)值
        return result
        # 返回傳入對(duì)象的值

a = s([1,2,3])
print(next(a))
print('----------')
for x in a:
# 類中并沒(méi)有iter或者getitem魔法函數(shù),不能用for循環(huán),會(huì)報(bào)錯(cuò)
    print(x)

返回結(jié)果

Traceback (most recent call last):
1
----------
  File "C:/CODE/Python進(jìn)階知識(shí)/迭代協(xié)議/迭代器.py", line 34, in 
    for x in a:
TypeError: 's' object is not iterable

上面一個(gè)就是完整的迭代器對(duì)象,他是根據(jù)自身的索引值來(lái)獲取傳入對(duì)象的下一個(gè)值,并不是像可迭代對(duì)象直接把傳入對(duì)象讀取到內(nèi)存中,所以對(duì)于一些很大的文件讀取的時(shí)候,可以一行一行的讀取內(nèi)容,而不是把文件的所有內(nèi)容讀取到內(nèi)存中。

生成器

生成器:函數(shù)中只要有 yield,這個(gè)函數(shù)就會(huì)變成生成器。每次運(yùn)行到 yield 的時(shí)候,函數(shù)會(huì)暫停,并且保存當(dāng)前的運(yùn)行狀態(tài),返回返回當(dāng)前的數(shù)值,并在下一次執(zhí)行 next 方法的時(shí)候,又從當(dāng)前位置繼續(xù)往下走。

簡(jiǎn)單用法

舉個(gè)例子:

def gen():
    yield 1
    # 返回一個(gè)對(duì)象,這個(gè)對(duì)象的值是1
def ret():
    return 1
    # 返回一個(gè)數(shù)字1
g = gen()
r = ret()
print(g,r)
print(next(g))

返回結(jié)果

 1
1

看完上述內(nèi)容,你們掌握什么是Python迭代器和生成器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!


標(biāo)題名稱:什么是Python迭代器和生成器-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/diohch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部