![Python实战指南:手把手教你掌握300个精彩案例](https://wfqqreader-1252317822.image.myqcloud.com/cover/214/44510214/b_44510214.jpg)
4.1 顺序执行
案例70 最简单的流程
导语
在应用程序中,最简单的代码就是一句一句地执行,完全按照代码出现的顺序进行。如本例中,连续五次调用print函数,依序输出五个单词。
操作流程
步骤1:新建代码文件,命名为1.py。
步骤2:在代码文件中依次输入以下代码,连续调用print函数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P108_80634.jpg?sign=1739532333-476PLKm8d7CV2vgZchCPcIXPfuMMV2QR-0-57608eed4d0eb15cb053a63adb5c0a8b)
步骤3:运行上述代码,屏幕上会按代码调用的顺序,输出以下五个单词。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P108_80635.jpg?sign=1739532333-kqj8Guij7wCdiBc14euHJuHNLuOJL4kY-0-4b127270c053bca6b81c4deac00f640a)
案例71 声明阶段与调用阶段
导语
代码对象可以分为声明和调用两个阶段。当代码模块被执行时,无论对象是否被调用,声明语句都会被执行,声明语句执行的顺序与对象被声明的顺序相同。
例如,下面代码声明了两个函数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80638.jpg?sign=1739532333-2grR4zwAPo909nC7Scz6VzGdTMLRaZoQ-0-e3b2829b8ae182b4515bc298f04bb5cc)
代码在运行时,先执行def a(x)这一行,但函数体中的return语句不会执行;声明a函数后,接着执行def b()一行,但里面的print('called')一行不会执行。
函数体内部的代码只有当函数被调用时才会执行,例如,运行以下两行代码,会使a和b函数的函数体部分被执行。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80639.jpg?sign=1739532333-bwkzTzg8CwFfn4pxzRb6thgpeaBCXgbW-0-63d618c57dcd735fbf863177151c6828)
类(class)的声明则有点不同,请看下面代码。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80640.jpg?sign=1739532333-5kFKWfT4LM0araLRtBz4a635jQxoZNJ1-0-2102c3cfcadeae8bee9b61a02c3b506b)
代码首先执行class new_c一行,声明类。随后执行fd_1=1和df_2=2两句,声明类的两个属性,而后执行def set(self,v)一行,声明类的案例方法,但self.fd_3=v这一行不会执行,因为它不是声明语句,除非像下面代码那样,显式调用set案例方法。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80641.jpg?sign=1739532333-lXw85gHhaMTGPr0ngsFPl0bt5fsjjH5N-0-17bf0c4d987681f7cdbc7ba21f9006bc)
函数对象在声明阶段其内部代码不会执行,但类对象在声明阶段如果Python查找它有显式定义的成员,就会进入类的内部执行类成员的声明语句(如上面例子中的df_1、fd_2和set成员)。
操作流程
步骤1:以下为变量声明语句。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80644.jpg?sign=1739532333-MDXjX37NqAHmRo9JtdXLVm8irsdwQ9s8-0-3b88cb14d77627b171190ff479366cc9)
变量a和b因为应用了类型批注,在声明时可以不进行赋值,变量c显式赋值为浮点类型。在代码模块运行时,哪怕这三个变量都没有被使用,但这三行代码依然会执行,因为它们是声明语句。
步骤2:声明test函数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80645.jpg?sign=1739532333-xbFPTueibMAkkyRHm0kBrgBQaJWZx4gC-0-54d9bc8347e96f9f8ffa32982fda7c6e)
在函数声明阶段,print(x.__class__)这一行不会被执行,只有在该函数被调用时才会执行。
步骤3:下面代码声明两个类。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80646.jpg?sign=1739532333-oROnCVA4VkEpMKCfSWUKn6axberlncYy-0-ec0b0b5fed42edef2e438555a6444ccb)
这段代码在运行时会抛出以下错误:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80647.jpg?sign=1739532333-x4KqFJdwG1K8FbCoceJ1RzBKbZuNNWvT-0-3f3c0f98f4c0cf6dd8df9fee1c167897)
因为F类中的other成员使用了G类的案例,但在声明F.other成员时G类还没有声明,所以在全局命名空间中找不到名为G的类。要避免此错误,需要先声明G类,再声明F类,即
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80648.jpg?sign=1739532333-kGtji2QJoGorkEwuEryd9IwP6b7cs2P1-0-94aa07b5ea6dcaf97a18f022f9a3fa07)