可迭代的: 只要對象自己有__iter__方法python
執行__iter__就會生成迭代器函數
迭代器有__next__用於獲取值spa
__next__超出界限了會報StopIteration異常協程
迭代器是一次性的, 且只能一直往前迭代對象
獲取生成器的方法blog
迭代器 = 可迭代對象.__iter__()
迭代器 = iter(可迭代對象)
生成器獲取下一個值的方法ip
迭代器.__next__()
next(迭代器)
獲取異常utf-8
d = {'a':1, 'b':2,'c':3}
i = iter(d)
while True:
try:
print(next(i))
except StopIteration:
break
for循環中in後面的就是迭代器字符串
實際上對於不是迭代器的for循環會自動處理成迭代器, 且在for中自動處理異常現象it
d = {'a':1, 'b':2,'c':3}
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()語句中加入異常處理
基本效果
def ger(max):
for i in range(max):
yield i
g = ger(2)
try:
print(next(g))
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
print("done")
模擬tail -f的效果
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'weihuchao'
import time
def tail(file):
with open(file, "r") as f:
f.seek(0, 2)
while True:
line = f.readline().strip()
if line:
yield line
else:
time.sleep(0.3)
continue
g = tail('file')
for line in g:
print(line.strip())
模擬tail -f | grep的效果
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'weihuchao'
import time
def tail(file):
with open(file, "r") as f:
f.seek(0, 2)
while True:
line = f.readline().strip()
if line:
yield line
else:
time.sleep(0.3)
continue
def grep(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轉換爲賦值語句
具體的表現形式以下
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'weihuchao'
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函數來傳遞參數
參數的個數和順序要和定義的一致, 且不能有空缺