如有问题欢迎指出!
定义
Python中生成器是迭代器(Iterator) 的一种,每次遇到 yield
时函数会暂停并保存当前所有的运行信息,返回 yield
后的值, 并在下一次执行 next()
方法时从当前位置继续运行。
列表一次生成一组值,占用内存空间;生成器一次只产生一个值,用多少,取多少。
创建生成器(Generator)
如何创建生成器?
- 将列表生成式的中括号[]改为小括号(),得到生成器表达式;
- 定义一个包含
yield
关键字的函数——生成器函数,调用函数就是创建了一个生成器(generator)对象。
yield
相当于return
返回一个值,并且记住这个返回的位置保留当前信息,下次迭代时,代码从yield
的下一条语句继续执行。
这里大家可以思考下将generator_2(n)
中的yield
改为return
,每次调用函数的结果是什么。
# 列表生成式
list1 = [x*x for x in range(3)]
print(list1)
# 创建生成器
# 1.生成器表达式:列表生成式的中括号[]改为小括号()
generator1 = (x*x for x in range(3))
print(generator1)
# 2.函数中包含yield关键字,调用函数就是创建了一个生成器(generator)对象。
def generator_2(n):
for x in range(n):
yield x*x
generator2 =generator_2(3)
print(generator2)
Output:
[0, 1, 4]
<generator object <genexpr> at 0x000001F4C81E1AC0>
<generator object generator_2 at 0x000001F4C81E1DD0>
注意:调用生成器函数时generator2 =generator_2(3)
只是创建了一个生成器,并不会执行函数里面的内容。
获得生成器的值
- 重复调用
next()
方法 ,直到捕获一个异常; - 通过 for 循环对生成器进行迭代。
next()
方法:next(generator)
或generator.__next__()
def generator_2(n):
for x in range(n):
yield x*x
generator2 =generator_2(3)
print(generator2)
print(next(generator2))
print(generator2.__next__())
Output:<