【问题标题】:Python loop for constructing an increasingly longer function用于构造越来越长的函数的 Python 循环
【发布时间】:2020-11-15 23:48:43
【问题描述】:

我的代码在任意天数都遵循以下模式。有没有办法制作某种循环来简化它,而不必对每个案例进行硬编码?我必须在没有循环的情况下编写大约 400 行。

if dia == 0: mapa[dia] = mapa[dia]
if dia == 1: mapa[dia] = mapa[dia].subtract(mapa[0])   
if dia == 2: mapa[dia] = mapa[dia].subtract(mapa[0]).subtract(mapa[1])
if dia == 3: mapa[dia] = mapa[dia].subtract(mapa[0]).subtract(mapa[1]).subtract(mapa[2])
if dia == 4: mapa[dia] = mapa[dia].subtract(mapa[0]).subtract(mapa[1]).subtract(mapa[2]).subtract(mapa[3])
if dia == 5: mapa[dia] = mapa[dia].subtract(mapa[0]).subtract(mapa[1]).subtract(mapa[2]).subtract(mapa[3]).subtract(mapa[4])
if dia == 6: mapa[dia] = mapa[dia].subtract(mapa[0]).subtract(mapa[1]).subtract(mapa[2]).subtract(mapa[3]).subtract(mapa[4]).subtract(mapa[5])

【问题讨论】:

标签: python python-3.x function loops


【解决方案1】:

按照 Olvin Roght 的建议,reduce() 变体将是:

mapa[dia] = reduce(function = lambda x, y: x.substract(y), 
                   iterable = [mapa[dia]] + [mapa[n] for n in range(0, dia)]])

我们可以提供一个以mapa[dia] 开头然后跟随所有数字的迭代,或者使用initializer 参数,这在操作的第一个元素与下一个元素的顺序不同时非常有用。后一种情况很好,因为我们可以使用生成器而不是手动构建列表并释放一些内存。

mapa[dia] = reduce(function = lambda x, y: x.substract(y),
                   iterable = (mapa[n] for n in range(0, dia)),
                   initializer = mapa[dia])

这里,第一个xmapa[dia],第一个ymapa[0],然后下一个xmapa[dia].substract(mapa[0]),下一个ymapa[1],等等……

现在我们需要测试reducefor 循环中哪种方法更快。

【讨论】:

  • 这很有帮助。这是我第一次设法理解reduce函数。谢谢。
  • 我也是!试图回答你促使我看看它是如何工作的。很高兴它有帮助:)
  • @Guimute,如果您不想创建临时列表,您也可以切片列表mapa[:dia] 或使用islice()(恕我直言,那里的生成器看起来有点奇怪).
【解决方案2】:

要么使用 reduce ,要么使用简单的 forloop 就可以了

for i in range(dia):
    mapa[dia] = mapa[dia].subtract(mapa[i])

【讨论】:

    最近更新 更多