繁体   English   中英

如果python“一行一行”运行文件,它如何在定义之前使用函数?

[英]If python run the file "line after line" how can it use a function before it's been defined?

我现在正在学习python,在学习了Java之后,现在我知道java首先编译整个文件然后运行它,从我理解的python中它运行程序,同时它“逐行”编译它。

所以我不明白的是如何在定义函数之前调用它。 我在 Java 中习惯于在需要它们的方法之后编写我所有的“帮助方法”,我认为这样更容易阅读。 所以我尝试在 python 中做同样的事情,它奏效了。 为什么?

这里的一个重要说明是,创建函数顺序并不重要,重要的是何时调用函数

以下面的代码为例:

def add_one(new):
    return my_add(new, 1)

def my_add(x, y):
    return x + y

my_var = 2
print("The value of my_var is: {}".format(my_var))
my_var = add_one(my_var)
print("The value of my_var is: {}".format(my_var))

它产生

my_var 的值为:2

my_var 的值为:3

发生这种情况是因为在调用add_one函数时,这两个函数都已经存在。 但是,如果尝试和呼叫add_one之前定义my_add ...

def add_one(new):
    return my_add(new, 1)

my_var = 2
print("The value of my_var is: {}".format(my_var))
my_var = add_one(my_var)
print("The value of my_var is: {}".format(my_var))

def my_add(x, y):
    return x + y

我们得到:

The value of my_var is: 2
Traceback (most recent call last):
  File "c:\Users\wundermahn\Desktop\Stack.py", line 6, in <module>
    my_var = add_one(my_var)
  File "c:\Users\J39304\Desktop\Stack.py", line 2, in add_one
    return my_add(new, 1)
NameError: name 'my_add' is not defined

请参阅Python 脚本中的函数顺序是否重要? 更多

您不能在定义之前调用函数。 这个程序会抛出一个异常:

foo()

def foo():
    print("Hello from foo")

如果这不是您的意思,请更新您的问题以使其更具体。

简短的回答是:你不能

大多数较长的python程序都包含这样的语句:

if __name__ == "__main__":
    # do something which is usually call a 'main()' function

在他们的主脚本的最后,这意味着 if 语句的内容只有当这个文件被执行时才会执行,而不是被导入。

所有的函数都必须在被调用之前定义,当它到达文件底部的 if 语句时,它们都已经定义好了。

为了补充其他答案,我只想提一下,虽然运行时的代码执行是顺序的,但当解释器遇到函数定义时,只会执行定义行。 这是引用文档

函数定义不执行函数体; this 仅在调用函数时执行。 ...

这也导致可变类型作为默认参数值的值得注意的行为。 很高兴知道这一点,否则事情会变得非常令人惊讶:

执行函数定义时从左到右计算默认参数值。 这意味着表达式会在定义函数时计算一次,并且每次调用都使用相同的“预计算”值。 这对于理解何时默认参数是可变对象(例如列表或字典)尤其重要:如果函数修改了对象(例如,通过将项目附加到列表),则默认值实际上被修改了。 这通常不是预期的。 解决这个问题的一种方法是使用None作为默认值,并在函数体中明确测试它,例如:

def whats_on_the_telly(penguin=None):
    if penguin is None:  # this conditional ensures the expected behavior
        penguin = []
    penguin.append("property of the zoo")
    return penguin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM