Python中的执行顺序和编码风格

Jas*_*son 23 python

我是Python的新手,所以如果问题太基础,请不要激怒我:)

我已经读过Python从上到下执行.

如果是这种情况,为什么程序会这样:

def func2(): 
    pass

def func1():
    func2()

def func():
    func1()

if __name__ == '__main__':
    func()
Run Code Online (Sandbox Code Playgroud)

所以从我所看到的,主要功能最后,其他功能堆叠在它上面.

这样说我错了吗?如果不是,为什么主函数或函数定义不是从上到下编写的?

编辑:我在问为什么我不能这样做:

if __name__ == '__main__':
    func()

def func1():
    func2()
Run Code Online (Sandbox Code Playgroud)

这不是自然秩序吗?你继续在底部添加东西,因为它是从上到下执行的.

JAL*_*JAL 31

defs的只是创造的功能.除了解析语法并将函数绑定到这些名称之外,不执行任何代码.

if是第一个实际执行的代码.如果你把它放在第一位,并在定义之前调用一个函数,结果是一个NameError.因此,您需要在定义函数后放置它.

请注意,这与PHP或JavaScript不同,其中函数被"提升" - 任何函数定义都会在其他所有函数之前进行处理和解析.在PHP和JavaScript中,完成您所说的内容并在源代码中定义函数比调用它们的位置完全合法.(JS中的一个细节是定义的函数function(){}被提升,而定义的函数var func1=function(){};不是.我不知道它如何与PHP 5.3中的匿名函数一起工作).

看,在这里,cat()将正确打印,并且yip()会给你一个NameError,因为解析器在你调用它时没有得到yip()的定义.

def cat():
  print 'meowin, yo'

cat()

yip()

def yip():
  print 'barkin, yall'
Run Code Online (Sandbox Code Playgroud)

meowin,yo
Traceback(最近一次调用最后一次):
文件"cat.py",第5行,在
yip()中
NameError:名称'yip'未定义

  • 很好的答案,但是你的 JavaScript 离题有点让我失去了思路。也许删除它? (2认同)

Wee*_*ble 22

Python从上到下执行,但执行"def"块不会立即执行包含的代码.相反,它在当前范围中创建具有给定名称的函数对象.考虑一个类似于您的示例的Python文件:

def func2():
    print "func2"

def func1():
    func2()

def func():
    func1()

if __name__ == '__main__':
    func()
Run Code Online (Sandbox Code Playgroud)

执行此脚本时会发生什么情况如下:

首先,创建一个函数对象并将其绑定到全局范围中的名称"func2".然后创建一个函数对象并将其绑定到全局范围中的名称"func1".然后一个叫做"func".然后执行"if"语句,条件为真并执行"func()"语句.此时,"func"是在全局范围内找到的函数对象,因此调用它并运行其代码.该代码包含"func1()"语句,该语句被解析为对"func1"函数的调用,依此类推.

如果你把"if"语句放在顶部,那么当它执行时,还没有任何用名称"func"定义的东西,所以你会得到一个错误.要认识到的重要一点是"def"语句本身就是一个执行的语句.它与其他语言不同,其中定义是一种单独的声明,没有执行顺序.

还要注意,只要" if __name__..."位在文件的末尾,其他声明的顺序并不重要,因为当它们中的任何一个被称为所有"def"时s将被执行.

  • @YanKhonski 请参阅/sf/ask/29341441/ (2认同)

tal*_*nat 5

一般来说,Python 确实是从上到下处理命令的。但是,函数调用将导致 Python 执行该函数,并且只有在该调用结束后才继续向下执行。

在您的示例中,Python 解释器执行以下步骤:

  1. 定义func2
  2. 定义func1
  3. 定义func
  4. 处理 if 语句if __name__ == '__main__':
  5. 调用该func函数(因为条件为真)。
  6. 调用该func1函数(因为这就是函数的func作用)。
  7. 调用该func2函数(因为这就是函数的func1作用)。
  8. 结束,因为在完成对它的调用之后,func2它也完成了调用func1,因此也完成了调用func,这是代码中的最后一条语句。