Day23-迭代器

1 迭代器

1.1 可迭代对象与迭代器

  可迭代的: 只要对象本身有__iter__方法

  执行__iter__就会生成迭代器

  迭代器有__next__用于获取值

  __next__超出界限了会报StopIteration异常

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

1.2 转化方法

  获取生成器的方法

迭代器 = 可迭代对象.__iter__()
迭代器 = iter(可迭代对象)

  生成器获取下一个值的方法

迭代器.__next__()
next(迭代器)

  获取异常

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中自动处理异常现象

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函数来传递参数

    参数的个数和顺序要和定义的一致, 且不能有空缺

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值