如何将功能应用于自身?

Dem*_*nos 8 python

假设我有函数,f它接受一些变量并返回相同类型的变量.为简单起见,我们说

def f(x):
    return x/2+1
Run Code Online (Sandbox Code Playgroud)

我有兴趣f一遍又一遍地申请自己.有点像f(f(f(...(f(x))...))).

我可以这样做

s = f(x)
for i in range(100):
    s = f(s)
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种更简单,更简洁的方式来做同样的事情.我不想避免for循环(就像对自己的挑战).是否有某种使用方法map或类似功能来实现这一目标?

Joh*_*ica 8

是否有某种使用方法map或类似功能来实现这一目标?

map,但是reduce.我不会用它,但是你可以调用reduce一个n -item序列来f调用n次.例如:

>>> def f(x):
...   return x+1
... 
>>> reduce(lambda n,_: f(n), range(100), 42)
142
Run Code Online (Sandbox Code Playgroud)

说明:

  • n被赋予每个连续的返回值f.
  • _是来自的数字列表range(100).这些数字都被忽略了.重要的是有多少.
  • 42 是起始值.

100嵌套调用f(f(f...(f(42))...))结果142.


Jos*_*Lee 5

在 Python 中,for 循环是最符合人体工程学和可读性的方法。所以我认为这主要是一个练习 \xe2\x80\x94 这些在函数式语言中使用更自然。

\n\n

functools.reduce通过重复调用具有两个参数的函数,将值列表折叠为单个值。这是阶乘:

\n\n
>>> import functools, operator\n>>> operator.mul(2,3)\n6\n>>> functools.reduce(operator.mul, range(1, 10), 1)\n362880\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们可以滥用它来仅使用值列表的长度并忽略实际内容。

\n\n
>>> def f(x):\n...   return x/2+1\n... \n>>> functools.reduce(lambda x, y: f(x), range(10), 1)\n1.9990234375\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者我们可以将(一元)函数的n 个副本串在一个列表中,并通过将每个副本应用于累积值来折叠它们。

\n\n
>>> import itertools\n>>> functools.reduce(lambda x, g: g(x), itertools.repeat(f, 10), 1)\n1.9990234375\n
Run Code Online (Sandbox Code Playgroud)\n