最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python迭代器協(xié)議及for循環(huán)工作機(jī)制詳解

 更新時(shí)間:2020年07月14日 10:23:02   作者:Yangyl_00  
這篇文章主要介紹了Python迭代器協(xié)議及for循環(huán)工作機(jī)制詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、遞歸與迭代

二、什么是迭代器協(xié)議

1、迭代器協(xié)議是指:對(duì)象必須提供一個(gè)next方法,執(zhí)行該方法要么返回迭代中的下一項(xiàng),要么就引起一個(gè)stopiteration異常,已終止迭代(只能往后走不能往前退)

2、可迭代對(duì)象:實(shí)現(xiàn)了迭代器協(xié)議的對(duì)象(如何實(shí)現(xiàn):對(duì)象內(nèi)部定義一個(gè)__iter__()方法)

3、協(xié)議是一種約定,可迭代對(duì)象實(shí)現(xiàn)了迭代器協(xié)議,python的內(nèi)部工具(如for循環(huán),sum,min,max函數(shù)等)使用迭代器協(xié)議訪問(wèn)對(duì)象。

三、python中強(qiáng)大的for循環(huán)機(jī)制

for循環(huán)的本質(zhì):循環(huán)所有對(duì)象,全部是使用迭代器協(xié)議

解釋:

有時(shí)會(huì)想,for循環(huán)的本質(zhì)就是遵循迭代器協(xié)議訪問(wèn)對(duì)象,那么for循環(huán)的對(duì)象肯定都是迭代器了啊,沒錯(cuò),那既然這樣,for循環(huán)可以遍歷(字符串,,列表,字典,集合,文件對(duì)象),那這些類型的數(shù)據(jù)肯定都是可迭代對(duì)象?。康?,為什么定義一個(gè)列表l=[1,2,3,4]沒有next()方法。

(字符串,列表,元組,字典,集合,文件對(duì)象)這些都不是可迭代對(duì)象,只不過(guò)在for循環(huán)中,調(diào)用了他們內(nèi)部的__iter__方法,把他們變成了可迭代對(duì)象

然后for循環(huán)調(diào)用可迭代對(duì)象的__next__方法去取值,而且for循環(huán)會(huì)捕捉stoplteration異常,已終止迭代

l=[1,2,3,4,5]
#下標(biāo)訪問(wèn)方式
print(l[0])
print(l[7]) #超出訪問(wèn)會(huì)報(bào)IndexError: list index out of range

#遵循迭代器協(xié)議的方式
diedai=l.__iter__()
print(diedai.__next__())
print(diedai.__next__())
print(diedai.__next__())
print(diedai.__next__())
print(diedai.__next__())
print(diedai.__next__()) #超出邊界會(huì)報(bào)StopIteration

#for循環(huán)訪問(wèn)方式:
#for循環(huán)本質(zhì)就是遵循迭代器協(xié)議的訪問(wèn)方式,先調(diào)用diedai.__iter__()方法,或者直接diedai=iter(l),然后依次執(zhí)行diedai.next(),直到for循環(huán)捕捉到StopIteration終止循環(huán)
#for循環(huán)所有對(duì)象的本質(zhì)都是一樣的道理

for i in l:     #diedai=l.__iter__()
  print(l[i])   #i=diedai.next()

#使用while模擬for循環(huán)做的事情
diedai_l=l.__iter__()
while True:
  try:
    print(diedai_l.__next__())
  except StopIteration:
    print("迭代完畢,終止循環(huán)")
    break

四、生成器初探

什么是生成器?

可以理解為一種數(shù)據(jù)類型,這種數(shù)據(jù)類型自動(dòng)實(shí)現(xiàn)了迭代器協(xié)議(其他的數(shù)據(jù)類型需要調(diào)用自己內(nèi)置的__iter__方法),所以生成器就是可迭代對(duì)象

生成器分類及在python中的表現(xiàn)形式:(python有兩種不同的方法提供生成器)

