我是靠谱客的博主 幽默水杯,这篇文章主要介绍【Python笔记】Python高级特性——生成器,现在分享给大家,希望可以做个参考。

生成器(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高级特性——生成器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部