我的代码片段表现得很奇怪;我做了另一个来说明问题。我认为这两个片段应该产生相同的结果,但不会:
alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))
output = [np.mean([ a+b for a, b in args]) for _ in alphas]
产生
[4.0, nan, nan, nan, nan]
和
alphas = np.arange(5)
args = zip(np.arange(5), np.arange(5))
args = list(args) # <- this is the only difference
output = [np.mean([ a+b for a, b in args]) for _ in alphas]
产生
[4.0, 4.0, 4.0, 4.0, 4.0]
唯一的区别是生成器被转换为列表理解中的列表。 有没有人理解使结果不同的潜在机制?
答案 0 :(得分:2)
生成器仅生成一次输出序列。您的第一个表达式使用out for
的第一次迭代时的整个序列。当_
从0前进到1并循环再次遍历args
时,yield
没有任何内容,并且您有一个空的回报。这会导致nan
值为mean
。
在第二个示例中,args
是一个静态列表;您可以根据需要多次迭代。