【发布时间】:2011-10-06 19:04:20
【问题描述】:
在我说一句话之前,让我感谢社区是我最近的编程查询的权威位置。并假装这些赞美不是用语言表达的。无论如何,概率法则决定了我偶然发现了使用多功能搜索栏找不到的东西,所以我决定第一次明确要求。也许我只是没有使用足够 Pythonic 的术语进行搜索。或者我可能不喜欢谷歌搜索/Stackoverflowing。无论如何...
我在玩 Python 协程和生成器。据我所知,你可以用生产者协程做任何生成器理解可以做的事情,尽管更冗长。我目前正在使用 Python 3,尽管关于 Python 2 的任何答案都不会错过。
所以我假设以下代码片段是等效的:
one_to_three = (num for num in range(1, 4))
...
def one_to_three():
for num in range(1, 4):
yield num
one_to_three_gen = one_to_three()
它适用于我的 Python 安装。如果我忽略该代码中的冗余示例,我会发现生成器理解很容易映射到生产者协程生成的生成器。作为 Pragmatic 博士,我尝试将相同的概念映射到 dicts,因为 dict 理解已经存在,我认为这两者是等价的:
one_to_three_doubles = {num : num * 2 for num in range(1, 4)}
...
def one_to_three_doubles():
for num in range(1, 4):
yield num : num * 2
one_to_three_doubles_gen = one_to_three_doubles()
第一个有效,但第二个无效。它在第 3 行的冒号上标记语法错误。
现在,要么我在语法上稍有失误,要么我对生产者协程的工作方式有很大的误解。我怀疑它失败的原因与您不能让协程返回列表而不是生成器相反,但我真的不知道。
所以,是的,修复该错误基本上就是我所要求的;提前致谢。我更喜欢一个能告诉我答案的答案,而不是给我一个全新的方法来实现结果,但显然如果这是唯一的方法......
【问题讨论】:
-
您说的是生成器,而不是协程。如果你想知道协程真的是阅读A Curious Course on Coroutines and Concurrency.
-
我认为同时存在生产者和消费者协程,并且使用 yielding 模式创建序列是协程创建生成器表达式的简单用法,因为执行暂停并在每个值的产生时恢复,它是如何跟踪它的位置的?不过可能是错的。
标签: python dictionary generator list-comprehension