day9_python迭代器和生成器

文章介绍了如何在Python中实现迭代器和可迭代对象,通过自定义类`MyIterator`和`MyList`展示了迭代器的工作原理。同时,文章还探讨了生成器的概念,使用`yield`关键字创建了一个斐波那契数列的生成器函数,并展示了`next()`函数的使用。此外,文章还讲解了`send()`函数如何在生成器中传递数据,通过示例展示了如何在生成器执行过程中向其内部发送值。
摘要由CSDN通过智能技术生成

迭代器

class MyIterator:
    '''供可迭代对象 变成一个 迭代器'''

    def __init__(self, mylist):
        self.mylist = mylist
        # 当前访问的位置current
        self.current = 0

    # 重写 __next__ 的是迭代器
    def __next__(self):
        current = self.current
        self.current += 1
        if current < len(self.mylist.items):
            item = self.mylist.items[current]
            return item
        else:
            raise StopIteration

    # 记住,就这样写
    def __iter__(self):
        return self

可迭代对象

class MyList:
    '''自定义一个可迭代对象'''

    def __init__(self):
        self.items = []

    def add(self, value):
        self.items.append(value)

    # 重写 __iter__ 方法的就是可迭代对象,要求返回值是一个迭代器
    def __iter__(self):
        myIterator = MyIterator(self)
        return myIterator

完整程序 及 运行结果

from collections.abc import Iterable, Iterator


class MyList:
    '''自定义一个可迭代对象'''

    def __init__(self):
        self.items = []

    def add(self, value):
        self.items.append(value)

    # 重写 __iter__ 方法的就是可迭代对象,要求返回值是一个迭代器
    def __iter__(self):
        myIterator = MyIterator(self)
        return myIterator


class MyIterator:
    '''供可迭代对象 变成一个 迭代器'''

    def __init__(self, mylist):
        self.mylist = mylist
        # 当前访问的位置current
        self.current = 0

    # 重写 __next__ 的是迭代器
    def __next__(self):
        current = self.current
        self.current += 1
        if current < len(self.mylist.items):
            item = self.mylist.items[current]
            return item
        else:
            raise StopIteration

    # 记住,就这样写
    def __iter__(self):
        return self


if __name__ == '__main__':
    # Iterable 可迭代的
    # Iterator 迭代器
    mylist = MyList()  # 创建一个可迭代对象
    # isinstance(x,y)  判断 x是否为 y类型
    # 可迭代对象不一定是 迭代器
    print(isinstance(mylist, Iterable))  # True
    print(isinstance(mylist, Iterator))  # False

    mylist.add(1)
    mylist.add(2)
    mylist.add(3)

    # 可迭代对象 就可以用for遍历
    for i in mylist:
        print(i)

    print(" - " * 50)

    # 迭代器 必然是可迭代对象
    print(isinstance(MyIterator(mylist), Iterator))  # True
    print(isinstance(MyIterator(mylist), Iterable))  # True
    # 迭代器也能用 for 遍历
    for i in MyIterator(mylist):
        print(i)

在这里插入图片描述

生成器-generator(支持next)

yield关键字

# 含有 yield 关键字的方法叫生成器
def fib(n):
    current = 0
    num1 = num2 = 1
    while current < n:
        num = num1
        num1, num2 = num2, num1 + num2
        current += 1
        yield num
    return 'done'

if __name__ == '__main__':
    F = fib(10)
    print(F)
    print("*" * 50)
    for i in range(10):
        print(next(F), end=' ')

在这里插入图片描述

send()函数 唤醒生成器的同时,向断点处传入一个附加数据

def gen():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1


if __name__ == '__main__':
    g = gen()
    # 程序在yield 卡住,执行next 会返回当前值,但是需要打印
    # None 是temp打印的   数字是print 打印的
    print(next(g))  # 0
    next(g)  # None,因为没传参数
    print(next(g))  # None 2
    print(g.send("hello"))  # hello 3

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值