当前位置:   article > 正文

第3课 Python文件结构_python工程文件的结构

python工程文件的结构

3.1 Python文件结构


  首先说明一下,本文描述的部分知识点或名词对于初学者来说可能会有点陌生,特别是对于完全没有接触过编程的人。因此,从初学者的角度看,本课内容可能在有一定基础之后再读比较合理,但是从Python的知识体系结构来看,本课程的顺序安排是没有问题的,因为它是创建和编写Python代码的纲领。所以,我建议不管你是不是初学者,都先浏览一遍本文再接着往下学习,遇到理解不了的可以先跳过,等后面有一定基础了回过头来再看一遍或许就理解了,这是一个很简单的道理,不管是“豁然开朗”还是“茅塞顿开”,它们的前提条件都是先埋下谜团,读书百遍其义自见嘛,学技术更应该如此!
  • 1

- 进入正文 -

通常,一个python代码文件由如下8个部分组成:解释器版本声明(仅Unix环境)、文件编码格式声明、文档字符串、模块导入语句、全局变量定义、类定义、函数定义、执行代码。一个模板代码如下:

#! /usr/bin/env python3           # [1]解释器版本声明``# -*- coding:utf-8 -*-            # [2]文件编码格式声明``   ``""" [3]文档字符串 """``   ``import os                         # [4]模块导入语句``   ``DEBUG = True                      # [5]全局变量定义``   ``class MyClass(object):            # [6]类定义`    `""" [3]文档字符串 """`    `pass``   ``def my_func():                    # [7]函数定义`    `""" [3]文档字符串 """`    `pass``   ``if __name__ == '__main__':        # [8]执行代码`    `my_func()``   
  • 1

1. 解释器版本声明

如果你学过Linux的shell编程,那就很容易理解了,原理是一样的。解释器声明又称为shebang注释(中文翻译为“解释伴随”),它的标志是‘#!’:

shebang必须出现在脚本文件的第一行,后面用空白字符接解释器绝对路径,用于指明执行这个脚本的解释器,而且还可以带上参数,例如:

#! /bin/sh           # 表示使用sh执行脚本``#! /usr/bin/perl -w  # 表示使用带警告的perl执行脚本``#! /usr/bin/php      # 表示使用php的命令解释器执行脚本
  • 1
Python的shebang声明如下:
#! /usr/bin/python3
或者
#! /usr/bin/env python3

shebang的好处在于,允许脚本和数据文件充当系统命令,无须在调用的时候由用户指定解释器,从而对用户或者其他程序隐藏了其执行的细节。但是shebang只能在类Unix系统(如Linux,MacOS等)中起作用,Windows系统会忽略此注释!

2. 文件编码格式声明

这里的编码是指文件中字符的编码格式,我们知道,目前世界上对于不同的语言和符号有许多不一样的编码格式,例如ASCII编码、ANSI编码、UTF-8编码、GBK编码等。

编码的目的是把人类输入的文本字符转换为计算机认识的二进制字符,然后才能交后给计算机处理;反过来,计算机处理后的二进制字符也需要转换为人类认识的文本字符,才能方便人类去阅读,这过程称为称为解码。

如果我们不在脚本头部声明文件的编码格式,解释器会用操作系统默认的编码格式去处理脚本,如果默认的编码格式和你保存文件时使用的编码格式不一致,轻则文本显示乱码,重则数据读取异常,导致最终脚本运行出错。
  • 1

因此,当我们创建一个新Python代码文件时,要习惯性地加上编码格式声明,而且这个声明必须要和你保存文件时使用的编码格式一致(一般文本编辑器或者IDE都支持选择文本编码格式)。我们一般约定使用UTF-8来作为代码文件的编解码格式。

Python编码格式声明方式如下:

# -*- coding:utf-8 -*-

注意UTF-8并不是Python的官方规定的编码格式,只是大家约定俗成且被广泛使用而已,而且大多数代码编辑器及IDE也是默认使用UTF-8作为文件编码格式的。后续课程中会有关于编码格式的详细描述。
  • 1

