Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中声明函数体之前是否可以使用函数?_Python - Fatal编程技术网

在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()