python之迭代器篇

2022-07-19 09:24:09 字數 3470 閱讀 2852

一.迭代器

只要物件本身有_iter_()_方法,那它就是可迭代的

執行__iter__就會生成迭代器

迭代器有__next__用於獲取值

__next__超出界限了會報stopiteration異常

迭代器是一次性的, 且只能一直往前迭代

獲取生成器的方法:

迭代器=可迭代物件.__iter__()

迭代器=iter(可迭代物件)

生成器獲取下乙個值的方法:

迭代器.__next__()

next(迭代器)

獲取異常

d = 

i =iter(d)

while

true:

try:

print

(next(i))

except

stopiteration:

break

for中的迭代器:

for迴圈中in後面的就是迭代器

實際上對於不是迭代器的for迴圈會自動處理成迭代器, 且在for中自動處理異常現象

d = 

for i in

d:

print(i)

檔案的迭代器:

檔案控制代碼本身就是乙個迭代器

迭代器既含有__next__也含有__iter__

常用資料型別與迭代器:

可迭代物件:

字串, 列表, 元組, 字典, 集合, 檔案

迭代器:

檔案判斷方法:

fromcollectionsimportiterable,iterator

f=open('file')

#判斷可迭代的

print(isinstance(f,iterable))

#檢視是否是迭代器

print(isinstance(f,iterator))

二.生成器

生成器是在函式中, 修改return為yield

效果:執行該函式之後, 並沒有執行該函式體

執行之後, 會返回乙個生成器

生成器呼叫next()函式之後, 會執行函式體到yield語句位置

再呼叫next()函式之後, 會接著上次yield的位置繼續執行函式體

使用for迴圈呼叫生成會一次迴圈就是執行到乙個yield 

生成器是迭代器的一種

生成器一樣可能會產生stopiteration異常, 需要在執行next()語句中加入異常處理

def

ger(max):

for i in

range(max):

yieldi

g = ger(2)

try:

print

(next(g))

print

(next(g))

print

(next(g))

print

(next(g))

except

stopiteration:

print("

done

")

生成器的應用

模擬tail -f的效果

import

time

deftail(file):

with open(file, "r

") as f:

f.seek(0, 2)

while

true:

line =f.readline().strip()

ifline:

yield

line

else

: time.sleep(0.3)

continue

g = tail('

file')

for line in

g:

print(line.strip())

模擬tail -f | grep的效果

import

time

deftail(file):

with open(file, "r

") as f:

f.seek(0, 2)

while

true:

line =f.readline().strip()

ifline:

yield

line

else

: time.sleep(0.3)

continue

defgrep(pattern,lines):

for line in

lines:

if pattern in

line:

yield

line

g = tail('

file')

g1 = grep('

info

', g)

for line in

g1:

print(line.strip())

三.協程函式

協程函式的定義:

在生成器的基礎上, 針對yield轉換為賦值語句

具體的表現形式如下

def

eater(name):

print

(name)

while

true:

food, soup = yield

print("

start to eat

", food, soup)

print("

done")

g = eater("

egon")

next(g)

g.send((

"咖哩雞肉蓋飯

","酸梅湯

"))

協程函式的作用:

yield 後面繼續可以新增返回值

yield前面的內容可以通過send函式來傳遞引數

引數的個數和順序要和定義的一致, 且不能有空缺

python之迭代器

可迭代物件就是序列觀念的通用化,如果物件是實際儲存的序列,或者可以在迭代工具環境 eg for迴圈 中一次產生乙個結果的物件,就可看成是可迭代的。可迭代物件包括實際序列和按照需求而計算的虛擬序列。常見的迭代工具 for迴圈 列表解析 in成員關係測試以及map內建函式等。1.檔案迭代器 readli...

Python之迭代器

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable。可以使用...

python之迭代器

首先需要搞清楚兩個概念 可迭代,迭代器,兩者不能混為一談。可以直接作用於for迴圈的物件統稱為可迭代物件 iterable python裡可以用isinstance iterable 來檢測第乙個引數是不是可迭代的 這裡第乙個引數是乙個列表 注意,可迭代和 迭代器 是不一樣的!可以被next 函式呼...