我目前正在玩 Python 中的 Project Euler 问题 53。该解决方案非常简单,但涉及以下列表理解:

[scipy.misc.comb(n, r, exact=True)
 for n in range(1,maxn+1)
 for r in range(0,n+1)
 if scipy.misc.comb(n, r, exact=True) > threshold]

我担心的是,每次迭代都会调用 scipy.misc.comb() 函数两次。有没有办法用某种引用替换它的一次或其他出现;或者,解释器是否足够聪明以意识到这两个实例将评估为同一件事?

最佳答案

您可以将 scipy.misc.comb() 函数放入生成器表达式中:

[comb for comb in
    (scipy.misc.comb(n, r, exact=True)
     for n in range(1,maxn+1) for r in range(0,n+1))
 if comb > threshold]

并且每次迭代都会在生成器上计算一次。

将生成器表达式放入一个单独的变量中可能会更清楚:
calculated = (scipy.misc.comb(n, r, exact=True)
              for n in range(1,maxn+1) for r in range(0,n+1))
[comb for comb in calculated if comb > threshold]

将此视为传送带; calculated 生成器仅在列表理解对其进行迭代时生成其输出。

10-08 01:57