Python 生成器如何设置和使用
Python 的生成器其实可以理解为一种比较复杂的迭代器。
关于迭代器,可以参考:
Python 迭代器的设置和使用方法
一、代码举例:
def gen(x,y):
txt = 'I love ' + x
yield txt
txt_1 = ', You love ' + y
yield txt + txt_1
gen_txt = gen('apple','peach')
print(type(gen_txt))
print(next(gen_txt))
print(next(gen_txt))
print(next(gen_txt))
<class 'generator'>
I love apple
I love apple, You love peach
StopIteration
这里和迭代器一样,可以用 next() 一步步执行。
这里叫做生成器函数。
第一次执行以后会从第一个 yield 的地方返回结果。
然后再执行 next() ,从跳出的地方继续往下执行到第二个 yield。
二、区别
- 和列表表达式区别
for x in (x ** 2 for x in range(5)):
print(x)
for x in [x ** 2 for x in range(5)]:
print(x)
a=(x ** 2 for x in range(5))
b=[x ** 2 for x in range(5)]
print(type(a))
print(type(b))
0
1
4
9
16
0
1
4
9
16
<class 'generator'>
<class 'list'>
可以看到我们用元组的形式表示,则为生成器表达式。
生成器表达式是对内存空间的优化。他们不需要像方括号的列表解析一样,一次构造出整个结果列表。
列表解析式更快,生成器表达式更省内存!
- 和传统函数的差别
def gen_squares(num):
for x in range(num):
yield x ** 2
for i in gen_squares(5):
print(i, end=' ')
0 1 4 9 16
def sq(num):
return num**2
for i in range(5):
print(sq(i), end=' ')
0 1 4 9 16
传统函数是反复调用。
而生成器函数是挂起,然后迭代继续。