Python脚本中函数的顺序是否重要?

73

假设我在脚本中有两个函数:sum_numbersprint_sum。它们的实现如下:

def sum_numbers(a, b):
    return a + b

def print_sum(a, b):
    print(sum_numbers(a, b))

所以我的问题是:函数编写的顺序是否重要?如果我首先编写print_sum函数,然后再编写sum_numbers函数,代码仍然能够工作吗?如果答案是肯定的,它是否总是有效?


7
如果你想问某个东西在Python中是否有效,最好先尝试一下,而不是询问“*... would the code still work?*”。这样会更快。如果结果让你困惑,那么你就可以提出一个更有趣、更具体的问题。请注意,这段话已经被翻译为中文。 - Andras Deak -- Слава Україні
28
这个问题可能很简单,但这并不意味着不值得问。像这样的问题对于新手程序员或者当答案无法在快速搜索中找到时,都可能会有帮助。 - Stevoisiak
3
@StevenVascellaro 我不确定我理解你的观点。新手程序员也可以直接尝试而不是询问或阅读相关信息以更快地掌握它 :) - Andras Deak -- Слава Україні
...或者当用户在没有实际尝试任何东西之前想要了解更多关于Python的信息时。然而,我在思考这个问题的心理人体工学方面,我知道很多遗留的C++静态类型代码有点人为地将叶子调用堆栈依赖顺序推到文件的顶部,但是在学习代码库时,最好按照自上而下的执行顺序排序函数。随着先进的IDE能够跳转到任意位置,它可能不再像以前那样重要。 - jxramos
2
@AndrasDeak,然而,到达这个问题的人并没有完全想到这个代码片段。还要注意,实际上这个问题包含两个部分,第二个部分不像第一个部分那么简单。此外,请注意,通常情况下,如果涉及输入,这种类型的问题是无法检查的(这通常需要解决停机问题)。 - skyking
3个回答

114

Python只关心在实际查找时名称是否已定义。就是这样。

在您的情况下,这很好,因为顺序并不重要,因为您只是定义了两个函数。也就是说,您只是引入了两个新名称,没有查找操作。

现在,如果您调用其中一个(实际上执行了查找操作)并改变了顺序:

def print_sum(a, b):
    print(sum_numbers(a, b))

print_sum(2, 4)

def sum_numbers(a, b):
    return a + b

如果按照这种顺序 (sum_numbers 还不存在),你会遇到问题 (NameError),因为它会尝试查找一个还不存在的名称。

所以总体而言,是的,顺序确实很重要;在 Python 中没有像其他语言(例如 JavaScript)中的名称提升。


34
无论函数的创建顺序如何,只有在调用函数时才有影响。
def print_sum(a, b):
    print(sum_numbers(a, b))

def sum_numbers(a, b):
    return a + b

print_sum(1, 3)
# 4

这个方法能够工作,是因为在调用print_sum的时候,两个函数都已经存在。但是如果你在定义sum_numbers之前调用该函数,它将会失败,因为sum_numbers尚未被定义:

def print_sum(a, b):
    print(sum_numbers(a, b))

print_sum(1, 3)

def sum_numbers(a, b):
    return a + b

throws:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-34-37c0e3733861> in <module>()
      2     print(sum_numbers(a, b))
      3 
----> 4 print_sum(1, 3)
      5 
      6 def sum_numbers(a, b):

<ipython-input-34-37c0e3733861> in print_sum(a, b)
      1 def print_sum(a, b):
----> 2     print(sum_numbers(a, b))
      3 
      4 print_sum(1, 3)
      5 

NameError: name 'sum_numbers' is not defined

5
严格来说,有些情况下顺序是很重要的。如果一个符号在对象的定义/创建过程中被查找,那么该符号必须先被定义。一个简单的例子是,如果你有一个函数的默认参数,这些参数将在定义时进行评估。另一个例子是继承,其中基类必须首先定义。 - skyking
为什么不从你的评论中做出回答,@skyking? - Alexandre Huat

1

函数的定义顺序并不重要,如下所示:

def display():
    print(text())

def text():
    return "Hello World"

display() # "Hello World" is displayed

但是,函数的调用位置很重要,因此如果在开头调用"display()",则如下所示:

display() # Error

def display():
    print(text())

def text():
    return "Hello World"

接下来,会出现如下错误:

Traceback (most recent call last): File "", line 1, in NameError: name 'display' is not defined


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接