#只要物件本身有__iter__方法,那它就是可迭代的,只要執行這個方法,它的返回值就是迭代器,這個返回值就有個__next__方法.依賴下標迴圈的方法
l = ['
a','
b','
c','
d','e'
]i =0
while i print
(l[i])
i+=1
#for迴圈形式迭代
for i in
range(len(l)):
print(l[i])
dic =檢視可迭代物件i = __iter__
(dic)
print(i.__next__
())print(i.__next__
())print(i.__next__
())print(i.__next__
())#
當取的值多於元素本身會丟擲stopiteration錯誤,也可以理解為終止訊號
#為避免爆出異常可以這麼做
i =iter(d)
while
true:
try:
print(print
(next(i))
excet stopiteration:
break
#python裡面的for迴圈的方式不是按照下標而是將你傳入的物件變成迭代器,去__next__
#在檔案中,檔案控制代碼即時迭代器,也是可迭代物件
#為什麼要用迭代器
1.如果像字典,集合,這種無序的又或者檔案這種沒有索引的,你沒有辦法像下標那樣的取值
2.迭代器的取值方式是統一的,大家都是按照next的方式取值,迭代器的方式取值佔記憶體比列表這種索引取值更節省記憶體,他next()一下才會生成乙個值屬於惰性計算。#缺點
1.迭代器無法統計有多長,只有到最後一步才能知道多長。指定取值的話,必須一步步的取值下去才能取到。所以使用不靈活
2.迭代器是一次性取值,不能回頭。
from collections importiterable,iterator
s = "
hello
"l = [1,2,3]
t = (1,2,3)
d =
set1 =
f = open('
a.txt')
s.__iter__
()l.
__iter__
()t.
__iter__
()d.
__iter__
()set1.
__iter__
()f.
__iter__
()f.
__iter__
()print(isinstance(s,iterable))
from collections importiterator
deftest():
print('
first')
yield 1
yield 2
yield 3g=test()
print(g) #
g是乙個函式
print(isinstance(g,iterator)) #
判斷型別
(next(g))
(next(g))
for i in
g:
(i)#
生成流程案例
deftest(n):
print('
start')
while n>0:
yield
n n -= 1
print('
done')
g = test(6)
for i in
g:
(i)#
生成器場景案例,模仿tail -f /tmp/a.txt | grep 'error'
案例1:作用監控檔案改變,類似linux下的tail命令。
import
time
deftail(file_path):
with open(file_path,'r
') as f:
f.seek(0,2) #
移動到最後一行
while
true:
line =f.readline() 讀取當前游標所在位置行。
ifnot
line:
time.sleep(0.3)
print('
>>>
') #
這裡列印表示他在一直監控這個檔案,程式不是卡死
continue
else
:
#print(line,end="")
yield
line
g = tail('
a.txt')
#print(g.next())
for line in
g:
(line)
import
time
#定義階段:定義倆生成器函式
deftail(file_path):
with open(file_path,'r
') as f:
f.seek(0,2)
while
true:
line=f.readline()
ifnot
line:
time.sleep(0.3)
#print('====>')
continue
else
:
#print(line,end='')
yield
line
defgrep(pattern,lines):
for line in
lines:
if pattern in
line:
yield
line
#呼叫階段:得到倆生成器物件
g1=tail('
/tmp/a.txt')
g2=grep('
error
',g1)
#next觸發執行g2生成器函式
for i in
g2:
print(i)
defeater(name)
print('
%s start to eat food
' %(name)
while
true:
food = yield
print('
%s get %s ,to start eat
'%(name,food)
print('
done')
name_yield = eater('
alex')
next(e)
name_yield.send('包子
')name_yield.send('燒麥
')name_yield.send('餃子
')defeater(name)
print('
%s start to eat food
' %(name)
food_list =
while
true:
food = yield
food_list
print('
%s get %s ,to start eat
'%(name,food)
print('
done')
name_yield = eater('
alex')
next(e)
name_yield.send('包子
')name_yield.send('燒麥
')name_yield.send('餃子
')
python迭代器生成器協程
迭代器有兩個基本的方法 iter 和next 把乙個類作為乙個迭代器使用需要在類中實現兩個方法iter 與next stopiteration 異常用於標識迭代的完成 class mylist object def init self self.items def iter self iter my...
Python 生成器,協程
生成器可以簡單有效的建立龐大的可迭代物件,而不需要在直接在記憶體中建立儲存整個序列 可以使用生成器推導式或者生成器函式來建立生成器 生成器函式返回資料時使用yield語句,而不是使用return def countdown n print counting down from d n while n...
python學習筆記 生成器,迭代器,協程定義
知識點 生成器就是通過封裝的演算法進行邊迴圈邊計算的機制,通過next 方法可以每次取乙個計算的值,也就是yield b 這個b是多少 x next generator 這個x就是取到的b x yield,那麼x 就是用於接收外部發來的值 generator.send 5 那麼x就是5 通過列表生成...