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

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

Python中迭代器和生成器的介紹

迭代器

一、迭代的概念

迭代器即迭代的工具,那什么是迭代呢?
迭代是一個(gè)重復(fù)的過程,每次重復(fù)即一次迭代,并且每次迭代的結(jié)果都是下一次迭代的初始值

十年的麻陽網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整麻陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“麻陽網(wǎng)站設(shè)計(jì)”,“麻陽網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

優(yōu)點(diǎn):

  • 提供一種統(tǒng)一的、不依賴于索引的迭代方式
  • 惰性計(jì)算,節(jié)省內(nèi)存
    缺點(diǎn):
  • 無法獲取長度(只有在next完畢才知道到底有幾個(gè)值)
  • 一次性的,只能往后走,不能往前退

1、為何要有迭代器?

對于序列類型:字符串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對于字典、集合、文件等類型是沒有索引的,若還想取出其內(nèi)部包含的元素,則必須找出一種不依賴于索引的迭代方式,這就是迭代器

2、什么是可迭代對象?

可迭代對象指的是內(nèi)置有iter方法的對象,即obj.iter,如下

'hello'.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{'a':1}.__iter__
{'a','b'}.__iter__
open('a.txt').__iter__

3、什么是迭代器對象?

可迭代對象執(zhí)行obj.iter()得到的結(jié)果就是迭代器對象
而迭代器對象指的是即內(nèi)置有iter又內(nèi)置有next方法的對象

文件類型是迭代器對象
open('a.txt').__iter__()
open('a.txt').__next__()

二、迭代器對象的使用

dic={'a':1,'b':2,'c':3}
iter_dic=dic.__iter__() #得到迭代器對象,迭代器對象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
iter_dic.__iter__() is iter_dic #True

print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
# print(iter_dic.__next__()) #拋出異常StopIteration,或者說結(jié)束標(biāo)志

#有了迭代器,我們就可以不依賴索引迭代取值了
iter_dic=dic.__iter__()
while 1:
    try:
        k=next(iter_dic)
        print(dic[k])
    except StopIteration:
        break

三、for循環(huán)

#基于for循環(huán),我們可以完全不再依賴索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

#for循環(huán)的工作原理
#1:執(zhí)行in后對象的dic.__iter__()方法,得到一個(gè)迭代器對象iter_dic
#2: 執(zhí)行next(iter_dic),將得到的值賦值給k,然后執(zhí)行循環(huán)體代碼
#3: 重復(fù)過程2,直到捕捉到異常StopIteration,結(jié)束循環(huán)

生成器

一、什么是生成器

#只要函數(shù)內(nèi)部包含有yield關(guān)鍵字,那么函數(shù)名()的到的結(jié)果就是生成器,并且不會執(zhí)行函數(shù)內(nèi)部代碼

def func():
    print('====>first')
    yield 1
    print('====>second')
    yield 2
    print('====>third')
    yield 3
    print('====>end')

g=func()
print(g) # 

yield總結(jié)

1、把函數(shù)做成迭代器
2、對比return,可以返回多次值,可以掛起/保存函數(shù)的運(yùn)行狀態(tài)

二、三元表達(dá)式

name=input('姓名>>: ')
res='SB' if name == 'alex' else 'NB'
print(res)

三、列表解析

優(yōu)點(diǎn):方便,改變了編程習(xí)慣,可稱之為聲明式編程

egg_list=[]
for i in range(10):
    egg_list.append('雞蛋%s' %i)

egg_list=['雞蛋%s' %i for i in range(10)]

四、生成器表達(dá)式

#1、把列表推導(dǎo)式的[]換成()就是生成器表達(dá)式

#2、示例:生一筐雞蛋變成給你一只老母雞,用的時(shí)候就下蛋,這也是生成器的特性
>>> chicken=('雞蛋%s' %i for i in range(5))
>>> chicken
 at 0x10143f200>
>>> next(chicken)
'雞蛋0'
>>> list(chicken) #因chicken可迭代,因而可以轉(zhuǎn)成列表
['雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4',]

#3、優(yōu)點(diǎn):省內(nèi)存,一次只產(chǎn)生一個(gè)值在內(nèi)存中

五、生成器函數(shù)

def xd():
    for i in range(100):
        yield '雞蛋%s' %i

s=xd()
print(s.__next__())
print(s.__next__())

六、生產(chǎn)者消費(fèi)者模型

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傳過來的值,賦值給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 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()


網(wǎng)頁題目:Python中迭代器和生成器的介紹
文章URL:http://weahome.cn/article/jgjidd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部