3. 文档字符串

  Python的文档字符串又被称为docstring,它既是注释,又是一个特殊的字符串常量(可以通过.\_\_doc\_\_方法来获取),用于提供关于Python模块、函数、类、方法或属性的描述或说明,它们通常被自动化工具(如Pydoc等)用来生成代码文档。例如,time库的模块文档字符串如下:
  • 1

Python文档字符串的主要用途是解释代码的功能和用途,以便其他开发者更容易理解和使用它。Python官方规定了文档字符串的固定格式如下:
  • 1
Python文档字符串是以一对三个单引号或一对三个双引号括起来,放在模块、类、函数等开头的一行或多行注释型的字符串。
至于文档字符串的内容Python官方并没有提出硬性要求,可以是任意文本,但是建议要符合一定的格式要求,可以参考本账号后续发布的Python编程规范文档来设计你的文档字符串。
  • 1

4. 模块导入语句

  前面课程说过,Python编程的最大优点就是它拥有大量成熟的标准库及第三方扩展库;此外,我们在项目开发过程中,为了实现模块化编程,肯定也会设计各种自定义模块。在编写Python代码之前需要先导入这些库或者模块才能使用他们。一般会把导入库或导入模块的语句放到代码正文的最前面,在模块的文档字符串之后。导入的方法和原理后面课程中会详细讲解。
  • 1

5. 全局变量

  Python支持创建并使用全局变量,我们还没有学什么是全局变量,以及如何使用它,先简单了解一下:Python代码中,只要你在一个函数之外声明一个变量,它就会自动成为一个全局变量,而且我们一般把全局变量的定义统一放在代码正文的前面,紧随导入模块语句之后。全局变量的定义和使用在后面课程中会详细讲解。
  • 1

6. 类定义

我们前面课程已经讲过,Python是一种面向对象编程的语言,所以Python中是可以定义和使用类的。我们一般会把类定义放在独立的Python模块文件中,通过导入模块文件的方式来使用。如果需要把类定义和使用放到同一文件下,建议把类定义放到代码的前部,全局变量定义之后,函数定义之前。请注意,类只是一个模型,它不属于Python文件的执行代码,只能被其他程序去例化引用,它自身在程序的运行过程中是无法被直接执行的。类的定义及使用方法在后续课程中会详细讲解。

7. 函数定义

和其他大多数编程语言一样,Python也是函数式编程,它主要依赖于数学函数的概念和逻辑,将程序看作是一系列函数的组合和调用。函数式编程的核心那肯定就是函数的定义了,这里先不去教大家如何定义和使用函数,而是要说明一下,函数定义和类定义一样,它是一组功能代码的集合,只能被其他程序去调用,在程序的运行过程中它是不会自己运行的。我们一般把函数定义放在执行代码之前,任何函数都必须遵循先定义后调用的规则。函数的定义及使用方法在后续课程中会详细讲解。

8. 执行代码

执行代码也就是运行Python文件时会被直接执行的那部分代码,任何一个Python应用都必须含有执行代码。注意我说的是应用程序,如果你的Python代码只是打算封装成库或者被别人调用的模块,那就无需存在执行代码,就如前面说的,你的Python代码只是做某些类定义的封装,或者某些功能函数定义的集合等。执行代码一般放在Python代码文件的最后面,使用if __name__ == ‘__main__’:作为执行代码的起始语句,关于这个起始语句下面程序入口那里会讲它的作用。

这8个组成部分和排版顺序是创建和编写Python代码文件时比较完整的参考模板,但并不是说所有的Python代码文件都必须完整包含这8个部分,起码文档字符串不是Python程序运行的相关项,它只是给人看的;其他的部分也不是必选项,甚至完全可以创建一个空白的Python文件并执行它,它不会报错,只是没有意义而已;

你也可以不按上面要求的顺序来排版,例如你可以把导入库语句放到代码中的任意位置,而不必一定放在文件的前面,你只要保证在使用它之前完成导入就可以了;执行程序、类以及函数的定义顺序也是一样,你只需要保证在使用之前定义就OK了。只要你不嫌难看而且符合先定义或先导入后使用的约束规则,那你就完全可以把你的代码打散地放在文件的各个角落。

3.2 Python执行入口


