ad

打开《Python 编程与应用实践》_成为Python大佬_5.6 生成器

网友投稿 122 2023-11-13

【摘要】 本书摘自《Python 编程与应用实践》一书中第5章,第6节,由冯伟森,王建,杨宁主编。

5.6 生成器

生成器是一个特殊的程序。它采用一边循环一边计算的机制,通过控制循环的迭代行 为来创建 Python 序列。它按照某种算法在循环的过程中不断推算出后续的元素,不需要 在内存中创建和存储整个序列,从而节省大量的空间。

本质上生成器是一种使用普通函数语法定义的迭代器。它被调用时不会执行函数体内 的代码,而是返回一个迭代器。

打开《Python 编程与应用实践》_成为Python大佬_5.6 生成器

每次请求值时,都将执行生成器的代码,直到遇到 yield 或 return 。yield 意味着应生 成一个值,每次调用 yield 会暂停,可以使用 next() 函数和 send() 函数恢复生成器。 return 意味着生成器应停止执行(即不再生成值,仅当在生成器调用return 时,才能不 提供任何参数)。

5.6.1 创建生成器

生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。生成器的函数是由 def语句定义的,其中包含 yield。生成器的迭代器是这个函数返回的结果。用不太准确的 话来说,这两个实体通常被视为一个,通称生成器。

生成器类似于返回值为列表的一个函数,这个函数可以接受参数,可以被调用,它的 返回值使用 yield语句声明而不是return 。 不同于一般的函数会一次性返回包括了所有数

值的列表,生成器一次只能产生一个值。每次迭代生成器时,它会记录上一次调用的位 置,并且返回下一个值。例如:

def s_generator():

yield 1

print(s_generator)

print(s_generator())

输出以下结果:

5.6.2 使用生成器

(1)整体输出。

使用 print 函数输出全部值。

def generator_ex():

for x in range(5):

yield x*2

print(list(generator_ex()))

最后得到输出结果:

[0,2,4,6,8]

(2)迭代输出。

使用 next 函数进行迭代输出。

def generator_ex():

for x in range(5):

yield x*2

g=generator ex()

print(next(g))

print(next(g))

print(next(g))

print(next(g))

print(next(g))

print(next(g))

每次调用 next 函数,都会计算出它的下一个元素的值,直到计算出最后一个元素, 没有更多的元素时,抛出 Stoplteration 的错误(注意输出会报错):

2

4

6

8

StopIteration

还可以使用for 循环进行迭代输出,并且不需要关心 Stoplteration 的错误。 def generator_ex():

for x in range(5):

yield x*2

for i in generator_ex():

print(i)

得到以下输出:

2

4

6

8

5.6.3 生成器推导式

在Python 2.4中,引入了生成器推导(也称为生成器表达式)。其工作原理与列表推 导相同,它返回一个生成器。

5.6.4 生成器方法

(1)send 方法。

send方法是在生成器开始运行后生成器和外部之间的通信渠道。外部世界使用send 方法为生成器提供一个参数,该参数指定的是上一次被挂起的 yield语句的返回值。当生 成器重新运行时,yield 返回一个值 (send 方法发送的值)。如果使用的是 next,yield 将 返回 None。

send方法和 next 方法唯一的区别是在执行 send 方法会首先把上一次挂起的 yield 语 句的返回值通过参数设定,从而实现与生成器方法的交互。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:打开《Python 可视化数据分析》_学会挖掘大数据的价值_2.3 Python数据结构:列表和元组
下一篇:实战之路《Excel 数据处理与分析实战宝典_第2版》_5.2 公式中的引用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×