Questions tagged «generator»

生成器是子例程的泛化,主要用于简化迭代器的编写。生成器中的yield语句未指定要跳转到的协程,而是将值传递回父例程。

9
什么时候不是使用python生成器的好时机?
这与您可以使用Python生成器函数做什么相反呢?:python生成器,生成器表达式和itertools模块是这些天我最喜欢的python功能。当设置操作链以对大量数据执行时,它们特别有用-我在处理DSV文件时经常使用它们。 那么什么时候不是使用生成器,生成器表达式或itertools函数的好时机? 我什么时候应该更喜欢zip()了itertools.izip(),或者 range()在xrange()或 [x for x in foo]结束了(x for x in foo)? 显然,我们最终需要通常通过创建列表或使用非生成器循环对其进行迭代来将生成器“解析”为实际数据。有时我们只需要知道长度即可。这不是我要的 我们使用生成器,以便我们不会将新列表分配到内存中以存储临时数据。这对于大型数据集尤其有意义。小型数据集也有意义吗?是否存在明显的内存/ CPU权衡? 考虑到列表理解性能与map()和filter()的令人大开眼界的讨论,如果有人对此进行了分析,我尤其感兴趣。(alt链接)

6
生成器的异步/等待和ES6收益之间的区别
我刚刚读了这篇很棒的文章《生成器》,它清楚地突出了此函数,它是处理生成器函数的辅助函数: function async(makeGenerator){ return function () { var generator = makeGenerator.apply(this, arguments); function handle(result){ // result => { done: [Boolean], value: [Object] } if (result.done) return Promise.resolve(result.value); return Promise.resolve(result.value).then(function (res){ return handle(generator.next(res)); }, function (err){ return handle(generator.throw(err)); }); } try { return handle(generator.next()); } catch (ex) { return Promise.reject(ex); } …

7
如何通过发电机循环
一个人如何循环通过发电机?我是这样想的: gen = function_that_returns_a_generator(param1, param2) if gen: # in case the generator is null while True: try: print gen.next() except StopIteration: break 还有更pythonic的方式吗?
80 python  generator 

15
如何展望Python生成器中的一个元素(预览)?
我不知道如何展望Python生成器中的一个元素。我一看就不见了。 这是我的意思: gen = iter([1,2,3]) next_value = gen.next() # okay, I looked forward and see that next_value = 1 # but now: list(gen) # is [2, 3] -- the first value is gone! 这是一个更真实的示例: gen = element_generator() if gen.next_value() == 'STOP': quit_application() else: process(gen.next()) 谁能帮我写一个生成器,让您向前看一个元素?
78 python  generator  peek 

9
迭代器与枚举器之间的区别
.NET 3.5作业的面试问题是“迭代器和枚举器有什么区别”? 这是要做出的核心区分,对于LINQ等等。 无论如何,有什么区别?我似乎在网上找不到可靠的定义。没错,我可以找到两个术语的含义,但是得到的答案略有不同。面试的最佳答案是什么? IMO迭代器在集合上“迭代”,并且枚举器提供了迭代功能,但这必须调用。 另外,据说使用yield关键字可以保存状态。这个状态到底是什么?有这种好处发生的例子吗?

1
列表理解和生成器表达式的收益
以下行为对我来说似乎很违反直觉(Python 3.4): >>> [(yield i) for i in range(3)] <generator object <listcomp> at 0x0245C148> >>> list([(yield i) for i in range(3)]) [0, 1, 2] >>> list((yield i) for i in range(3)) [0, None, 1, None, 2, None] 最后一行的中间值实际上并不总是None,它们是send生成器中使用的值,相当于(我想)以下生成器: def f(): for i in range(3): yield (yield i) 这三行代码完全起作用使我感到很有趣。该参考指出,yield仅在一个函数定义允许的(虽然我可能读错和/或它可能只是已经从旧版本复制)。前两行在SyntaxErrorPython 2.7中产生a ,但第三行却没有。 …

6
生成器可以递归吗?
我天真地尝试创建一个递归生成器。没用 这是我所做的: def recursive_generator(lis): yield lis[0] recursive_generator(lis[1:]) for k in recursive_generator([6,3,9,1]): print(k) 我所得到的只是第一项6。 有没有办法使这种代码起作用?本质yield上是在递归方案中将命令转移到以上级别吗?

6
为什么Python中没有第一个(可迭代的)内置函数?
我想知道是否有某种原因,first(iterable)Python内置函数中没有这个原因,它与any(iterable)和相似all(iterable)(它可能藏在stdlib模块中的某个地方,但我看不到itertools)。first将执行短路发生器评估,以便避免不必要的操作(以及可能无限次数的操作);即 def identity(item): return item def first(iterable, predicate=identity): for item in iterable: if predicate(item): return item raise ValueError('No satisfactory value found') 这样,您可以表达以下内容: denominators = (2, 3, 4, 5) lcd = first(i for i in itertools.count(1) if all(i % denominators == 0 for denominator in denominators)) 显然,list(generator)[0]在这种情况下您无法执行此操作,因为生成器不会终止。 或者,如果您有一堆要匹配的正则表达式(当它们都具有相同的groupdict接口时很有用): match = first(regex.match(big_text) …

6
计算生成器/迭代器中项目数的最短方法是什么?
如果我希望迭代中的项目数量而不关心元素本身,那么实现该目标的Python方法是什么?现在,我将定义 def ilen(it): return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3 但我知道自己lambda几乎被认为是有害的,而且lambda _: 1肯定不是很漂亮。 (这种情况的用例是计算文本文件中与regex相匹配的行数,即grep -c。)

6
将“ yield from”语句转换为Python 2.7代码
我在Python 3.2中有一个下面的代码,我想在Python 2.7中运行它。我确实进行了转换(missing_elements在两个版本中都放了代码),但是我不确定这是否是最有效的方法。基本上,如果函数的yield from上半部和下半部有两个类似下面的调用,会发生什么情况missing_element?是否将两个半部分(上半部分和下半部分)中的条目彼此追加到一个列表中,以便父递归函数与yield from调用一起使用,并将两个半部分一起使用? def missing_elements(L, start, end): # Python 3.2 if end - start <= 1: if L[end] - L[start] > 1: yield from range(L[start] + 1, L[end]) return index = start + (end - start) // 2 # is the lower half consecutive? consecutive_low = L[index] == …

1
为什么下一个为什么会引发“ StopIteration”,而“ for”却会正常返回?
在这段代码中,为什么使用for结果为noStopIteration 或for循环捕获所有异常然后静默退出?在这种情况下,为什么会有多余的return?还是由以下 raise StopIteration原因引起的return None? #!/usr/bin/python3.1 def countdown(n): print("counting down") while n >= 9: yield n n -= 1 return for x in countdown(10): print(x) c = countdown(10) next(c) next(c) next(c) 假设StopIteration由触发return None。什么时候GeneratorExit产生的? def countdown(n): print("Counting down from %d" % n) try: while n > 0: yield n n = …

8
在Python中获取生成器的第n个项
有没有一种语法更简洁的方式编写以下内容? gen = (i for i in xrange(10)) index = 5 for i, v in enumerate(gen): if i is index: return v 生成器应该具有一个gen[index]表达式,该表达式充当列表,但在功能上与上述代码相同,这似乎是很自然的。
70 python  generator 

4
列表字典的笛卡尔积
我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。 我看过了itertools,但是它的product功能并不是我想要的。是否有一种简单明了的方法来获取一个字典,每个字典中包含任意数量的键和每个值中任意数量的元素,然后生成具有下一个排列的字典? 输入: options = {"number": [1,2,3], "color": ["orange","blue"] } print list( my_product(options) ) 输出示例: [ {"number": 1, "color": "orange"}, {"number": 1, "color": "blue"}, {"number": 2, "color": "orange"}, {"number": 2, "color": "blue"}, {"number": 3, "color": "orange"}, {"number": 3, "color": "blue"} ]

7
压缩的Python生成器,第二个生成器更短:如何检索静默消耗的元素
我想解析2个(可能)长度不同的生成器zip: for el1, el2 in zip(gen1, gen2): print(el1, el2) 但是,如果gen2元素较少,gen1则“消耗” 一个额外的元素。 例如, def my_gen(n:int): for i in range(n): yield i gen1 = my_gen(10) gen2 = my_gen(8) list(zip(gen1, gen2)) # Last tuple is (7, 7) print(next(gen1)) # printed value is "9" => 8 is missing gen1 = my_gen(8) gen2 = my_gen(10) …

5
从调用生成器的函数返回还是让出?
我有一个生成器generator,还有一个便捷的方法- generate_all。 def generator(some_list): for i in some_list: yield do_something(i) def generate_all(): some_list = get_the_list() return generator(some_list) # <-- Is this supposed to be return or yield? 应该generate_all return还是yield?我希望两种方法的用户都使用相同的方法,即 for x in generate_all() 应该等于 some_list = get_the_list() for x in generate(some_list)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.