Python 如果我们(不正当地)要求解释器评估组合f(f),会发生什么? >>>方 4. >>>flambda z:z*z+1 6. >>>ff TypeError:“int”对象不可调用

Python 如果我们(不正当地)要求解释器评估组合f(f),会发生什么? >>>方 4. >>>flambda z:z*z+1 6. >>>ff TypeError:“int”对象不可调用,python,function,lambda,Python,Function,Lambda,我的解释是: 我认为在fg中,g作为一个参数必须是一个函数,这样较低级别的函数可以用g=2的参数调用。然而,正如前面提到的,由于ff将自己作为一个函数调用,g必须是一个函数。但是,f2是不可调用的。因此导致了一个错误 我不确定我是否充分解释了为什么参数g必须是一个函数。关于我是否完整地解释了这个问题。f是一个函数,它接受一个参数g,它必须是可调用的,可以应用于int。也就是说,使用类型模块中的类型暗示语法,我们可以说: def fg:可调用[int,T]->T: 返回g2 f本身是否具有可调用的

我的解释是:

我认为在fg中,g作为一个参数必须是一个函数,这样较低级别的函数可以用g=2的参数调用。然而,正如前面提到的,由于ff将自己作为一个函数调用,g必须是一个函数。但是,f2是不可调用的。因此导致了一个错误

我不确定我是否充分解释了为什么参数g必须是一个函数。关于我是否完整地解释了这个问题。

f是一个函数,它接受一个参数g,它必须是可调用的,可以应用于int。也就是说,使用类型模块中的类型暗示语法,我们可以说:

def fg:可调用[int,T]->T: 返回g2 f本身是否具有可调用的类型[int,T]?不。int不是可调用的[int,T]。因此ff是一个无效的应用程序;如果你用的是这样的工具,它会捕捉到这个

在运行时,实际上不会检查类型提示。但是运行时类型仍然以相同的方式相互影响

调用ff会导致以下调用:

ff表示g是f,并导致调用f2 f2表示g为2,并导致尝试评估22 将运算符应用于g意味着调用_调用_特殊方法,但int不实现_调用_。因此,您会收到您描述的错误消息:

TypeError:“int”对象不可调用
我想你的意思是g=2使g不能调用,因为它是一个整数。如果你不确定这个操作,那么你的下一步就是检查你的详细信息。插入打印命令以显示类型和值,尤其是f中的第一条语句。如果将最终语句划分为result=g2,则可以获得更多的信息;返回结果。在一般情况下,我看不出评估ff本身有问题。例如,对于def fg:返回g,ff没有问题。只有当您从FTF返回不可调用时,问题才会出现。从f返回不可调用时没有问题。但是由于f调用它接收的可调用参数作为其参数,在本例中传递一个特定值2作为该调用的参数,因此当给定该值时,可调用参数f接收需要正确运行。实际上,对于许多可调用的值来说,这可能是正确的,但对于f本身则不然。
def f(g):
    return g(2)

def square(x):
    return x ** 2