Tag: 生成器

什么时候不适合使用python生成器?

这是相反的什么你可以使用Python生成器函数? :python生成器,生成器expression式和itertools模块是我现在最喜欢的python特性之一。 当设置一系列操作来执行一大堆数据时,它们特别有用 – 我经常在处理DSV文件时使用它们。 那么,什么时候使用一个生成器,一个生成器expression式或者一个itertools函数呢? 什么时候应该比较喜欢zip() itertools.izip()或者 range()通过xrange() ,或 [x for x in foo] over (x for x in foo) ? 显然,我们最终需要将一个生成器“parsing”为实际的数据,通常是通过创build一个列表或用一个非生成器循环对其进行迭代。 有时我们只需要知道长度。 这不是我要问的。 我们使用生成器,因此我们不会将新列表分配给内存中的临时数据。 这对大数据集尤其有意义。 对于小数据集也有意义吗? 有一个明显的内存/ CPU的权衡? 我特别感兴趣的是,如果有人对此进行了一些分析,那么根据对列表理解性能与map()和filter()的令人eye目的讨论。 ( alt链接 )

等价的C ++到Python生成器模式

我有一些Python代码,我需要在C ++中模仿。 我不需要任何特定的解决scheme(比如基于协同例程的良率解决scheme,尽pipe它们也是可以接受的答案),但我只需要以某种方式重现语义。 python 这是一个基本的序列生成器,显然太大而不能存储物化版本。 def pair_sequence(): for i in range(2**32): for j in range(2**32): yield (i, j) 目标是维护上面序列的两个实例,并以半锁步迭代它们,但以块为单位。 在下面的示例中, first_pass使用对的序列来初始化缓冲区, second_pass重新生成相同的确切序列并再次处理缓冲区。 def run(): seq1 = pair_sequence() seq2 = pair_sequence() buffer = [0] * 1000 first_pass(seq1, buffer) second_pass(seq2, buffer) … repeat … C ++ 在C ++中我唯一可以find的解决scheme是用C ++协程来模仿yield ,但是我没有find关于如何做这个的好的参考。 我也对这个问题的替代(非一般)解决scheme感兴趣。 我没有足够的内存预算来保留传递之间的序列副本。

有没有一个机制在ES6(ECMAScript 6)没有可变variables循环x次?

在JavaScript中循环x次的典型方式是: for (var i = 0; i < x; i++) doStuff(i); 但是我不想使用++运算符或者任何可变variables。 那么在ES6中有没有办法以另一种方式循环x次? 我喜欢Ruby的机制: x.times do |i| do_stuff(i) end 在JavaScript / ES6中有类似的东西吗? 我可以欺骗,做我自己的发电机: function* times(x) { for (var i = 0; i < x; i++) yield i; } for (var i of times(5)) { console.log(i); } 当然,我仍然在使用i++ 。 至less它是看不见的:),但我希望在ES6中有一个更好的机制。

有无限发生器的expression式吗?

有一个直接的发生器expression式,可以产生无限的元素? 这是一个纯粹的理论问题。 这里不需要“实际”的答案:) 例如,制作一个有限的发生器很容易: my_gen = (0 for i in xrange(42)) 然而,为了创造一个无限的我需要“污染”我的命名空间与一个虚假的function: def _my_gen(): while True: yield 0 my_gen = _my_gen() 在单独的文件中执行操作并稍后import不计算在内。 我也知道itertools.repeat正是这样做的。 我很好奇,如果没有一个单线的解决scheme。

在Python中是否有`string.split()`的生成器版本?

string.split()返回一个列表实例。 有没有一个版本,而不是返回一个发电机 ? 有没有任何理由反对发电机版本?

为什么列表推导写入循环variables,但生成器不?

如果我做了一些列表parsing,它写入一个局部variables: i = 0 test = any([i == 2 for i in xrange(10)]) print i 这打印“9”。 但是,如果我使用一个生成器,它不写入一个局部variables: i = 0 test = any(i == 2 for i in xrange(10)) print i 这打印“0”。 这有什么不同吗? 这是一个devise决定,还是一个随机的产生器和列表parsing实现的副产品? 就个人而言,如果列表parsing不写入局部variables,对我来说似乎更好。

如何len(发生器())

Python生成器是非常有用的。 它们比返回列表的函数有优势。 但是,你可以len(list_returning_function()) 。 有没有办法len(generator_function()) ? 更新: 当然len(list(generator_function()))会工作….. 我正在尝试使用我在创build的新生成器中创build的生成器。 作为新生成器计算的一部分,它需要知道旧生成器的长度。 不过,我想保持它们与发生器的属性相同,特别是不要将整个列表保存在内存中,因为它可能会很长。 更新2: 假设从第一步开始generotr 知道它的目标长度。 另外,没有理由维护len()语法。 示例 – 如果Python中的函数是对象,我不能将该长度分配给该对象的一个​​variables,这个variables可以被新的生成器访问吗?

我怎么知道一个发电机从一开始是空的?

有没有简单的testing方法,如果发电机没有项目,如偷看,hasNext,isEmpty,沿着这些线?

如何检查一个对象是否是Python中的生成器对象?

在python中,如何检查对象是否为生成器对象? 尝试这个 – >>> type(myobject, generator) 给出了错误 – Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'generator' is not defined (我知道我可以检查对象是否有next方法,它是一个生成器,但我想用某种方式来确定任何对象的types,而不仅仅是生成器。)

Python:使用recursionalgorithm作为生成器

最近我写了一个函数来生成具有非平凡约束的特定序列。 问题出现在一个自然的recursion解决scheme中。 现在碰巧,即使是相对较小的input,序列也是几千,所以我宁愿使用我的algorithm作为生成器,而不是用它来填充所有序列的列表。 这是一个例子。 假设我们想要用recursion函数计算一个string的所有排列。 下面的朴素algorithm需要一个额外的参数“存储”,并且每当它find一个时就附加一个排列: def getPermutations(string, storage, prefix=""): if len(string) == 1: storage.append(prefix + string) # <—– else: for i in range(len(string)): getPermutations(string[:i]+string[i+1:], storage, prefix+string[i]) storage = [] getPermutations("abcd", storage) for permutation in storage: print permutation (请不要在乎效率低下,这只是一个例子。) 现在我想把我的函数变成一个生成器,即产生一个排列而不是附加到存储列表: def getPermutations(string, prefix=""): if len(string) == 1: yield prefix + string # <—– else: for […]