Python 将函数反复应用于变量

Python 将函数反复应用于变量,python,Python,有没有更好的方法可以将函数反复应用于变量,而不必使用for循环(理想情况下在标准库中也是如此)?我现在拥有的示例: def simulation(): wealth = 0 for i in range(1000): wealth = gamble(wealth) return wealth 我喜欢的是 我可以想到的另一种选择是将与一起使用: from itertools import repeat wealth = 0 # dummy gable fu

有没有更好的方法可以将函数反复应用于变量,而不必使用for循环(理想情况下在标准库中也是如此)?我现在拥有的示例:

def simulation():
    wealth = 0
    for i in range(1000):
       wealth = gamble(wealth)
    return wealth
我喜欢的是


我可以想到的另一种选择是将一起使用:

from itertools import repeat
wealth = 0

# dummy gable function
def gamble(wealth): 
    return wealth

z = map(gamble, repeat(wealth, times=1000))
您仍然需要对其进行迭代(或对其调用
list()
)以使其执行

这是函数是否应作用于相同的值。如果您需要多次调用它自己,您也可以使用decorator(或
reduce
,但添加它没有意义,因为@Austin这样做了):


我可以想到的另一种选择是将一起使用:

from itertools import repeat
wealth = 0

# dummy gable function
def gamble(wealth): 
    return wealth

z = map(gamble, repeat(wealth, times=1000))
您仍然需要对其进行迭代(或对其调用
list()
)以使其执行

这是函数是否应作用于相同的值。如果您需要多次调用它自己,您也可以使用decorator(或
reduce
,但添加它没有意义,因为@Austin这样做了):


不幸的是,没有内置的或标准的库函数可以完全满足您的需要

虽然您可以扭曲现有函数使其工作,但是
for
循环可能比所需的代码更具可读性。一、 首先,我更愿意阅读您当前的代码,而不是非常聪明的版本。我可以立即理解
for
循环、
reduce
调用和忽略第二个参数的
lambda
都需要更多的思考


因此,在“简化”代码之前,请仔细考虑,并确保简化不会使代码更难理解。

不幸的是,没有内置或标准库函数可以完全满足您的需要

虽然您可以扭曲现有函数使其工作,但是
for
循环可能比所需的代码更具可读性。一、 首先,我更愿意阅读您当前的代码,而不是非常聪明的版本。我可以立即理解
for
循环、
reduce
调用和忽略第二个参数的
lambda
都需要更多的思考


因此,在“简化”代码之前,请仔细考虑,并确保简化不会使代码更难理解。

因为您在反复做一些事情,所以总会有一个循环。为什么要隐藏它?@Blckknght因为有时循环不是代码中“最重要”或“最具描述性”的部分。名字“reduce”和“map”以及“grep”和“zip”都是循环结构,但它们不仅仅是循环,而且传递它们所做的事情。因为你在一次又一次地做一些事情,所以在某个地方总会有一个循环。为什么要隐藏它?@Blckknght因为有时循环不是代码中“最重要”或“最具描述性”的部分。名称“reduce”和“map”以及“grep”和“zip”都是循环结构,但它们不仅仅是循环,而且传递它们所做的事情。这会给你一个相同的返回值列表,而不是
gamble(gamble(…(gamble(wealth)…))
@chepner对,我确实对此感到困惑。我添加了一个decorator解决方案,如果我没有弄错的话,它可以完成这个任务。这会给你一个相同的返回值列表,而不是
gamble(gamble(…(gamble(wealth)…))
@chepner对,我确实对此感到困惑。我添加了一个decorator解决方案,如果我没有弄错的话,它可以实现这个目的。
def apply(f, times=10):
    def func(*args, **kwargs):
        nonlocal times
        times -= 1
        if times:
            return func(f(*args, **kwargs))
    return func

@apply
def foo(val): 
    val += 1
    print(val, end = " ")
    return val

foo(10)
11 12 13 14 15 16 17 18 19
# python 3
from functools import reduce
return reduce(lambda w,i: gamble(w), range(1000), 0)