在Python中可以在声明函数体之前使用函数吗?

15 投票
5 回答
13981 浏览
提问于 2025-04-15 17:03

有没有办法让你在文件中使用函数之前,就能调用它们,而不需要先写出函数的具体内容呢?

下面的代码似乎不能正常工作:

abc = myFunction

def myFunction():
    print "123"

谢谢

5 个回答

1

简单来说,答案是否定的。

在Python中,代码是边解析边执行的——也就是说,myFunction 这个函数在解析的时候还没被处理,所以Python并不知道它的存在。

13

你可以声明一些使用前向声明的函数,但Python会从上到下逐行执行你的代码。所以,这段代码会编译并运行:

def foo():
    print "in foo"
    bar()

def bar():
    print "in bar"
    foo()

foo()

(当然,这会在运行时导致栈溢出)。在你的例子中,Python在myFunction被定义之前就已经执行了这一行

abc = myFunction

。你可以把这想象成你在交互式解释器中输入代码。当你输入赋值时,其实你还没输入 myFunction的定义,所以Python无法引用它。

另一种理解方式是:

>>> myFunction = "hello"
>>> abc = myFunction
>>> def myFunction():
...     print "there"
... 
>>> abc
'hello'
>>> myFunction
<function myFunction at 0x63270>
>>> myFunction()
there

如你所见,myFunction函数的定义只是将符号myFunction与一个函数对象绑定在一起。

21

你不能在给myFunction变量赋值之前就使用它。你的示例代码其实很像:

def myFunction():
    print abc
    abc = 123

要实现你想要的效果,可以调整一下顺序:

def myFunction():
    print "123"

abc = myFunction

或者把abc声明为一个代理:

# Style 1
abc = lambda: myFunction()

# Style 2
def abc():
    return myFunction()

def myFunction():
    print "123"

如果你的函数需要接收参数,可以使用*args**kwargs

# Style 1
abc = lambda *args, **kwargs: myFunction(*args, **kwargs)

# Style 2
def abc(*args, **kwargs):
    return myFunction(*args, **kwargs)

def myFunction(x):
    print x

撰写回答