在python中声明函数体之前是否可以使用函数?
在您实际声明函数体之前,是否有任何方法可以使用文件中的函数 以下代码似乎不起作用:在python中声明函数体之前是否可以使用函数?,python,Python,在您实际声明函数体之前,是否有任何方法可以使用文件中的函数 以下代码似乎不起作用: abc = myFunction def myFunction(): print "123" 谢谢简短的回答是不 在Python中,语句在被解析时会被求值-myFunction没有被解析,所以Python不知道它。您可以声明使用前向声明的函数,但Python在源代码中自上而下执行代码。因此,这将编译并运行: def foo(): print "in foo" bar() def ba
abc = myFunction
def myFunction():
print "123"
谢谢简短的回答是不
在Python中,语句在被解析时会被求值-myFunction
没有被解析,所以Python不知道它。您可以声明使用前向声明的函数,但Python在源代码中自上而下执行代码。因此,这将编译并运行:
def foo():
print "in foo"
bar()
def bar():
print "in bar"
foo()
foo()
(当然,除了在运行时会导致堆栈溢出之外)。在您的示例中,Python正在执行该行
在此之前,myFunction
被定义为任何内容。您可以通过在解释器中以交互方式键入源代码来考虑这一点。当您键入赋值时,您甚至还没有键入myFunction
的定义,因此Python无法引用它
另一种看待这一点的方法可能是:
>>> myFunction = "hello"
>>> abc = myFunction
>>> def myFunction():
... print "there"
...
>>> abc
'hello'
>>> myFunction
<function myFunction at 0x63270>
>>> myFunction()
there
myFunction=“你好”
>>>abc=myFunction
>>>def myFunction():
... 打印“那里”
...
>>>abc
“你好”
>>>我的功能
>>>myFunction()
那里
如您所见,
myFunction
函数的定义只会更改符号myFunction
与函数对象的绑定。在赋值之前,不能使用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
您可以声明一个空函数,使用它来设置属性或类似的内容,然后稍后修改其代码
def myFunction():
pass
myFunction.foo = 'bar'
def makeFunction(obj):
def myFunction():
print "123"
f = myFunction
for attr in dir(obj):
if attr not in dir(f):
setattr(f, attr, getattr(obj, attr))
return f
myFunction = makeFunction(myFunction)
myFunction()
print myFunction.foo
Python将在遇到对任何名称(有效变量/类/函数/对象名的标记)的任何引用时引发NameError,因为之前没有对该名称进行绑定 Python解释器在读取文件时执行文件的源代码。因此,
def foo():
实际上是在加载代码时定义foo()
的语句
很容易认为正向引用是受支持的。考虑这一点:
def foo():
return abc
abc="FooBar, Dude"
print foo()
。。。您将看到它可以毫无问题地运行。最好将foo()
的定义视为引用。在调用函数之前,不会计算内容。因此不会引发NameError(只要在调用函数之前已将某个值绑定到名称“abc”)
请注意,其中一些语义与Java、C/C++和Perl等语言的语义完全不同,Pythonistas通常更喜欢使用稍有不同的术语。变量等称为“名称”,将它们与值(或更一般地说,对象)关联的过程称为“绑定”因此,您不是“为变量赋值”,而是“将对象绑定到名称”
非正式的名称,特别是对于简单的数字或字符串对象,称为“变量”像
x='foo'
这样的语句被称为赋值。语义通常非常相似,我们不会在意。Hi.我想知道是否有一种方法可以对接受参数的函数使用style#1。thanksPradyot:use*args and*kwargs.abc=lambda*args,**kwargs:myFunction(*args,**kwargs)
def foo():
return abc
abc="FooBar, Dude"
print foo()