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 再次呼叫這個函式時,一切都將從頭建立。...