假设有一些有用的转换函数,例如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()的适用性几乎受到限制 关联运算符,在所有其他情况下,最好写出来 积累循环明确。
答案 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)