資料 迭代器 生成器 協程

2022-08-28 14:33:25 字數 4155 閱讀 9675

#

依賴下標迴圈的方法

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])

只要物件本身有__iter__方法,那它就是可迭代的,只要執行這個方法,它的返回值就是迭代器,這個返回值就有個__next__方法.

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 import

iterable,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 import

iterator

deftest():

print('

first')

yield 1

yield 2

yield 3g=test()

print(g) #

g是乙個函式

print(isinstance(g,iterator)) #

判斷型別

print

(next(g))

print

(next(g))

for i in

g:

print

(i)#

生成流程案例

deftest(n):

print('

start')

while n>0:

yield

n n -= 1

print('

done')

g = test(6)

for i in

g:

print

(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:

print

(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)

def

eater(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 通過列表生成...