![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=1738871158-odwzzySW13MNCpEFetJEwHNaDHAPXVfQ-0-901d45f546e247b9b6daf791723b9e97)
步骤3:运行上述代码,屏幕上会按代码调用的顺序,输出以下五个单词。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P108_80635.jpg?sign=1738871158-g5my3EvRChDWKZ70VjEBfieKVwVMKLav-0-7f4815363989fa6c965949a0bcdab3da)
案例71 声明阶段与调用阶段
导语
代码对象可以分为声明和调用两个阶段。当代码模块被执行时,无论对象是否被调用,声明语句都会被执行,声明语句执行的顺序与对象被声明的顺序相同。
例如,下面代码声明了两个函数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80638.jpg?sign=1738871158-qnmnFHA5USFTQuYqqZIPu4th2sPX1QXs-0-d8cf77d8961f5d523dfdd35097f2a3f4)
代码在运行时,先执行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=1738871158-IpjQoQvMmDI1qdN1ryZTU22KPv3lIYAf-0-28c108146788d44f669809ed9ef4afb2)
类(class)的声明则有点不同,请看下面代码。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P109_80640.jpg?sign=1738871158-vunnenyWXXKBquotRNUUp5HLC32id87D-0-27c6ceff1f5fe8d50a259778b3d468ee)
代码首先执行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=1738871158-KylQc2HZAdAQRj9Ua2LnYElLvF7YDPIm-0-65259199663cbbf37597cb5c481d931a)
函数对象在声明阶段其内部代码不会执行,但类对象在声明阶段如果Python查找它有显式定义的成员,就会进入类的内部执行类成员的声明语句(如上面例子中的df_1、fd_2和set成员)。
操作流程
步骤1:以下为变量声明语句。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80644.jpg?sign=1738871158-tu8G5MgtWOjDTHZyp5xLFHnnCkDVmSde-0-038ed6aba26b5921e5f10b47629f20b2)
变量a和b因为应用了类型批注,在声明时可以不进行赋值,变量c显式赋值为浮点类型。在代码模块运行时,哪怕这三个变量都没有被使用,但这三行代码依然会执行,因为它们是声明语句。
步骤2:声明test函数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80645.jpg?sign=1738871158-8zm8EaQDVKDtT5w4P8x9hqnmpjUFheVD-0-8e47aec2c1329f2f369ba32a55eb48d1)
在函数声明阶段,print(x.__class__)这一行不会被执行,只有在该函数被调用时才会执行。
步骤3:下面代码声明两个类。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80646.jpg?sign=1738871158-HyeFmAGJqAtz69M6P2P9hsjIXe3Ue3cS-0-bd42704e79622926899f5b8d42afdaef)
这段代码在运行时会抛出以下错误:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80647.jpg?sign=1738871158-G70KKFLSEcDfexZR76YE7kN5WQ5Ui2T9-0-e026b381605d0828564c5e8c73f5f69d)
因为F类中的other成员使用了G类的案例,但在声明F.other成员时G类还没有声明,所以在全局命名空间中找不到名为G的类。要避免此错误,需要先声明G类,再声明F类,即
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P110_80648.jpg?sign=1738871158-b2s5kS473KLSG5OuYdh9MuLQEMrnbs8A-0-3e803e9ec243de24782327beb3a12cfc)