学过C语言的都知道,C应用程序一定是从main函数开始执行的。但对于Python来说,它没有main函数入口一说,Python代码的执行规则是:
  • 1

Python解释器按自上而下的顺序去执行Python文件中的顶层代码。

顶层代码

    在Python中,是以缩进来区分代码层次的,同一层次的代码缩进必须完全一致!所谓的顶层代码是指代码文件中缩进为0个空格的代码。注意,顶层代码包括所有有意义的Python语句,例如变量定义、类定义、函数定义、执行语句等都属于顶层代码范畴。

执行代码:

    这里把顶层代码中具有逻辑执行意义的那部分代码称为执行代码,而全部变量定义、类定义、函数定义等定义性的代码称为定义代码。

例如,如下代码:

print("000")``print("111")``print("222")
  • 1

它的执行结果如下:

自上而下执行,这是符合解释型语言的共同特征的。

结合上面对文件结构的讲解,我们一般把执行代码放到文件的最后面,且以if __name__ == ‘__main__’:作为执行的入口,如下:

# -*- coding:utf-8 -*-` `   ``import os` `   ``class MyClass(object): ``    pass``   ``def my_func():`    `print("333")`    `pass``   ``if __name__ == '__main__':   # 这里是执行入口,注意下面代码的缩进`    `print("000")`    `print("111")`    `print("222")
  • 1

执行结果和上面是一模一样的。

思考:请问为什么“333”没有打印出来?

    因为我们前面说过了,类和函数只是一种模型或者方法的抽象,是不具备直接执行功能的,必须有可执行的代码去调用他们才会被执行,虽然 print("333") 本身是一条可执行的语句,但是它放到函数定义里面就属于函数功能的范畴了,而不是顶层的可执行代码,类里面的方法和执行语句也是一样的道理。

但注意了,Python并没有规定一定是从if __name__ == ‘__main__’:开始执行代码的,它的规则还是自上而下顺序执行。假如,在if __name__ == ‘__main__’:之前如果添加一条可执行语句,那它肯定会先执行的,例如:

# -*- coding:utf-8 -*-``   ``import os``   ``print("333")          # 此处添加了一条执行语句``   ``class MyClass(object):`    `pass``   ``def my_func():`    `pass``   ``if __name__ == '__main__':`    `print("000")`    `print("111")`    `print("222")
  • 1

那它的执行结果就是:

因为自上而下的话print(“333”)是出现在最前面的!

你也许会问,那if __name__ == ‘__main__’:还有什么意义?

这可能就要先了解一下导入(import)的概念了,每一个Python文件都可以被另外的Python文件导入来使用,你可以理解为每个Python文件都是一个单一文件的库。

Python规定:在Python代码中导入另外一个Python模块(或者脚本文件)时,Python会执行该模块或脚本中的所有顶层代码。

例如,创建一个b.py,代码如下:

# -*- coding:utf-8 -*-``   ``print("333")``   ``def my_func():`    `print("444")`    `pass``   ``if __name__ == '__main__':`    `print("000")`    `print("111")`    `print("222")
  • 1

在同一目录下创建另外一个a.py,代码如下:

# -*- coding:utf-8 -*-``   ``import b``   ``b.my_func()
  • 1

执行a.py,运行结果如下:

可以看到只输出了“333”和“444”,而“000、“111”、“222”这三条语句是没有被执行的。其中“333”属于b.py的顶层语句,按照上面提到的规则,它是在被导入时被执行的,“444”是正常被a.py的顶层语句b.my_func()执行出来的。

因此,执行代码入口if \_\_name\_\_ == '\_\_main\_\_':的声明是为了保护它的下属语句被其他程序导入时不被执行而使用的,当然,直接执行时又是可以被执行的。这一般用于编写库或者模块的单元测试代码。

  关于Python程序的入口以及执行规则已经讲解完了,如果看不懂可以暂时跳过,学完【入门篇】之后再回过头来看就懂了。
  • 1
  • 2
  • 3


本文转自网络,如有侵权,请联系删除。

学习资源推荐

除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

这里给大家展示一下我进的兼职群和最近接单的截图

兼职群

私单

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/826655
推荐阅读
相关标签