1、生成器函數(shù):常規(guī)函數(shù)定義,但是,使用yield語(yǔ)句而不是return語(yǔ)句返回結(jié)果。yield語(yǔ)句一次返回一個(gè)結(jié)果,在沒個(gè)結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次用它離開的地方繼續(xù)執(zhí)行

2、生成器表達(dá)式:類似于列表推導(dǎo),但是,生成器返回按需產(chǎn)生結(jié)果的一個(gè)對(duì)象,而不是一次構(gòu)建一個(gè)結(jié)果列表

為何使用生成器以及生產(chǎn)器的優(yōu)點(diǎn):

python使用生成器對(duì)延遲操作提供了支持,所謂延遲操作,是指在需要的時(shí)候才產(chǎn)生結(jié)果,而不是立即產(chǎn)生結(jié)果,這也是生產(chǎn)器的重要好處

import time
# def producer():
#   ret=[]
#   for i in range(100):
#     time.sleep(0.1)
#     ret.append('包子%s' %i)
#   return ret
#
# def consumer(res):
#   for index,baozi in enumerate(res):
#     time.sleep(0.1)
#     print('第%s個(gè)人,吃了%s' %(index,baozi))
#
# res=producer()
# consumer(res)




#yield 3相當(dāng)于return 控制的是函數(shù)的返回值
#x=yield的另外一個(gè)特性,接受send傳過(guò)來(lái)的值,賦值給x
# def test():
#   print('開始啦')
#   firt=yield #return 1  first=None
#   print('第一次',firt)
#   yield 2
#   print('第二次')
#
# t=test()
# res=t.__next__() #next(t)
# print(res)
# # t.__next__()
# # res=t.send(None)
# res=t.send('函數(shù)停留在first那個(gè)位置,我就是給first賦值的')
# print(res)





# def producer():
#   ret=[]
#   for i in range(100):
#     time.sleep(0.1)
#     ret.append('包子%s' %i)
#   return ret

def consumer(name):
  print('我是[%s],我準(zhǔn)備開始吃包子了' %name)
  while True:
    baozi=yield
    time.sleep(1)
    print('%s 很開心的把【%s】吃掉了' %(name,baozi))

def producer():
  c1=consumer('wupeiqi')
  c2=consumer('yuanhao_SB')
  c1.__next__()
  c2.__next__()
  for i in range(10):
    time.sleep(1)
    c1.send('包子 %s' %i)
    c2.send('包子 %s' %i)
producer()

生產(chǎn)器小結(jié)

1、生成器是可迭代對(duì)象

2、實(shí)現(xiàn)了延遲計(jì)算、省內(nèi)存

3、生成器本質(zhì)和其他的數(shù)據(jù)類型一樣,都是實(shí)現(xiàn)了迭代器協(xié)議,只不過(guò)生成器附加了一個(gè)延遲計(jì)算省內(nèi)存的好處,其余的可迭代對(duì)象可沒有這點(diǎn)好處

五、生成器表達(dá)式和列表解析

#1、三元表達(dá)式
name="alex"
name="yangyl"
res="1" if name=="yangyl" else "2"
print(res)

egg_list=["雞蛋%s" %i for i in range(10) ]  #列表解析
print(egg_list)

#使用生產(chǎn)器獲取
egg_two=("雞蛋%s" %i for i in range(10))   #生產(chǎn)器表達(dá)式
print(egg_two)
print(egg_two.__next__())
print(next(egg_two))      #next()本質(zhì)就是調(diào)用__next__

總結(jié):

1、把列表解析中的[]換成() 得到的就是生成器表達(dá)式

2、列表解析與生成器表達(dá)式都是一種便利的編程方式,只不過(guò)生成器表達(dá)式更節(jié)省內(nèi)存

3、python不但使用迭代器協(xié)議,讓for循環(huán)變得更加通用。大部分內(nèi)置函數(shù),也是使用迭代器協(xié)議訪問(wèn)對(duì)象的。列如:sum函數(shù)是python的內(nèi)置函數(shù),該函數(shù)使用迭代器協(xié)議訪問(wèn)對(duì)象,而生成器實(shí)現(xiàn)了迭代器協(xié)議,所以我們可以直接這樣計(jì)算一系列值的和:

s1=sum(x ** 2 for x in range(4))
print(s1)

而不用多此一舉先構(gòu)造一個(gè)列表

s2=sum([x ** 2 for x in range(4)])
print(s2)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)高效的遺傳算法

    python實(shí)現(xiàn)高效的遺傳算法

    這篇文章主要介紹了python實(shí)現(xiàn)高效的遺傳算法。想了解算法的同學(xué),可以參考下
    2021-04-04
  • Series和DataFrame使用簡(jiǎn)單入門

    Series和DataFrame使用簡(jiǎn)單入門

    這篇文章主要介紹了Series和DataFrame使用簡(jiǎn)單入門,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python爬取之json、pickle與shelve庫(kù)的深入講解

    python爬取之json、pickle與shelve庫(kù)的深入講解

    這篇文章主要給大家介紹了關(guān)于python爬取之json、pickle與shelve庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python的Flask框架中配置多個(gè)子域名的方法講解

    Python的Flask框架中配置多個(gè)子域名的方法講解

    Fask中可以通過(guò)通配符子域的方式來(lái)部署多個(gè)子域名,這里我們就來(lái)作一個(gè)Python的Flask框架中配置多個(gè)子域名的方法講解,需要的朋友可以參考下
    2016-06-06
  • python訪問(wèn)mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法(2則示例)

    python訪問(wèn)mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法(2則示例)

    這篇文章主要介紹了python訪問(wèn)mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了兩種Python操作MySQL數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Python實(shí)現(xiàn)微信好友數(shù)據(jù)爬取及分析

    Python實(shí)現(xiàn)微信好友數(shù)據(jù)爬取及分析

    這篇文章會(huì)基于Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析,這里選擇的維度主要有:性別、頭像、簽名、位置,主要采用圖表和詞云兩種形式來(lái)呈現(xiàn)結(jié)果,其中,對(duì)文本類信息會(huì)采用詞頻分析和情感分析兩種方法,感興趣的小伙伴可以了解一下
    2021-12-12
  • 使用Python實(shí)現(xiàn)windows下的抓包與解析

    使用Python實(shí)現(xiàn)windows下的抓包與解析

    這篇文章主要介紹了使用Python實(shí)現(xiàn)windows下的抓包與解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python實(shí)現(xiàn)畫圖軟件功能方法詳解

    Python實(shí)現(xiàn)畫圖軟件功能方法詳解

    這篇文章主要介紹了 Python實(shí)現(xiàn)畫圖軟件功能方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python字典get()函數(shù)使用詳解

    Python字典get()函數(shù)使用詳解

    在Python中,字典對(duì)象有一個(gè)名為get()的方法,它可以用來(lái)獲取字典中鍵對(duì)應(yīng)的值,該方法接受一個(gè)鍵作為參數(shù),并返回該鍵對(duì)應(yīng)的值,如果鍵不存在于字典中,則返回None,本文就給大家介紹一下Python get()函數(shù)使用方法,需要的朋友可以參考下
    2023-07-07
  • python更加靈活的Logger日志詳解

    python更加靈活的Logger日志詳解

    這篇文章主要介紹了python Logger日志,用到的4個(gè)類,針對(duì)每個(gè)知識(shí)點(diǎn)給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

谢通门县| 宣威市| 久治县| 班戈县| 阿巴嘎旗| 桐乡市| 梅州市| 共和县| 塔河县| 海安县| 调兵山市| 渑池县| 咸宁市| 广丰县| 临澧县| 上饶市| 滁州市| 临泉县| 元江| 扎囊县| 云南省| 万源市| 苍山县| 鹤岗市| 石河子市| 元江| 双峰县| 杭锦后旗| 华阴市| 祁阳县| 河东区| 西畴县| 焦作市| 荃湾区| 阳新县| 南汇区| 陆河县| 五家渠市| 东山县| 都兰县| 土默特左旗|