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

如果python运行文件“一行接一行”,在定义函数之前,它如何使用函数?,python,Python,我现在正在学习python,在学习Java之后,现在我知道Java首先编译整个文件,然后用python运行它,据我所知,它在逐行编译的同时运行程序 所以我不明白的是,在定义函数之前,如何调用它。 我习惯于从Java编写我所有的帮助方法,在需要它们的方法之后,我认为这样更容易阅读。 所以我试着用python做同样的事情,结果成功了。 为什么?在定义函数之前不能调用它。此程序将引发异常: foo() def foo(): print("Hello from foo") 如果这不是您的意思

我现在正在学习python,在学习Java之后,现在我知道Java首先编译整个文件,然后用python运行它,据我所知,它在逐行编译的同时运行程序

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

在定义函数之前不能调用它。此程序将引发异常:

foo()

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

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

在定义函数之前,您不能调用函数。此程序将引发异常:

foo()

def foo():
    print("Hello from foo")
如果这不是你的意思,请更新你的问题,使之更具体。

简短的回答是:你不能

大多数较长的python程序都包含如下语句:

if __name__ == "__main__":
    # do something which is usually call a 'main()' function
在主脚本的最末尾,这意味着if语句的内容仅在该文件被执行时执行,而不是被导入

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

简短的回答是:你不能

大多数较长的python程序都包含如下语句:

if __name__ == "__main__":
    # do something which is usually call a 'main()' function
在主脚本的最末尾,这意味着if语句的内容仅在该文件被执行时执行,而不是被导入


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

这里的一个重要标志是,重要的不是函数的创建顺序,而是函数的调用何时完成

以以下代码为例:

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

我们得到:

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

有关更多信息,请参见这里的一个重要名称是,重要的不是函数的创建顺序,而是函数的调用何时完成

以以下代码为例:

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

我们得到:

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

有关其他答案的更多信息,请参见,我只想指出,虽然运行时的代码执行是顺序的,但当解释器点击函数定义时,只执行定义行。以下是引述:

函数定义不执行函数体;这仅在调用函数时执行

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

执行函数定义时,从左到右计算默认参数值。这意味着在定义函数时,表达式只计算一次,并且每次调用都使用相同的“预计算”值。当默认参数是可变对象(如列表或字典)时,了解这一点尤为重要:如果函数修改对象(例如,通过向列表中添加项),则默认值实际上已修改。这通常不是我们的初衷。解决此问题的一种方法是使用None作为默认值,并在函数体中显式测试它,例如:

def tellypenguin上的内容=无: 如果penguin为None:此条件确保了预期的行为 企鹅=[] 企鹅。动物园的财产 回归企鹅
为了补充其他答案,我只想提到,虽然运行时的代码执行是顺序的,但当解释器点击函数定义时,只执行定义行。以下是引述:

函数定义不执行函数体;这仅在调用函数时执行

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

执行函数定义时,从左到右计算默认参数值。这意味着在定义函数时,表达式只计算一次,并且每次调用都使用相同的“预计算”值。了解默认参数是mutab时,这一点尤其重要 le对象,如列表或字典:如果函数修改对象,例如通过向列表中添加项目,则默认值实际上已修改。这通常不是我们的初衷。解决此问题的一种方法是使用None作为默认值,并在函数体中显式测试它,例如:

def tellypenguin上的内容=无: 如果penguin为None:此条件确保了预期的行为 企鹅=[] 企鹅。动物园的财产 回归企鹅
我习惯于从Java编写我所有的帮助方法,然后再编写需要它们的方法[…],所以我尝试用python做同样的事情,结果成功了。为什么?@Tomerikoo我不明白你的评论。我编写了一个非常简单的代码示例,说明在定义函数之前调用函数在python中不起作用,这与问题中的说法相反;因此需要澄清。OP描述了一个非常具体的场景,并想知道它是如何实现的。我同意这个问题本身不是很清楚,但无论如何也不要回答它……我习惯于从Java编写我所有的帮助方法,然后再编写需要它们的方法[…],所以我尝试用python做同样的事情,结果成功了。为什么?@Tomerikoo我不明白你的评论。我编写了一个非常简单的代码示例,说明在定义函数之前调用函数在python中不起作用,这与问题中的说法相反;因此需要澄清。OP描述了一个非常具体的场景,并想知道它是如何实现的。我同意这个问题本身不是很清楚,但无论如何也不要回答它…这里会有一个答案,因为人们不知道你的意思。一小段代码演示在定义函数之前调用的函数的含义,这将极大地帮助改进您的问题,因为人们不确定您的意思。一小段代码演示在定义函数之前调用的函数的含义,这将极大地帮助改进您的性能question@Tomerikoo这是因为代码实际上没有执行。尽管当我调用另一个函数时,该函数可能不需要执行。当代码实际执行时,如果没有定义一个名为foo的函数,它将崩溃。你在说什么?你的答案中没有foo?顺便说一句,我之前的评论是对问题的引用,而不是我的wordingfoo只是madeup函数名的占位符。我知道这不是我的答案,只是一个问题example@Tomerikoo这是因为代码实际上没有执行。该函数只是声明,当执行此代码时,我需要调用另一个名为foo的函数或其他函数,即使可能没有定义foo。当代码实际执行时,如果没有定义一个名为foo的函数,它将崩溃。你在说什么?你的答案中没有foo?顺便说一句,我之前的评论是对问题的引用,而不是我的wordingfoo只是madeup函数名的占位符。我知道这不是我的答案,它只是一个例子