迭代器 & 生成器

可迭代对象

  • 获取迭代器中可迭代对象

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

  • 通过迭代器获取下一个元素的值

            下一个元素的值 = next(可迭代对象)

  • 实现可迭代对象

            类中实现__iter__方法(提供迭代器)


迭代器

实现迭代器

  • 类中实现__next__方法:提供下一个元素的值
  • 类中实现__iter__方法:python官方规定迭代器也是一种可迭代对象
import time
class MylistIter(object):
"""迭代器类"""
    def __init__(self,data):
        self.data = data
        self.index = 0

    def __next__(self):
        # 当迭代完成时,应该抛出异常StopIteration
        if self.index == len(self.data):
            raise  StopIteration
        else:
            ret = self.data[self.index]
            self.index += 1
            return ret

    def __iter__(self):
        """迭代器也是一个可迭代对象"""
        return self

class Mylist(object):
"""可迭代对象"""
    def __init__(self):
        self.data = [1,2,3,4,5]

    def __iter__(self):
        """提供一个迭代器"""
        mi = MylistIter(self.data)
        return mi

# 实例对象list
list = Mylist()

li = iter(list)

while True:
    try:
        i = next(li)
    except StopIteration as exp:
        break
    else:
        print(i)
        time.sleep(1)

结果:


生成器

  • 概念:一种特殊的迭代器
  • 生成器的两种表达方式:

            ①生成器表达式:

            

            ②生成器函数含有yield关键字的函数


yield关键字的作用

  1.  挂起当前代码,将yield后面的值返回到调用生成器对象的地方
  2.  当再次唤醒生成器代码时,yield能够恢复代码,从上次运行的地方紧接着运行
  3. 接收额外数据,赋值给yield等号左边的值

唤醒生成器的两种方式

  • 下一个元素的值 = next(生成器对象)
  • 生成器对象.send(data)——使用yield接收消息

注意事项:第一次唤醒生成器,必须使用next( ),因为生成器代码刚开始运行时,没有yield接收消息

def fib(n):
"""生成器函数"""
    current = 0
    num1, num2 = 0, 1
    while current < n:
        num = num1
        num1, num2 = num2, num1+num2
        current += 1
        data = yield  num
        print("收到数据: %s" % data)
    return "Done"


li = iter(fib(10))

# 第一种唤醒生成器的方法:next(生成器对象)
data = next(li)
print(data)


# 第二种唤醒生成器的方式:生成器对象.send(发送的数据)
i = li.send("Hello")
print(i)

结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值