在Python中可以在声明函数体之前使用函数吗?
有没有办法让你在文件中使用函数之前,就能调用它们,而不需要先写出函数的具体内容呢?
下面的代码似乎不能正常工作:
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