在我提出问题之前,先感谢社区成为我最近编程疑问的权威位置。就当那些赞美话没有被明确表达过。不管怎样,概率定律决定了我会碰到一些无法通过多功能搜索栏找到的内容,因此我决定第一次明确地发问。可能是因为我没有用足够 Pythonic 的术语进行搜索,或者我不擅长使用 Google/Stackoverflow 搜索。不管怎样……
我正在尝试使用 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博士,我尝试将相同的概念映射到字典上,考虑到已经存在字典推导式,我认为这两个将是等价的:
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()
第一个是起作用的,但第二个不行。它在第三行的冒号处标记了一个语法错误。现在,要么我在语法上有很小的失误,要么我对生产者协同程序的工作原理有巨大的误解。我怀疑它失败的原因和你不能使协程返回列表而不是生成器是相同的,但我并不真正知道。
所以,是的,我基本上正在寻找解决那个错误的方法;提前谢谢。我更喜欢一个告诉我答案而不是给我一个全新的实现方式的答案,但如果这是唯一的方法...