摘要:前文我们了解如果书写一个以及怎样在一个类中安装一个但有时候我们只想要一个简单的而且并不想这么复杂处于这个目的变成语言里面出现了这个概念根据的解释同样也有的优势在输出值的过程中是分散性的即他不会保存每一次输出值这样在循环里面更高效并且更节省效
前文我们了解如果书写一个Iterator,以及怎样在一个类中安装一个Iterator. 但,有时候我们只想要一个简单的iterator, 而且并不想这么复杂. 处于这个目的, 变成语言里面出现了generator 这个概念. 根据wiki的解释:
In fact, all generators are iterators
generator 同样也有iteartor的优势, 在输出值的过程中,是分散性的, 即他不会保存每一次输出值, 这样在循环里面更高效, 并且更节省效率.
generator syntaxgenerator的格式和一个函数非常类似, 他使用yield代替return, 来返回一个expression.
def a_gen: yield 1 yield 2
使用generator实际上就和使用iteartor对象一样. 因为generator 返回的就是iterator:
gen = a_gen() print(next(gen))
既然, generator是Iterator, 那我们能不能在上面使用for...in...循环呢?
Yes~
for x in a_gen(): print(x)
另外, 在python中, 提供了一个常见匿名generator的办法. 使用 ( ) 即可. 里面放的就是 list comprehension.
a = (x for x in range(10))
这里需要注意, 上面 匿名 generator的返回值是一个generator object. 这点很重要, 这也是区分list comrehension 的关键点. generator 延续着iterator的特性: 你要我才给 . 这样, 不必先生成大量的数据. 所以,generator 这个也常常用于处理数据较大的集合中.
如果仅仅是造了一个语法糖, 那generator的存在不就无意义了吗? 所以,generator的优势,或者说用途还是挺广泛的.
用来快速生成Iterator对象. 即, 以前需要这样写,才能生成一个Iterator.
class Xlist: def __init__(self,a_list): self.list = a_list self.index = 0 def __iter__(self): return self def __next__(self): length = len(self.list) if(length==self.index): # 提出异常 raise StopIteration else: result = self.list[self.index] self.index += 1 return result
现在只需要, 使用generator即可
def Xlist(arr): for x in arr: yield x
省略的不止一点点
2.异步序列的操作
在python中,有时候读取文件,可能会存在异步方式的读取. 而且,现在主流的后台处理程序都是NodeJS, 一种完全异步的编程语言. 而generator 本省就继承了Iterator的特性, 有一种状态暂停的效果. 这种效果, 也可以用来作为异步序列的处理. 比如我们这里可以编写一个普通串行:
def co(*callback): length = 0 while length!=len(callback): yield callback[length]() length+=1 for x in co(lambda :1,lambda: 2): print(x)
简单总结:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45471.html
摘要:上下文路径为了方便文件流的输入输出,使用两种位置环境。目标上下文目标上下文定义为当前工作目录或含文件最接近的父文件夹。这确保了用户行为的一致。帮助用户严重需要覆盖的内容。 摘要 随着 Web 2.0 和 HTML 5 的流行,现在的 Web 应用所能提供的功能和交互能力比之前传统的 Web 应用要强大很多。应用的很多实现逻辑被转移到了浏览器端来实现。浏览器不再只提供单一的数据接收和展现...
摘要:在这里汇总了一个现在和经常使用的论文,所有文章都链接到了上面。如果你对感兴趣,可以访问这个专题。作者微信号简书地址是一个专注于算法实战的平台,从基础的算法到人工智能算法都有设计。加入实战微信群,实战群,算法微信群,算法群。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/b7f... sh...
摘要:不参与迭代迭代会执行所有的,也就是说,在迭代后的对象将不会再返回任何有效的值我们可以在迭代器对象上直接调用,来终止后续的代码执行。 前两年大量的在写Generator+co,用它来写一些类似同步的代码 但实际上,Generator并不是被造出来干这个使的,不然也就不会有后来的async、await了 Generator是一个可以被暂停的函数,并且何时恢复,由调用方决定 希望本文可...
摘要:生成对抗网络的各种变体非常多,的发明者在上推荐了这份名为的各种变体列表,这也表明现在确实非常火,被应用于各种各样的任务。了解这些各种各样的,或许能对你创造自己的有所启发。这篇文章列举了目前出现的各种变体,并将长期更新。 生成对抗网络(GAN)的各种变体非常多,GAN 的发明者 Ian Goodfellow 在Twitter上推荐了这份名为The GAN Zoo的各种GAN变体列表,这也表明现...
摘要:同时,迭代器有一个方法来向函数中暂停处抛出一个错误,该错误依然可以通过函数内部的模块进行捕获处理。 本文翻译自:Diving Deeper With ES6 Generators 由于个人能力有限,翻译中难免有纰漏和错误,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...
摘要:每个任务必须显式地挂起自己,在任务切换发生时给予它完全的控制。在这些尝试中,数据经常在任务之间共享。但由于明确的暂停,几乎没有风险。 翻译自 github 概述 什么是generators? 我们可以把generators理解成一段可以暂停并重新开始执行的函数 function* genFunc() { // (A) console.log(First); yi...
阅读 2822·2023-04-25 19:08
阅读 1389·2021-11-16 11:45
阅读 1877·2021-10-13 09:40
阅读 3871·2021-09-30 09:47
阅读 2379·2019-08-30 15:44
阅读 2169·2019-08-30 13:03
阅读 1332·2019-08-30 12:56
阅读 1854·2019-08-26 14:04