python 生成器

  • Post author:
  • Post category:python


使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

list1 = [1, 2, 3]

# 创建一个生成器 类似于列表推导式 外面是元组
#
my_generator = (i ** 2 for i in range(5))
# generator object 是一个生成器对象
print(my_generator, type(my_generator))


# 获取生成器中的值 从第一个值开始获取
value = next(my_generator)
print(value)

# 遍历获取生成器中的值
for j in my_generator:
    print(j)

运行结果:

<generator object <genexpr> at 0x000001F127C00970> <class ‘generator’>

0

1

4

9

16

# 创建生成器的方式
# 生成器函数
def my_generator():

    for i in range(5):
        print("开始创建")
        # 只要有yield就是生成器
        yield i
        print("完成一次生成")


if __name__ == '__main__':
    # g是生成器对象
    g = my_generator()
    print(g, type(g))

    # 拿取生成器中的第一个值
    value = next(g)
    print(value, type(value))

    # 遍历生成器,拿取剩余的值
    for j in g:
        print(j)

运行结果:

<generator object my_generator at 0x000001D721E564A0> <class ‘generator’>

开始创建

0 <class ‘int’>

完成一次生成

开始创建

1

完成一次生成

开始创建

2

完成一次生成

开始创建

3

完成一次生成

开始创建

4

完成一次生成

进程已结束,退出代码为 0

用生成器输出斐波那契数列
def fibo(n):
    result = []
    for i in range(n):
        print("开始创建")
        if i <= 1:
            result.append(i)
            yield result
        else:
            result.append(result[i - 1] + result[i - 2])
            yield result
        # 只要有yield就是生成器
        print("完成一次生成")


if __name__ == '__main__':
    num = int(input("请输入你要输出几项"))
    f = fibo(num)
    for j in f:
        print(j)

运行结果:

请输入你要输出几项6

开始创建

[0]

完成一次生成

开始创建

[0, 1]

完成一次生成

开始创建

[0, 1, 1]

完成一次生成

开始创建

[0, 1, 1, 2]

完成一次生成

开始创建

[0, 1, 1, 2, 3]

完成一次生成

开始创建

[0, 1, 1, 2, 3, 5]

完成一次生成

进程已结束,退出代码为 0

结束



版权声明:本文为ENCCDY原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。