一.迭代器
只要物件本身有_iter_()_方法,那它就是可迭代的
執行__iter__就會生成迭代器
迭代器有__next__用於獲取值
__next__超出界限了會報stopiteration異常
迭代器是一次性的, 且只能一直往前迭代
獲取生成器的方法:
迭代器
=
可迭代物件.__iter__()
迭代器
=
iter
(可迭代物件)
生成器獲取下乙個值的方法:
迭代器.__next__()
next
(迭代器)
獲取異常
d =i =iter(d)
while
true:
try:
(next(i))
except
stopiteration:
break
for中的迭代器:
for迴圈中in後面的就是迭代器
實際上對於不是迭代器的for迴圈會自動處理成迭代器, 且在for中自動處理異常現象
d =for i in
d:
print(i)
檔案的迭代器:
檔案控制代碼本身就是乙個迭代器
迭代器既含有__next__也含有__iter__
常用資料型別與迭代器:
可迭代物件:
字串, 列表, 元組, 字典, 集合, 檔案
迭代器:
檔案判斷方法:
from
collections
import
iterable,iterator
f
=
open
(
'file'
)
#判斷可迭代的
print
(
isinstance
(f,iterable))
#檢視是否是迭代器
print
(
isinstance
(f,iterator))
二.生成器
生成器是在函式中, 修改return為yield
效果:執行該函式之後, 並沒有執行該函式體
執行之後, 會返回乙個生成器
生成器呼叫next()函式之後, 會執行函式體到yield語句位置
再呼叫next()函式之後, 會接著上次yield的位置繼續執行函式體
使用for迴圈呼叫生成會一次迴圈就是執行到乙個yield
生成器是迭代器的一種
生成器一樣可能會產生stopiteration異常, 需要在執行next()語句中加入異常處理
defger(max):
for i in
range(max):
yieldi
g = ger(2)
try:
(next(g))
(next(g))
(next(g))
(next(g))
except
stopiteration:
print("
done
")
生成器的應用
模擬tail -f的效果
importtime
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的效果
importtime
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轉換為賦值語句
具體的表現形式如下
defeater(name):
(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 函式呼...