Pythonic方法将函数重新应用于自己的输出n次?

时间:2017-08-26 08:24:41

标签: python python-3.x tail-recursion built-in

假设有一些有用的转换函数,例如random_spelling_error,我们想要应用 n 次。

我的临时解决方案如下:

def reapply(n, fn, arg):
    for i in range(n):
        arg = fn(arg)
    return arg


reapply(3, random_spelling_error, "This is not a test!")

是否有内置或其他更好的方法来执行此操作?

它不需要处理变长args或关键字args,但它可以。该函数将按比例调用,但 n 的值将较低,参数和返回值的大小将很小。

我们可以调用此reduce,但该名称当然是针对一个可以执行此操作且功能太多的函数,并已在Python 3中删除。以下是Guido's argument

  

所以在我看来,reduce()的适用性几乎受到限制   关联运算符,在所有其他情况下,最好写出来   积累循环明确。

3 个答案:

答案 0 :(得分:1)

使用reduce模块在​​python 3中仍然可以使用

functools。我真的不知道它更像是pythonic,但是你可以在一条线上实现它:

from functools import reduce

def reapply(n, fn, arg):
    return reduce(lambda x, _: fn(x), range(n), arg)

答案 1 :(得分:0)

有些像递归,并不总是显然更好'

def reapply(n, fn, arg):
    if n:
        arg = reapply(n-1, fn, fn(arg))
    return arg


reapply(1, lambda x: x**2, 2)
Out[161]: 4

reapply(2, lambda x: x**2, 2)
Out[162]: 16

答案 2 :(得分:0)

完全摆脱自定义功能,您尝试将两条可读行压缩为一个令人困惑的函数调用。您认为哪一种更易于阅读和理解:

foo = reapply(3, random_spelling_error, foo)

或者是一个简单的for循环,还有一行:

for _ in range(3):
    foo = random_spelling_error(foo)

更新:根据您的评论

  

让我们假设我可能想要应用许多转换函数。

为什么不尝试这样的事情:

modifiers = (random_spelling_error, another_function, apply_this_too)
for modifier in modifiers:
    for _ in range(3):
        foo = modifier(foo)

或者,如果您需要针对不同功能的不同重复次数,请尝试创建元组列表:

modifiers = [
    (random_spelling_error, 5),
    (another_function, 3),
    ...
]

for modifier, count in modifiers:
    for _ in range(count):
        foo = modifier(foo)