使用excel统计学生成绩让相同学生分数名次相同-英雄云拓展知识分享
122
2023-11-13
【摘要】 本书摘自《Python 编程与应用实践》一书中第5章,第6节,由冯伟森,王建,杨宁主编。
5.6 生成器
生成器是一个特殊的程序。它采用一边循环一边计算的机制,通过控制循环的迭代行 为来创建 Python 序列。它按照某种算法在循环的过程中不断推算出后续的元素,不需要 在内存中创建和存储整个序列,从而节省大量的空间。
本质上生成器是一种使用普通函数语法定义的迭代器。它被调用时不会执行函数体内 的代码,而是返回一个迭代器。
每次请求值时,都将执行生成器的代码,直到遇到 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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~