在Python中调用函数的含义?

Zhi*_* Lu 2 python keras

我在Keras的教程中看到了一个Python函数调用方式,如下所示:

from keras.layers import Input, Dense
from keras.models import Model

# this returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
Run Code Online (Sandbox Code Playgroud)

但是,我不知道函数调用形式的含义是什么:

x = Dense(64, activation='relu')(inputs)
Run Code Online (Sandbox Code Playgroud)

为什么在"密集"功能参数列表的括号外有"(输入)"?

Ama*_*dan 8

因为Dense(...)返回一个可调用的(基本上是一个函数),所以可以依次调用它.这是一个简单的例子:

def make_adder(a):
    def the_adder(b):
        return a + b
    return the_adder

add_three = make_adder(3)
add_three(5)
# => 8

make_adder(3)(5)
# => 8
Run Code Online (Sandbox Code Playgroud)

在这里,make_adder(3)返回定义为的函数

def the_adder(b)
    return 3 + b
Run Code Online (Sandbox Code Playgroud)

然后用参数5返回调用该函数8.如果您跳过将返回值分配给make_adder(3)单独变量的步骤,则会得到您询问的表单:与您的问题make_adder(3)(5)相同Dense(64, activation='relu')(inputs).

编辑:从技术上讲,Dense不归类为Python中的函数,而是作为一个类; Dense(...)因此是一个构造函数的调用.有问题的类定义了该__call__方法,该方法使该类的对象"可调用".可以通过使用参数列表调用函数和可调用对象来调用它们,并且两者之间的差异根本不会影响解释.但是,这是一个简单的可调用的例子,它更接近平行Dense:

class Adder:
    def __init__(self, a):
        self.a = a
    def __call__(self, b):
        return self.a + b

adder_of_three = Adder(3)
adder_of_three(5)
# => 8

Adder(3)(5)
# => 8
Run Code Online (Sandbox Code Playgroud)