Python程序设计

徐舒,严张凌,何山,王佩瑶,肖业清

目录

  • 1 课程概况
    • 1.1 教学大纲
    • 1.2 教案
    • 1.3 教材与参考书
  • 2 1-1 Python概述
    • 2.1 Python的发展与特点
    • 2.2 Python程序的运行方式
  • 3 2-1 搭建Python开发环境
    • 3.1 Conda虚拟环境
    • 3.2 VSCode的安装与配置
  • 4 2-2 Python开发快速入门
    • 4.1 实例精讲1:温度转换
    • 4.2 Python程序实例解析
  • 5 3-1 Python程序开发与调试入门
    • 5.1 Python调试方法
    • 5.2 VSCode断点与调试工具栏
    • 5.3 高阶拓展:Python中的if __name__ ==‘__main__’该如何理解
  • 6 4-1 turtle绘图库及计算思维的训练
    • 6.1 翻转任务单
    • 6.2 翻转视频:turtle库基本概念
    • 6.3 翻转视频:turtle库常用函数
    • 6.4 翻转讨论:你知道哪些函数的简写与完整形式?
    • 6.5 翻转测验(课前自测)
    • 6.6 挑战编程1: 五角星绘制
    • 6.7 实例精讲2:Python蟒蛇绘制
    • 6.8 turtle的各种小技巧
      • 6.8.1 小海龟到底在哪里?
      • 6.8.2 实例3:彩虹框
      • 6.8.3 实例4:教小学生认识多边形
    • 6.9 编程训练4:彩色艺术图
  • 7 4-2 基本数据类型之数字类型
    • 7.1 基本数据类型
    • 7.2 编程训练
  • 8 5-1 Python字符串基础
    • 8.1 翻转任务单
    • 8.2 翻转视频
    • 8.3 翻转讨论
    • 8.4 翻转测验(开课测验)
    • 8.5 挑战编程2:字符串的第1个不重复字符
      • 8.5.1 挑战编程2的两种解题思路
    • 8.6 挑战编程3:最长公共前缀
      • 8.6.1 标准算法思路
      • 8.6.2 Python简化解题思路
  • 9 6-1 字符串方法与格式化
    • 9.1 字符串的方法
    • 9.2 字符串的格式化
    • 9.3 实例5:文本进度条的实现
    • 9.4 拓展:进度条tdqm库
  • 10 6-2 程序的控制结构
    • 10.1 翻转任务单
    • 10.2 翻转视频
    • 10.3 实例精讲6:BMI身体指数的计算
      • 10.3.1 挑战练习
  • 11 7-1 Python循环结构
    • 11.1 翻转任务单
    • 11.2 翻转视频
    • 11.3 编程练习
  • 12 8-1 Python异常机制
    • 12.1 异常处理分支结构
    • 12.2 拓展: Random随机库用法
  • 13 8-2 Python函数
    • 13.1 翻转任务单
    • 13.2 翻转视频
    • 13.3 翻转讨论
  • 14 9-1 函数编程训练
    • 14.1 实例8:七段数码管绘制
      • 14.1.1 实例讲解
      • 14.1.2 改进实例
    • 14.2 挑战编程4:旋转图像
      • 14.2.1 解题思路
    • 14.3 拓展: PyInstaller库的使用
  • 15 10-1 列表和元组
    • 15.1 翻转任务单
    • 15.2 翻转视频
    • 15.3 翻转讨论
    • 15.4 序列类型
      • 15.4.1 有序:列表
      • 15.4.2 有序:元组
      • 15.4.3 序列典型应用场景
    • 15.5 无序:集合
      • 15.5.1 集合典型应用场景
  • 16 10-2 列表与元组编程训练
    • 16.1 案例 基本统计值运算
      • 16.1.1 问题分析
      • 16.1.2 解决方案
      • 16.1.3 拓展
    • 16.2 挑战编程5:重复元素判定
  • 17 11-1 算法与计算思维训练
    • 17.1 jieba库
    • 17.2 实例:词频统计
  • 18 12-1 Python字典
    • 18.1 无序:字典
      • 18.1.1 字典基本特性分析
    • 18.2 序列高级特性
  • 19 12-2 算法与计算思维训练
  • 20 13-1 Python的文件处理
    • 20.1 翻转任务单
    • 20.2 课件 输入与输出
      • 20.2.1 视频 文件操作详解
  • 21 14-1 (高阶)文件编程-自动轨迹绘制
    • 21.1 课程翻转课堂教学任务单
    • 21.2 视频 文件数据的处理
    • 21.3 视频 自动轨迹绘制
  • 22 14-2 Python中的图像处理PIL库
    • 22.1 PIL库的使用
  • 23 15-1 图像增强编程训练
    • 23.1 翻转任务单
    • 23.2 高阶项目:猫狗识别
    • 23.3 编程挑战:图像增强
  • 24 16-1 二维文件处理方法
    • 24.1 二维数据与CSV基础
  • 25 16-2 词云库wordcloud
    • 25.1 拓展 词云库wordcloud
    • 25.2 实例9: 报告词云
      • 25.2.1 拓展 你不知道的词云
  • 26 16-2 Python生态展望(拓展内容,自主选学)
    • 26.1 Python生态概述
    • 26.2 从数据处理到人工智能
    • 26.3 实例16 霍兰德人格分析图
    • 26.4 从Web解析到网络空间
    • 26.5 从人机交互到艺术设计
    • 26.6 实例17 玫瑰花绘制
高阶拓展:Python中的if __name__ ==‘__main__’该如何理解

程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。

而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:

PI = 3.14

def main():
    print("PI:", PI)

main()

我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:

PI: 3.14

现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print ("round area: ", calc_round_area(2))

main()

运行 area.py,输出结果:

round area:  12.56

可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main 也只是为了对常量定义进行下测试。这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:

PI = 3.14

def main():
    print "PI:", PI

if __name__ == "__main__":
    main()

然后再运行 area.py,输出如下:

round area:  12.56

再运行下 const.py,输出如下:

PI: 3.14

这才是我们想要的效果。

if __name__ == '__main__' 就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

__name__

__name__ 是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。来举个例子,假设有如下一个包:

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py

目录中所有 py 文件的内容都为:

print __name__

我们执行 python -c "import a.b.c",输出结果:

a
a.b
a.b.c

由此可见,__name__ 可以清晰的反映一个模块在包中的层次。其实,所谓模块名就是 import 时需要用到的名字,例如:

import tornado
import tornado.web

这里的 tornado 和 tornado.web 就被称为模块的模块名。

如果一个模块被直接运行,则其没有包结构,其 __name__ 值为 __main__。例如在上例中,我们直接运行 c.py 文件(python a/b/c.py),输出结果如下:

__main__

所以,if __name__ == '__main__' 我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行