Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python是否在一个公式中多次重复计算函数值_Python - Fatal编程技术网

python是否在一个公式中多次重复计算函数值

python是否在一个公式中多次重复计算函数值,python,Python,在python中,如果我有一个函数 f(x)=(g(x)+1)(g(x)) g(x)是在之前定义的,需要时间来计算 像这样的东西 def g(x): return value def f(x): return (g(x)+1)*(g(x)) 当我计算f(x)时,python会在将g(x)代入方程时计算g(x)两次吗? 如果它计算了两次,人们通常如何在python中处理它 在将g(x)替换为 方程式 对。由于函数调用两次,因此将计算两次 人们通常如何在python中处理它 调用函数并存储

在python中,如果我有一个函数

f(x)=(g(x)+1)(g(x))

g(x)是在之前定义的,需要时间来计算

像这样的东西

def g(x):
  return value
def f(x):
  return (g(x)+1)*(g(x))
当我计算f(x)时,python会在将g(x)代入方程时计算g(x)两次吗? 如果它计算了两次,人们通常如何在python中处理它

在将g(x)替换为 方程式

对。由于函数调用两次,因此将计算两次

人们通常如何在python中处理它

调用函数并存储值以供以后使用

def f(x):
   value_g = g(x)
   return (value_g+1) * (value_g)

g
中检查-打印某些内容很容易,并查看它被打印了多少次。
无论如何,是的。它将调用
g
两次。
我所知道的处理它的最好方法是创建一个等于方法返回值的局部变量,然后改用它

def f(x):
    g_result = g(x)
    return (g_result + 1) * g_result

根据函数
g(x)
,是的,每次调用时都会再次计算。对于给定的
x
,记忆函数()只需计算一次值。例如:

def g(x):
    if cache[x]:
        return cache[x]
    else:
        result = # calculate g(x)
        cache[x] = result
        return cache[x] # or return result

我觉得你问题的第一部分得到了很好的回答,但关于:

人们通常如何在python中处理它

如果需要两次
函数
g(x)
的输出,只需将其存储在
变量
中(至少对我而言)是有意义的。由于
功能
应如何工作的性质(没有
全局
影响,如
时间
),相同的
输入
应始终提供相同的
输出

因此,假设这个
函数
需要
1
分钟来计算,如果我们想使用输出两次,那么调用它两次就没有意义了,因为它现在需要两倍的时间:
2
分钟。如上所述,您可以使用memonization,也可以将
g(x)
的输出存储在
变量中

例如


您可以通过将
print
调用放在
g
中轻松找到这一点。是的,它将计算两次。您可以通过将结果存储在变量中来处理它。这不是Python特有的,但对所有编程语言都是通用的,不考虑编译器优化。如果您想让函数更像数学,可以记忆函数
g
。@dabadaba:Edited
calculate g(x)
应该被注释。编辑以添加注释这个想法是可以理解的,但是由于无限递归,您需要以不同的方式计算值(比如
缓存[x]=\u g(x)
其中
\u g
是原始函数)。编辑以避免在g(x)上递归
def g(x):
    if cache[x]:
        return cache[x]
    else:
        result = # calculate g(x)
        cache[x] = result
        return cache[x] # or return result
def f(x):
   gx = g(x)
   return: (gx+1) * gx