python學習(十) 迭代器 生成器

2021-08-27 16:19:46 字數 3410 閱讀 3202

1、for迴圈:

(1)__iter__方法轉換成可迭代物件

#基於for迴圈,我們可以完全不再依賴索引去取值了

dic=

for k in dic:

print(dic[k])

#for迴圈的工作原理

#1:執行in後物件的dic.__iter__()方法,得到乙個迭代器物件iter_dic

#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體**

#3: 重複過程2,直到捕捉到異常stopiteration,結束迴圈

num = [1,2,10,5,3,7]

for i in num:

print(i)

# i_num=num.__iter__()

# i_num.__next__()

2、生成器(自身有__next__()方法)

#只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**

def func():

print('====>first')

yield 1

print('====>second')

yield 2

print('====>third')

yield 3

print('====>end')

g=func()

print(g) #

(1)三元表示式

name='a'

name='l'

res='ss' if name == 'alex' else '哥' # 先判斷,t前,f後

print(res)

(2)列表解析

egg_list=

for i in range(10):

print(egg_list)

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

l1=['雞%s' %i for i in range(10) if i > 5 ]

#沒有四元表示式

laomuji=('雞蛋%s' %i for i in range(10)) #生成器表示式

# 比列表解析更省記憶體

l=[1,2,3,34]

map(func,l)

(3)生成器函式

# 買包子(全部做完再買)

def product_baozi():

ret=

for i in range(100):

return ret

baozi_list=product_baozi()

print(baozi_list)

#生成器函式(做乙個買乙個)

def product_baozi():

for i in range(100):

print('正在生產包子')

yield '一屜包子%s' %i #i=1 # yield可以儲存函式狀態

print('開始賣包子')

pro_g=product_baozi()

baozi1=pro_g.__next__()

#加**

# baozi2=pro_g.__next__()

# 母雞下蛋

def xiadan():

ret=

for i in range(100):

return ret

print(xiadan())

#缺點1:佔空間大

#缺點2:效率低

# 下乙個吃乙個

def xiadan():

for i in range(1000):

yield '雞蛋%s' %i

alex = xiadan()

print(alex.__next__())

print(alex.__next__())

print(alex.__next__())

(4)生成器特性

# 可將函式應用於for迴圈

# 延遲計算

def xiadan():

for i in range(1000):

yield '雞蛋%s' %i

alex = xiadan()

for jd in alex:

print(jd)

(5)send

#yield 3相當於return 控制的是函式的返回值

#x=yield的另外乙個特性,接受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('函式停留在first那個位置,我就是給first賦值的')

print(res)

(6)消費者生產者模型

import time

def producer():

ret=

for i in range(100):

time.sleep(0.1)

return ret

def consumer(res):

for index,baozi in enumerate(res):

time.sleep(0.1)

print('第%s個人,吃了%s' %(index,baozi))

res=producer()

consumer(res)

def consumer(name):

print('我是[%s],我準備開始吃包子了' %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()

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...