生成器(generator)
- 描述
通过列表生成式可以直接创建列表,由于内存的限制,列表容量有限。如果创建一个上百万元素的列表,只用到几个元素,很浪费存储空间。
想避免这种情况,就要用到生成器。在python中,一边循环一边计算的机制,成为生成器(generator)
# 把列表[0,1,2,3,4,5,6,7],每个值加1
L = [0,1,2,3,4,5,6,7]
b = []
for i in L:
a = i + 1
b.append(a)
print(b)
# 输出结果:[1, 2, 3, 4, 5, 6, 7, 8]
# 列表生成式来实现
L = [0,1,2,3,4,5,6,7]
a = [i+1 for i in L]
print(a)
# 输出结果:[1, 2, 3, 4, 5, 6, 7, 8]
- 创建生成器
将上个例子中列表生成式的[]改为(),就创建一个generator
# 列表生成式
a = [i+1 for i in range(8)]
print(a)
# 输出结果:[1,2,3,4,5,6,7,8]
# 生成器
g = (i+1 for i in range(8))
print(g)
# 输出结果<generator object <genexpr> at 0x0000024C55031A98>
- 如何打印生成器的值?
生成器是一个特殊的程序,可以被用作控制循环的迭代行为(python中生成器是迭代器的一种),使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数回复生成器
g = (i+1 for i in range(8))
print(next(g))
print(next(g))
print(next(g))
输出结果
1
2
3
生成器(generator)保存的是算法,每次调用next(g)就计算出它下一个元素的值,直到最后一个元素,如果没有更多的元素,会抛出StopIteration的错误
正确的使用方法:
g = (i+1 for i in range(8))
for n in g:
print(n)
输出结果
1
2
3
4
5
6
7
8
- 生成器高级用法
生成器不仅可以通过类似生成式的for循环实现,还可以用函数来实现
例如斐波那契数列,除第一个和第二个数外,任何一个数都可以由前两个相加得到
1,1,2,3,5,8…
# 斐波那契函数通过函数打印
def fib(max):
n,a,b = 0,0,1
while n < max:
a,b = b,a+b
n += 1
print(a)
return 'done'
print(fib(6))
输出结果
1
1
2
3
5
8
done
fib函数实际上是定义了斐波那契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑非常类似生成器(generator)
# 把fib函数变成生成器(generator)
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b,a+b
n += 1
return 'done'
print(fib(6))
#输出结果:<generator object fib at 0x000001F929E71A98>
这就是generator定义的另一种方法,如果一个函数定义中包含了yield
关键字,那这个函数就不再是一个普通函数,而是一个生成器(generator)
- 函数与变成生成器的函数不同之处
函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而变成生成器(generator)的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行
def g():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield 3
a = g()
next(a)
# 输出结果:1
next(a)
# 输出结果:2
next(a)
# 输出结果:3
可以看出g不是普通函数,在执行过程中,遇到yield
就中断,下次又继续执行。
执行3次yield后,已经没有yield
可以执行了,如果继续调用next(a)
(第四次调用),就会报错
- 生成器(generator)两种基本方式
a.生成器函数:也是用def定义的,利用关键字yield一次性返回一个结果,堵塞,重新开始
b.生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果
最后
以上就是幽默水杯最近收集整理的关于【Python笔记】Python高级特性——生成器的全部内容,更多相关【Python笔记】Python高级特性——生成器内容请搜索靠谱客的其他文章。
发表评论 取消回复