迭代器

1 迭代器

1.1 可迭代對象與迭代器

  可迭代的: 只要對象自己有__iter__方法python

  執行__iter__就會生成迭代器函數

  迭代器有__next__用於獲取值spa

  __next__超出界限了會報StopIteration異常協程

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

1.2 轉化方法

  獲取生成器的方法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

1.3 for中的迭代器

  for循環中in後面的就是迭代器字符串

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

d = {'a':1, 'b':2,'c':3}
for i in d:
    print(i)

1.4 文件的迭代器

  文件句柄自己就是一個迭代器

  迭代器既含有__next__也含有__iter__

1.5 經常使用數據類型與迭代器

  可迭代對象

    字符串, 列表, 元組, 字典, 集合, 文件

  迭代器

    文件

  判斷方法

from collections import Iterable,Iterator
f=open('file')
#判斷可迭代的
print(isinstance(f,Iterable))
#查看是不是迭代器
print(isinstance(f,Iterator))

2 生成器

  生成器是在函數中, 修改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")

3 生成器的應用

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

4 協程函數

  協程函數的定義:

    在生成器的基礎上, 針對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函數來傳遞參數

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

相關文章
相關標籤/搜索