python 生成器和迭代器

会有一股神秘感。 提交于 2020-02-04 18:35:28

一、迭代器

任何实现了__iter__()和__next__()方法的对象都是迭代器。

其中,__iter__返回迭代器自身,__next__返回容器中的下一个元素值。

 

二、生成器

具有yield关键字的函数都是生成器。

yield可以理解为特殊的return,该函数不会释放局部变量。

生成器自动实现了__iter__()和__next()__()方法,也就是说生成器也是迭代器。

调用生成器函数,将返回生成器对象,该生成器对象具有迭代器的所有功能。

详情参考

 

三、自定义迭代器

class MyNumbersIterator:
    def __iter__(self):
        self.a = 1
        return self  # 返回迭代器自身

    def __next__(self):
        x = self.a
        self.a += 1
        return x


myclass = MyNumbersIterator()
myiter = iter(myclass)  # 通过调用myclass.__iter__()返回迭代器。

print(next(myiter))  # 输出 1
print(next(myiter))  # 输出 2
print(next(myiter))  # 输出 3
print(next(myiter))  # 输出 4
print(next(myiter))  # 输出 5

四、自定义生成器

#!/usr/bin/python3

import sys


def fibonacci(n):  # 生成器函数 - 斐波那契,返回n个斐波那契数
    a, b, counter = 0, 1, 1
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一个生成器对象,但它同时具有迭代器的所有功能,因为其自动实现了迭代器协议
while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

# 输出值:0 1 1 2 3 5 8 13 21 34 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!