生成器(generator)是一个特殊的例程,用于控制循环的迭代行为。实际上,所有的生成器都是迭代器。生成器与返回数组的函数非常相似,因为生成器具有参数,能调用并生成一系列值。然而,生成器不是构建一个包含所有值的数组并立即返回它们,而是一次生成一个值,这需要较少的内存并允许调用者立即开始处理前几个值。简而言之,生成器看起来像一个函数,但表现得像一个迭代器。
生成器能用更具表现力的控制流结构实现,例如协程或一级延续。生成器也称为半协程(semicoroutines),它是协程的一个特例且比其弱,因为它总是把控制返回给调用者(当传递一个值时),而不是指定一个协程跳转,查看协程和生成器器的比较。
1. 用途:
它通常在循环内调用生成器,在循环中第一次生成一个生成器调用时,会创建一个迭代器对象,它把生成器例程的状态封装在其开始处并把参数绑定到相应参数,然后在该迭代器的上下文中执行生成器的主体,直到遇到特殊的yield操作;此时,yield操作提供的值将用于调用表达式的值。下一次在后续迭代中达到相同的生成器调用时,在yield操作之后恢复生成器正文的执行,直到遇到另一个yield操作。除了yield动作之外,生成器主体的执行能通过结束动作来终止,此时关闭生成器调用的最内层循环终止。在更复杂的情况下,我们能在循环外部手动使用生成器创建迭代器,然后以各种方式使用迭代器。
由于生成器仅根据需要计算其生成的值,因此它们对于表示流(如一次可能开销很大或不可能计算的序列)非常有用,这些例子包括无限序列和实时数据流。当渴望求值是可取的(主要是当序列是有限的,否则求值永远不会终止),可转换为列表,或使用并行构造创建列表而不是生成器。例如,在Python中,可以通过l = list(g)把生成器g求值为列表l。
在存在生成器的情况下,语言的循环结构如for和while可被简化为单循环... end循环结构;所有常用的环路结构都能通过使用合适的生成器以正确方式进行模拟。例如,像x = 1到10那样的范围循环可被实现为通过生成器的迭代,就像在Python中的range(1,10)中的x一样。此外,break可实现为向发生器发送完成,然后在循环中继续使用。
2. 时间轴:
生成器最早出现在CLU(1975)是MIT的LISP语言Icon(1977)的一个突出特性,现在可用于Python、C#、Ruby、ECMAScript的更新版本;截至ES6 / ES2015)和其它语言。 在CLU和C#中,生成器被称为迭代器,在Ruby中被称为枚举器。
在Python中,生成器被认为是一个包含冻结栈帧的迭代器,无论何时调用迭代器的next()方法,Python都会恢复冻结帧,通常执行该帧直到达到下一个yield语句,然后生成器的帧再次冻结并把返回值返回给调用方。 PEP 380(在Python 3.3中实现)添加来自表达式的yield,允许生成器将其部分操作委托给另一个生成器。
生成器表达式:Python有一个基于列表解析的语法,称为生成器表达式,有助于创建生成器。 下面通过使用生成器表达式计算来自countfrom生成器函数的平方来扩展上面的示例。
生成器能用更具表现力的控制流结构实现,例如协程或一级延续。生成器也称为半协程(semicoroutines),它是协程的一个特例且比其弱,因为它总是把控制返回给调用者(当传递一个值时),而不是指定一个协程跳转,查看协程和生成器器的比较。
1. 用途:
它通常在循环内调用生成器,在循环中第一次生成一个生成器调用时,会创建一个迭代器对象,它把生成器例程的状态封装在其开始处并把参数绑定到相应参数,然后在该迭代器的上下文中执行生成器的主体,直到遇到特殊的yield操作;此时,yield操作提供的值将用于调用表达式的值。下一次在后续迭代中达到相同的生成器调用时,在yield操作之后恢复生成器正文的执行,直到遇到另一个yield操作。除了yield动作之外,生成器主体的执行能通过结束动作来终止,此时关闭生成器调用的最内层循环终止。在更复杂的情况下,我们能在循环外部手动使用生成器创建迭代器,然后以各种方式使用迭代器。
由于生成器仅根据需要计算其生成的值,因此它们对于表示流(如一次可能开销很大或不可能计算的序列)非常有用,这些例子包括无限序列和实时数据流。当渴望求值是可取的(主要是当序列是有限的,否则求值永远不会终止),可转换为列表,或使用并行构造创建列表而不是生成器。例如,在Python中,可以通过l = list(g)把生成器g求值为列表l。
在存在生成器的情况下,语言的循环结构如for和while可被简化为单循环... end循环结构;所有常用的环路结构都能通过使用合适的生成器以正确方式进行模拟。例如,像x = 1到10那样的范围循环可被实现为通过生成器的迭代,就像在Python中的range(1,10)中的x一样。此外,break可实现为向发生器发送完成,然后在循环中继续使用。
2. 时间轴:
生成器最早出现在CLU(1975)是MIT的LISP语言Icon(1977)的一个突出特性,现在可用于Python、C#、Ruby、ECMAScript的更新版本;截至ES6 / ES2015)和其它语言。 在CLU和C#中,生成器被称为迭代器,在Ruby中被称为枚举器。
在Python中,生成器被认为是一个包含冻结栈帧的迭代器,无论何时调用迭代器的next()方法,Python都会恢复冻结帧,通常执行该帧直到达到下一个yield语句,然后生成器的帧再次冻结并把返回值返回给调用方。 PEP 380(在Python 3.3中实现)添加来自表达式的yield,允许生成器将其部分操作委托给另一个生成器。
生成器表达式:Python有一个基于列表解析的语法,称为生成器表达式,有助于创建生成器。 下面通过使用生成器表达式计算来自countfrom生成器函数的平方来扩展上面的示例。
很多新的朋友可能不知道我们是谁?CLU是什么?
Community+Love+Unity
社区+爱+凝聚(成功案例就是他现在打造的游戏社区,有凝聚力,有支持者,慈善、爱)未来即将登陆#NTF# 建立属于自己的SANDBOX(沙盒)城堡,可以交易、交友属于自己的一片天空。欢迎你的加入,未来可期!#clucoin[超话]##数字货币[超话]#
Community+Love+Unity
社区+爱+凝聚(成功案例就是他现在打造的游戏社区,有凝聚力,有支持者,慈善、爱)未来即将登陆#NTF# 建立属于自己的SANDBOX(沙盒)城堡,可以交易、交友属于自己的一片天空。欢迎你的加入,未来可期!#clucoin[超话]##数字货币[超话]#
@大家-祝大家第三天快乐!
我想简要回顾一下我们在过去72小时里所取得的成就,同时也要消除恐惧。如果你已经看了一整天的图表,你的胸口可能有一个焦虑的球。别这样对自己。我们刚刚推出了一场盛大的预售,很多参加预售的人都在那里,特别是在发布会上加入和抛售。让他们走,让你的倒影成长。我们所经历的稳定在10倍以上是难以置信的。
目前,我们的市值为2.26亿美元。你应该注意到你的倒影随着你的掌握而增加。这事很重要。你拥有的CLU越多,你从反射中得到的就越多。当我们的价格波动,并开始上升趋势与我们的公告(通过审计,更新白皮书和NFT),你将享受这些想法的甜蜜回报。
星期五,我将举办一场价值25,000美元的弹珠锦标赛。还有更多的细节。我们目前正在计划更多的社区活动,使CLUmmunity成为人们更愉快的体验。
我们现在是坚如磐石的。对于密码来说,这个周末通常是个低迷的周末,所以特别是在发射前的时候,稍微下降一下是很棒的。我已经和多位密码顾问谈过了,他们都对我们的稳定状况印象深刻。
所以。别忘了放大。;)
我想简要回顾一下我们在过去72小时里所取得的成就,同时也要消除恐惧。如果你已经看了一整天的图表,你的胸口可能有一个焦虑的球。别这样对自己。我们刚刚推出了一场盛大的预售,很多参加预售的人都在那里,特别是在发布会上加入和抛售。让他们走,让你的倒影成长。我们所经历的稳定在10倍以上是难以置信的。
目前,我们的市值为2.26亿美元。你应该注意到你的倒影随着你的掌握而增加。这事很重要。你拥有的CLU越多,你从反射中得到的就越多。当我们的价格波动,并开始上升趋势与我们的公告(通过审计,更新白皮书和NFT),你将享受这些想法的甜蜜回报。
星期五,我将举办一场价值25,000美元的弹珠锦标赛。还有更多的细节。我们目前正在计划更多的社区活动,使CLUmmunity成为人们更愉快的体验。
我们现在是坚如磐石的。对于密码来说,这个周末通常是个低迷的周末,所以特别是在发射前的时候,稍微下降一下是很棒的。我已经和多位密码顾问谈过了,他们都对我们的稳定状况印象深刻。
所以。别忘了放大。;)
✋热门推荐