在Python中调用函数的含义?

时间:2016-11-08 05:13:32

标签: 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)

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

x = Dense(64, activation='relu')(inputs)

为什么会出现"(输入)"在函数" Dense"的参数列表的括号之外?

1 个答案:

答案 0 :(得分:6)

因为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

此处,make_adder(3)返回定义为

的函数
def the_adder(b)
    return 3 + b

然后使用参数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