Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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_Function - Fatal编程技术网

函数在python中使用之前是否应该定义?

函数在python中使用之前是否应该定义?,python,function,Python,Function,在使用之前是否应该定义这些函数?但为什么以下代码有效: def main(): dog() def dog(): print("This is a dog.") if __name__ == '__main__': main() 我的意思是dog()是在被调用后定义的,它是如何工作的?名称dog被查找为全局名称。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数main()在被调用之前不会使用dog 如果未定义dog,调用main()将导致na

在使用之前是否应该定义这些函数?但为什么以下代码有效:

def main():
    dog()

def dog():
    print("This is a dog.")

if __name__ == '__main__':
    main()

我的意思是dog()是在被调用后定义的,它是如何工作的?

名称
dog
被查找为全局名称。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数
main()
在被调用之前不会使用
dog

如果未定义
dog
,调用
main()
将导致
namererror
异常:

>>> def main():
...     return dog()
... 
>>> main()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in main
NameError: global name 'dog' is not defined
>>> def dog():
...     return 'Woof!'
... 
>>> main()
'Woof!'

因为在上一个示例中,
dog
现在绑定到一个字符串,所以当尝试调用它时,
main
函数失败。

名称
dog
被查找为全局变量。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数
main()
在被调用之前不会使用
dog

如果未定义
dog
,调用
main()
将导致
namererror
异常:

>>> def main():
...     return dog()
... 
>>> main()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in main
NameError: global name 'dog' is not defined
>>> def dog():
...     return 'Woof!'
... 
>>> main()
'Woof!'
因为在上一个示例中,
dog
现在绑定到一个字符串,所以当尝试调用它时,
main
函数失败。

实际上它不是(在调用之后定义的)。此脚本将执行以下操作:

  • 创建函数并将其分配给“main”
  • 创建函数并将其分配给“dog”
  • 呼叫“主”
在这一点上,
dog
在全局范围内是已知的,并且
main
可以调用它。

实际上它不是(在调用之后定义)。此脚本将执行以下操作:

  • 创建函数并将其分配给“main”
  • 创建函数并将其分配给“dog”
  • 呼叫“主”

此时,
dog
在全局范围内已经是已知的,并且
main
可以调用它。

函数块/方法中的代码在调用函数之前不会执行。而且CPython语言实现(这是最常见的一种,您可能正在使用的实现)在编译时不会像C这样进行名称检查。因为它主要是一种解释语言,所以它会在运行时动态检查名称空间中的名称是否可用

此外,关于Python您应该知道的是,类中的代码在创建类时执行,而方法/函数中的代码则不执行。
def
语句只是将函数名添加到名称空间中。在调用函数之前,它不会在函数本身中运行任何代码

考虑以下合法的Python代码

class Something:
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()
这是完全合法的,因为在定义
Dog
类之前,不会运行
\uuuu init\uuu
。但是如果我们把构造函数移到创建类Dog的上面呢

这段代码会抱怨NameError,因为Dog还没有定义

class Something:
    def __init__(self):
        self.puppy = Dog()

inst = Something()

class Dog:
    def __init__(self):
        pass
最后一个例子

此代码将抱怨相同的名称错误

class Something:
    my_puppy = Dog()
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()

这是因为
Something
中的所有代码都会立即执行,在执行过程中,命名空间/作用域无权访问名称
Dog

函数块/方法中的代码不会在调用函数之前执行。而且CPython语言实现(这是最常见的一种,您可能正在使用的实现)在编译时不会像C这样进行名称检查。因为它主要是一种解释语言,所以它会在运行时动态检查名称空间中的名称是否可用

此外,关于Python您应该知道的是,类中的代码在创建类时执行,而方法/函数中的代码则不执行。
def
语句只是将函数名添加到名称空间中。在调用函数之前,它不会在函数本身中运行任何代码

考虑以下合法的Python代码

class Something:
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()
这是完全合法的,因为在定义
Dog
类之前,不会运行
\uuuu init\uuu
。但是如果我们把构造函数移到创建类Dog的上面呢

这段代码会抱怨NameError,因为Dog还没有定义

class Something:
    def __init__(self):
        self.puppy = Dog()

inst = Something()

class Dog:
    def __init__(self):
        pass
最后一个例子

此代码将抱怨相同的名称错误

class Something:
    my_puppy = Dog()
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()

这是因为
Something
中的所有代码都会立即执行,并且在执行过程中,命名空间/作用域无法访问名称
Dog

,可能是因为
Dog
函数位于此脚本的命名空间中。可能是因为
Dog
函数位于此脚本的命名空间中。