MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记

前言

小编想使用python快速筛选文献、股票信息提取、写批处理脚本等,最近学习了股票信息提取,发现半年前学的基础知识已经忘完了,而且还没有笔记查询。本文参考MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》的课件,完整地整理了一遍。码字不易,希望转载本文时,注明出处。

在本科期间,大多数人奉行“不挂科”主义,上课效率不是很高,基础知识不牢固,导致需要用编程知识的时候只能重新去查找学习,说的就是小编!(小编读本科时,没有开设python这门课)

还有就是对于Python语言,肯定会有大批的本科学生去学习,希望本文对读者有积极的作用。

课程导学

学习python的基本要求:

  • 会使用计算机和Office软件
  • 阅读简单英文内容、3级及以上水平
  • 熟练使用Web浏览器
  • 每周至少1-2个小时,连续9周

第1章 Python基本语法元素

  • 1.1 程序设计基本方法
  • 1.2 Python开发环境配置
  • 1.3 实例1: 温度转换
  • 1.4 Python程序语法元素分析

方法论

  • 程序的基本编写方法:IPO

实践能力

  • 看懂10行左右简单Python代码

1.1程序设计基本方法

  • 1.1.1 计算机与程序设计
  • 1.1.2 编译和解释
  • 1.1.3 程序的基本编写方法
  • 1.1.4 计算机编程

1.1.1 计算机与程序设计

计算机的概念

计算机是根据指令操作数据的设备

  • 功能性
    对数据的操作,表现为数据计算、输入输出处理和结果存储等
  • 可编程性
    根据一系列指令自动地、可预测地、准确地完成操作者的意图

摩尔定律Moore’s Law

计算机发展历史上最重要的预测法则,目前面临着失效的风险

  • Intel公司创始人之一戈登·摩尔在1965年提出
  • 单位面积集成电路上可容纳晶体管的数量约每两年翻一番
  • CPU/GPU、内存、硬盘、电子产品价格等都遵循摩尔定律

计算机的发展

计算机发展参照摩尔定律,表现为指数形式

  • 计算机硬件所依赖的集成电路规模参照摩尔定律发展
  • 计算机运行速度因此也接近几何级数快速增长
  • 计算机高效支撑的各类运算功能不断丰富发展
  • 当今世界,唯一长达50年有效且按照指数发展的技术领域
  • 计算机深刻改变人类社会,甚至可能改变人类本身
  • 可预见的未来30年,摩尔定律还将持续有效

程序设计

程序设计是计算机可编程性的体现

  • 程序设计,亦称编程,深度应用计算机的主要手段
  • 程序设计已经成为当今社会需求量最大的职业技能之一
  • 很多岗位都将被计算机程序接管,程序设计将是生存技能

程序设计语言

程序设计语言是一种用于交互(交流)的人造语言

  • 程序设计语言,亦称编程语言,程序设计的具体实现方式
  • 编程语言相比自然语言更简单、更严谨、更精确
  • 编程语言主要用于人类和计算机之间的交互

编程语言种类很多,但生命力强劲的却不多

  • 编程语言有超过600种,绝大部分都不再被使用
  • C语言诞生于1972年,它是第一个被广泛使用的编程语言
  • Python语言诞生于1990年,它是最流行最好用的编程语言

1.1.2 编译和解释

计算机执行源程序两种方式:编译和解释

  • 源代码:采用某种编程语言编写的计算机程序,人类可读
    例如:result = 2 + 3
  • 目标代码:计算机可直接执行,人类不可读 (专家除外)
    例如:11010010 00111011

编译

将源代码一次性转换成目标代码的过程。
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第1张图片
执行编译过程的程序叫编译器(compiler)。

解释

将原代码逐条转换成目标代码同时逐条运行的过程。
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第2张图片
执行解释过程的程序叫解释器(interpreter)。

编译和解释的对比

  • 编译:一次性翻译,之后不再需要源代码(类似英文翻译),就是程序写好,run一下
  • 解释:每次程序运行时随翻译随执行(类似实时的同声传译),就是在命令解释器shell中,敲一句,运行一句

静态语言和脚本语言

根据执行方式不同,编程语言分为两类

  • 静态语言:使用编译执行的编程语言(C/C++,java)
  • 脚本语言:使用解释执行的编程语言(Python,JavaScript,PHP)

执行方式不同,优势各有不同

  • 静态语言:编译器一次性生成目标代码,优化更充分;程序运行速度更快
  • 脚本语言:执行程序时需要源代码,维护更灵活;源代码在维护灵活、跨多个操作系统平台

1.1.3 程序的基本编写方法

IPO

程序的基本编写方法

  • I:Input 输入,程序的输入
  • P:Process 处理,程序的主要逻辑
  • O:Output 输出,程序的输出

理解IPO

输入

  • 程序的输入
    文件输入、网络输入、控制台输入、交互界面输入、内部参数输入等
  • 输入是一个程序的开始

输出

  • 程序的输出
    控制台输出、图形输出、文件输出、网络输出、操作系统内部变量输出等
  • 输出是程序展示运算结果的方式

处理

  • 处理是程序对输入数据进行计算产生输出结果的过程
  • 处理方法统称为算法,它是程序最重要的部分
  • 算法是一个程序的灵魂

问题的计算部分

一个待解决问题中,可以用程序辅助完成的部分

  • 计算机只能解决计算问题,即问题的计算部分
  • 一个问题可能有多种角度理解,产生不同的计算部分
  • 问题的计算部分一般都有输入、处理和输出过程

编程解决问题的步骤(6步)

  • 分析问题:分析问题的计算部分,想清楚
  • 划分边界:划分问题的功能边界,规划IPO
  • 设计算法:设计问题的求解算法,关注算法
  • 编写程序:编写问题的计算程序,编程序
  • 调试测试:调试程序使正确运行,运行调试
  • 升级维护:适应问题的升级维护,更新完善

求解计算问题的精简步骤(3步)

  • 确定IPO:明确计算部分及功能边界
  • 编写程序:将计算求解的设计变成现实
  • 调试程序:确保程序按照正确逻辑能够正确运行

1.1.4 计算机编程

Q:为什么要学习计算机编程?
A:因为“编程是件很有趣的事儿”!

能够训练思维

  • 编程体现一种抽象交互、自动化执行的思维方式
  • 计算思维:区分逻辑思维和实证思维的第三种思维模式。
  • 能够促进人类思考,增进观察力和深化对交互关系的理解

编程能够增进认识

  • 编程不单纯是求解计算问题
  • 不仅要思考解决方法,还要思考用户体验、执行效率等
  • 能够帮助程序员加深用户行为以及社会和文化认识

编程能够带来乐趣

  • 编程能够提供展示自身思想和能力的舞台
  • 让世界增加新的颜色、让自己变得更酷、提升心理满足感
  • 在信息空间里思考创新、将创新变为现实

编程能够提高效率

  • 能够更好地利用计算机解决问题
  • 显著提高工作、生活和学习效率
  • 为个人理想实现提供一种借助计算机的高效手段

编程带来就业机会

  • 程序员是信息时代最重要的工作岗位之一
  • 国内外对程序员岗位的缺口都在百万以上规模
  • 计算机已经渗透于各个行业, 就业前景非常广阔

学习编程的误区

Q:编程很难学吗? A:掌握方法就很容易!

  • 首先,掌握编程语言的语法,熟悉基本概念和逻辑
  • 其次,结合计算问题思考程序结构,会使用编程套路
  • 最后,参照案例多练习多实践,学会举一反三次

单元小结

程序设计基本方法

  • 计算机的功能性和可编程性
  • 编译和解释、静态语言和脚本语言
  • IPO、理解问题的计算部分
  • 掌握计算机编程的价值

1.2 Python开发环境配置

  • 1.2.1 Python语言概述
  • 1.2.2 Python基本开发环境IDLE
  • 1.2.3 Python程序编写与运行
  • 1.2.4 Python高级开发环境VSCode

1.2.1 Python语言概述

Python语言创立者:Guido van Rossum
2002年,Python 2.x
2008年,Python 3.x(现在都在学这个)

  • Python语言是一个由编程牛人领导设计并开发的编程语言
  • Python语言是一个有开放、开源精神的编程语言
  • Python语言应用于火星探测、搜索引擎、引力波分析等众多领域

1.2.2 Python基本开发环境IDLE

Python官方提供 适用于小规模程序开发

  • Python官方环境:Python解释器 + IDLE开发环境

  • 轻量级:只有几十MB大小,使用灵活

  • 功能丰富:编辑器+交互环境+标准库+库安装工具…

  • 下载地址: www.python.org/downloads
    或者: www.python123.io/downloads(推荐这个网址,下载速度快)
    具体配置方法,去MOOC查看课程,或者点击此处调转B站查看

1.2.3 Python程序编写与运行

Python的两种编程方式

交互式和文件式

  • 交互式:对每个输入语句即时运行结果,适合语法练习
  • 文件式:批量执行一组语句并运行结果,编程的主要方式

实例1: 圆面积的计算

根据半径r计算圆面积

交互式

>>> r = 25
>>> area = 3.1415 * r * r
>>> print(area)
1963.4375000000002
>>> print(" {:.2f}".format(area))
1963.44

文件式

#保存为CalCircle.py文件并运行
r = 25
area = 3.1415 * r * r
print(area)
print(" {:.2f}".format(area))

输出结果如下:

1963.4375000000002
1963.44

实例2:同切圆绘制

绘制多个同切圆

交互式

>>> import turtle
>>> turtle.pensize(2)
>>> turtle.circle(10)
>>> turtle.circle(40)
>>> turtle.circle(80)
>>> turtle.circle(100)

文件式

#保存为TangentCirclesDraw.py文件并运行
import turtle
turtle.pensize(2)
turtle.circle(10)
turtle.circle(40)
turtle.circle(80)
turtle.circle(100)

输出结果如下:

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第3张图片

实例3: 五角星绘制

绘制一个五角星

交互式

>>> from turtle import *
>>> color('red', 'red')
>>> begin_fill()
>>> for i in range(5):
fd(200)
rt(144)
>>> end_fill()
>>>

文件式

#保存为StarDraw.py文件并运行
from turtle import *
color('red', 'red')
begin_fill()
for i in range(5):
	fd(200)
	rt(144)
end_fill()
done()

输出结果如下:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第4张图片

1.2.4 Python高级开发环境VSCode

VSCode:Visual Studio Code

  • 微软出品,与Visual Studio同质量的专业级开发工具
  • 跨平台免费工具:支持Windows/Linux/MacOS
  • 编辑器模式:轻量级、功能丰富、可扩展性强…
  • 小编没用过这个,一开始用的就是PyCharm社区版本,后来用了notepad++和Gvim

第一步:安装IDLE环境;第二步:安装VSCode

  • 下载地址: https://code.visualstudio.com
  • 工具大小约 50MB

单元小结

Python开发环境配置

  • Python语言的发展历史
  • 选取一种系统平台构建Python开发环境
  • 尝试编写与运行3个Python小程序

1.3 实例1:温度转换

题目本身简单,但学会这种思维,其他常见的"转换"问题解决方法同理。

1.3.1 "温度转换"问题分析

温度转换

温度刻画的两种不同体系

  • 摄氏度:中国等世界大多数国家使用
    以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画
  • 华氏度:美国、英国等国家使用
    以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画

需求分析

两种温度体系的转换

  • 摄氏度转换为华氏度
  • 华氏度转换为摄氏度

问题分析

该问题中计算部分的理解和确定

  • 理解1:直接将温度值进行转换
  • 理解2:将温度信息发布的声音或图像形式进行理解和转换
  • 理解3:监控温度信息发布渠道,实时获取并转换温度值

分析问题

  • 采用 理解1:直接将温度值进行转换
    温度数值需要标明温度体系,即摄氏度或华氏度
    转换后也需要给出温度体系

划分边界

  • 输入:带华氏或摄氏标志的温度值
  • 处理:根据温度标志选择适当的温度转换算法
  • 输出:带摄氏或华氏标志的温度值

输入输出格式设计

标识放在温度最后,F表示华氏度,C表示摄氏度
82F表示华氏82度,28C表示摄氏28度

设计算法

根据华氏和摄氏温度定义,利用转换公式如下:
C = ( F – 32 ) / 1.8
F = C * 1.8 + 32
其中, C表示摄氏温度, F表示华氏温度

1.3.2"温度转换"实例编写

#TempConvert.py
TempStr = input("请输入带有符号的温度值: ")
if TempStr[-1] in ['F', 'f']:
    C = (eval(TempStr[0:-1]) - 32)/1.8
    print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C', 'c']:
    F = 1.8*eval(TempStr[0:-1]) + 32
    print("转换后的温度是{:.2f}F".format(F))
else:
    print("输入格式错误")

1.3.4 举一反三

Python语法元素理解

  • 温度转换程序共10行代码,但包含很多语法元素
  • 清楚理解这10行代码能够快速入门Python语言
  • 参考框架结构、逐行分析、逐词理解

输入输出的改变

  • 温度数值与温度标识之间关系的设计可以改变
  • 标识改变放在温度数值之前:C82, F28
  • 标识字符改变为多个字符:82Ce、28Fa

计算问题的扩展

  • 温度转换问题是各类转换问题的代表性问题
  • 货币转换、长度转换、重量转换、面积转换… - 问题不同,但程序代码相似

1.4 Python程序语法元素分析

1.4.1 程序的格式框架

代码高亮:编程的色彩辅助体系,不是语法要求

缩进:一行代码开始前的空白区域,表达程序的格式框架,表达代码间包含关系的唯一手段

缩进表达程序的格式框架

  • 严格明确:缩进是语法的一部分,缩进不正确程序运行错误
  • 所属关系:表达代码间包含和层次关系的唯一手段
  • 长度一致:程序内一致即可,一般用4个空格或1个TAB

注释:用于提高代码可读性的辅助文字,不被执行。

1.4.2 命名与保留字

变量

用来保存和表示数据的占位符号,变量采用标识符(名字)来表示。

命名

用来保存和表示数据的占位符号

  • 命名规则: 大小写字母、数字、下划线和中文等字符及组合
    如: TempStr, Python_Great, 这是门Python好课
  • 注意事项: 大小写敏感、首字符不能是数字、不与保留字相同
    Python和python是不同变量,123Python是不合法的

保留字

被编程语言内部定义并保留使用的标识符

  • Python语言有35个保留字(也叫关键字)
    if, elif, else, in
  • 保留字是编程语言的基本单词,大小写敏感
    if 是保留字,If 是变量

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第5张图片

1.4.3 数据类型

数据类型:字符串、整数、浮点数、列表

字符串

由0个或多个字符组成的"有序"字符序列

  • 字符串由一对单引号或一对双引号表示
    "请输入带有符号的温度值: "或者 ‘C’
  • 字符串是字符的有序序列,可以对其中的字符进行索引
    “请” 是 "请输入带有符号的温度值: " 的第0个字符

字符串的序号
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第6张图片
字符串的使用

使用[ ]获取字符串中一个或多个字符

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第7张图片

数字类型

由整数和浮点数都是数字类型

整数:数学中的整数
浮点数:数学中的实数,带有小数部分

列表

由0个或多个数据组成的"有序"序列

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第8张图片

1.4.4 语句与函数

赋值语句:由赋值符号构成的一行代码

分支语句:由判断条件决定程序运行方向的语句

函数:根据输入参数产生不同输出的功能过程

Python程序的输入输出

输入函数input()

从控制台获得用户输入的函数

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第9张图片

输出函数print()

以字符形式向控制台输出结果的函数

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第10张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第11张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第12张图片
注:input()和print(),在控制台显示的时候,一个添加引号形成字符串,一个将字符串自动去掉引号。

补充:"eval()"去掉参数最外侧引号并执行余下语句的函数

评估函数 eval()

去掉参数最外侧引号并执行余下语句的函数

  • eval()函数的基本使用格式:eval(<字符串或字符串变量>)
>>> eval("1") 
1
>>> eval("1+2") 
3
>>> eval('"1+2"') 
'1+2'
>>> eval('print("Hello")') 
Hello

单元小结

Python程序语法元素分析

  • 缩进、注释、命名、变量、保留字
  • 数据类型、字符串、 整数、浮点数、列表
  • 赋值语句、分支语句、函数
  • input()、print()、eval()、 print()格式化

第2章 Python基本图形绘制

  • 2.1 深入理解Python语言
  • 2.2 实例2: Python蟒蛇绘制
  • 2.3 模块1: turtle库的使用
  • 2.4 turtle程序语法元素分析

方法论

  • Python语言及海龟绘图体系

实践能力

  • 初步学会使用Python绘制简单图形

2.1 深入理解Python语言

  • 2.1.1 计算机技术的演进
  • 2.1.2 编程语言的多样初心
  • 2.1.3 Python语言的特点
  • 2.1.4 "超级语言"的诞生

2.1.1 计算机技术的演进

年份 演进过程 解决问题
1946-1981 计算机系统结构时代(35年) 计算能力问题
1981-2008 网络和视窗时代(27年) 交互问题
2008-2016 复杂信息系统时代(8年) 数据问题
2016- 未知 人工智能时代 人类的问题

2.1.2编程语言的多样初心

编程语言有哪些?
Basic, C, C++, C#, CSS, Fortran, Go, HTML, Java,
JavaScript, Lisp, Lua, Matlab, Object C, Pascal, Perl, PHP,
PostScript, Python, Ruby, Scala, SQL, Swift, VBA,
VB.NET, Verilog, VHDL, Visual Basic
编程语言,也是一个江湖!

不同编程语言的初心和适用对象

编程语言 学习内容 语言本质 解决问题 适用对象
C 指针、内存、数据类型 理解计算机系统结构 性能 计算机类专业
Java 对象、跨平台、运行时 理解主客体关系 跨平台 软件类专业
C++ 对象、多态、继承 理解主客体关系 大规模程序 计算机类专业
VB 对象、按钮、文本框 理解交互逻辑 桌面应用 不确定
Python 编程逻辑、第三方库 理解问题求解 各类问题 所有专业

各编程语言所处历史时期和使命不同,Python是计算时代演进的选择!

2.1.3 Python语言的特点

通用语言
脚本语言
开源语言
跨平台语言
多模型语言

如何看待Python语言?
人生苦短,我学python

  • C/C++:Python归Python,C归C
  • Java:针对特定开发和岗位需求
  • HTML/CSS/JS:不可替代的前端技术,全栈能力
  • 其他语言:R/Go/Matlab等,特定领域

工具决定思维:关注工具变革的力量!

2.1.4超级语言的诞生

机器语言 --> 代码直接执行,与CPU有关
汇编语言 --> 助记符,汇编器,与CPU有关
高级语言 --> 编译器,与CPU无关
超级语言 --> 整合已有程序,庞大计算生态

python是唯一的超级语言!

单元小结

深入理解Python语言

  • 计算机系统结构时代到人工智能时代的演进路线
  • 五种编程语言的初心和历史使命
  • Python语言的通用性、简洁性和生态性
  • Python是以计算生态为标志的"超级语言"

2.2 实例2:Python蟒蛇绘制

2.2.1"Python蟒蛇绘制"问题分析

Python蟒蛇绘制

用程序绘制一条蟒蛇

  • 貌似很有趣,可以来试试
  • 先学会蟒蛇绘制,再绘朵玫瑰花送给TA
  • 小编学完这一节,画了一个爱心——丘比特的箭

-问题1: 计算机绘图是什么原理?

一段程序为何能够产生窗体?为何能在窗体上绘制图形?

-问题2: Python蟒蛇绘制从哪里开始呢?

如何绘制一条线?如何绘制一个弧形?如何绘制一个蟒蛇?

2.2.2"Python蟒蛇绘制"实例编写

#PythonDraw.py
import turtle
turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.done()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第13张图片

import turtle 导入海归绘图库

2.2.3"Python蟒蛇绘制"举一反三

Python语法元素理解

  • Python蟒蛇绘制共17行代码,但很多行类似
  • 清楚理解这17行代码能够掌握Python基本绘图方法
  • 参考框架结构、逐行分析、逐词理解

程序参数的改变

  • Python蟒蛇的颜色:黑色、白色、七彩色…
  • Python蟒蛇的长度:1节、3节、10节…
  • Python蟒蛇的方向:向左走、斜着走…

计算问题的扩展

Python蟒蛇绘制问题是各类图形绘制问题的代表

  • Python蟒蛇绘制问题是各类图像绘制问题的代表
  • 圆形绘制、五角星绘制、国旗绘制、机器猫绘制… - 掌握绘制一条线的方法,就可以绘制整个世界

2.3 模块1:turtle库的使用

  • 2.3.1 turtle库基本介绍
  • 2.3.2 turtle绘图窗体布局
  • 2.3.3 turtle空间坐标体系
  • 2.3.4 turtle角度坐标体系
  • 2.3.5 RGB色彩体系

2.3.1 turtle库基本介绍

turtle库概述

turtle(海龟)库是turtle绘图体系的Python实现

  • turtle绘图体系:1969年诞生,主要用于程序设计入门
  • Python语言的标准库之一
  • 入门级的图形绘制函数库

标准库

Python计算生态 = 标准库 + 第三方库

  • 标准库:随解释器直接安装到操作系统中的功能模块
  • 第三方库:需要经过安装才能使用的功能模块
  • 库Library、包Package、模块Module,统称模块

turtle的原(wan)理(fa)

turtle(海龟)是一种真实的存在

  • 有一只海龟,其实在窗体正中心,在画布上游走
  • 走过的轨迹形成了绘制的图形
  • 海龟由程序控制,可以变换颜色、改变宽度等

turtle的魅力

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第14张图片

2.3.2 turtle绘图窗体布局

turtle的绘图窗体

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第15张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第16张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第17张图片

2.3.3 turtle空间坐标体系

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第18张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第19张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第20张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第21张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第22张图片

2.3.4 turtle角度坐标体系

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第23张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第24张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第25张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第26张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第27张图片

2.3.5 RGB色彩体系

RGB色彩模式

由三种颜色构成的万物色

  • RGB指红蓝绿三个通道的颜色组合
  • 覆盖视力所能感知的所有颜色
  • RGB每色取值范围0-255整数或0-1小数

常见RGB色彩

英文名称 RGB整数值 RGB小数值 中文名称
white 255, 255, 255 1, 1, 1 白色
yellow 255, 255, 0 1, 1, 0 黄色
magenta 255, 0, 255 1, 0, 1 洋红
cyan 0, 255, 255 0, 1, 1 青色
blue 0, 0, 255 0, 0, 1 蓝色
black 0, 0, 0 0, 0, 0 黑色
seashell 255, 245, 238 1, 0.96,0.93 海贝色
gold 255, 215, 0 1, 0.84, 0 金色
pink 255, 192, 203 1, 0.75, 0.80 粉红色
brown 165, 42, 42 0.65, 0.16, 0.16 棕色
purple 160, 32, 240 0.63, 0.13, 0.94 紫色
tomato 255, 99, 71 1, 0.39, 0.28 番茄色

查看更多颜色,请点击链接:https://www.sioe.cn/yingyong/yanse-rgb-16/
注意:这个表格的颜色,使用了Markdown的颜色模式,也不算是Markdown独有的,其实是网页的XXX。本来不想整理这个的,但是看到这些颜色可以使自己更熟练使用Markdown调色模式
如:

前文一直用的这个颜色

但是,这么多色号,哪记得住呀,可以直接使用英文名称

我是蓝色
我是粉红色
我是棕色
我是紫色
我是青色
__我是青色加粗__
······

上面这个框最终显示效果如下:

前文一直用的这个颜色
但是,这么多色号,哪记得住呀,下面是直接使用英文名称产生的效果
我是蓝色
我是粉红色
我是棕色
我是紫色
我是青色
我是青色加粗
···

–RGB指 红 蓝 绿 组合
–RGB整数值,小数值
–turtle.colormode(mode),默认小数值
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第28张图片

单元小结

  • turtle库的海龟绘图法
  • turtle.setup()调整绘图窗体在电脑屏幕中的布局
  • 画布上以中心为原点的空间坐标系: 绝对坐标&海龟坐标
  • 画布上以空间x轴为0度的角度坐标系: 绝对角度&海龟角度
  • RGB色彩体系,整数值&小数值,色彩模式切换

2.4 turtle程序语法元素分析

2.4.1 库引用和 import

库引用

扩充Python程序功能的方式

import 更多用法

使用fromimport保留字共同完成
from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>)
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第29张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第30张图片

2.4.2 画笔控制函数

penup(),pendown(),pensize(),pencolor()
别名:pu(),pd()
pensize(width) --> 别名:width(width)
pencolor(color) 颜色字符串、rgb值(三个小数值,或 一个元组小数值)

画笔操作后一直有效,一般成对出现

  • turtle.penup() 别名 turtle.pu()
    抬起画笔,海龟在飞行
  • turtle.pendown() 别名 turtle.pd()
    落下画笔,海龟在爬行

画笔设置后一直有效,直至下次重新设置

  • turtle.pensize(width) 别名 turtle.width(width)
    画笔宽度,海龟的腰围
  • turtle.pencolor(color) color为颜色字符串或r,g,b值
    画笔颜色,海龟在涂装

pencolor(color)的color可以有三种形式

  • 颜色字符串 :turtle.pencolor(“purple”)
  • RGB的小数值:turtle.pencolor(0.63, 0.13, 0.94)
  • RGB的元组值:turtle.pencolor((0.63,0.13,0.94))

2.4.3 运动控制函数

控制海龟行进:走直线 & 走曲线
画笔设置后一直有效,直至下次重新设置

  • turtle.forward(d) 别名 turtle.fd(d)
    向前行进,海龟走直线

  • d: 行进距离,可以为负数

  • turtle.circle(r, extent=None)
    根据半径r绘制extent角度的弧形

  • r: 默认圆心在海龟左侧r距离的位置

  • extent: 绘制角度,默认是360度整圆

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第31张图片

2.4.4 方向控制函数

控制海龟面对方向: 绝对角度 & 海龟角度

  • turtle.setheading(angle) 别名 turtle.seth(angle)
    改变行进方向,海龟走角度
  • angle: 行进方向的绝对角度

控制海龟面对方向: 绝对角度 & 海龟角度

  • turtle.left(angle) 海龟向左转
  • turtle.right(angle) 海龟向右转
  • angle: 在海龟当前行进方向上旋转的角度
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第32张图片

2.4.5 循环语句与range()函数

循环语句

按照一定次数循环执行一组语句
for <变量> in range(<次数>):
<被循环执行的语句>

  • <变量>表示每次循环的计数,0到<次数>-1
>>> for i in range(5):
	print(i)

0
1
2
3
4

>>> for i in range(5):
	print("hello:",i)

hello: 0
hello: 1
hello: 2
hello: 3
hello: 4

range()函数

产生循环计数序列

  • range(N)
    产生 0 到 N-1的整数序列,共N个
  • range(M,N)
    产生 M 到 N-1的整数序列,共N-M个
range(5)
	0, 1, 2, 3, 4
range(2, 5)
	2, 3, 4

2.4.6"Python蟒蛇绘制"代码分析

单元小结

turtle程序语法元素分析

  • 库引用: import、from…import、import…as…
  • penup()、pendown()、pensize()、pencolor()
  • fd()、circle()、seth()
  • 循环语句:for和in、range()函数

第3章 基本数据类型

  • 3.1 数字类型及操作
  • 3.2 实例3: 天天向上的力量
  • 3.3 字符串类型及操作
  • 3.4 模块2: time库的使用
  • 3.5 实例4: 文本进度条

方法论

  • Python数字及字符串类型

实践能力

  • 初步学会编程进行字符类操作

3.1 数字类型及操作

  • 3.1.1 整数类型
  • 3.1.2浮点数类型
  • 3.1.3复数类型
  • 3.1.4数值运算操作符
  • 3.1.5数值运算函数

3.1.1 整数类型

与数学中整数的概念一致
整数无限制 pow()

  • 可正可负,没有取值范围限制
  • pow(x,y)函数:计算 xy,想算多大算多大
>>> pow(2,100)
1267650600228229401496703205376
>>> pow(2,pow(2,15))
14154610310449547890015530277449516013481307114723881672343857482723666342408452535960253564766484150754758729616561264923898085795447378488819382962508731917439277935449130110501626512779570298469602117832429335212075454134849698568518511412885151632014829953890550974606220986356750033539292242785829356644162625727733081532775143464803133719886126294814835624381789289588677778500721983161748412519555909966720186450936408508036796302203672013838448667914492847375182628131230834390372436784404208971399237782789527703123187783290048945470654890775968353960171536031700503713020147624438727011113795544843097186623068837760104753484414936004919434790412719929201953319830649301061647272414389408776851646589486548861716411244739756262416327501501266553699810212935700660423054824860408831656358628357286370460583524037560857456912394738978919990859763452037046599671574272395358365071336569088152460801391955694610720063015903729548307386443911380160653441311312076042640538974408289046620471832343775474272876919417415359465108829909044778631854737985283880604575689279436339239288726819275020295729631308408548537399370768810356461793830554834338760514020376144247489029690181591865198110515453679671037671828197091354790191316833093307973744081973398315272390407159081122130951267707176060012888988893707108962488623615038692052145369082581969217655930653253928363321425944111346034755093660281456903063506018592952612962633310186822763175677495345710587722355676795569202407891090705212539871310312639022930347443673569325099521888284753623113164452842286404894218092637384236309312430249145878639281347191861041646606053560015919627786463782954136597707826469792362890626164424180715710392825512893488482745228930595617178601940346982418048875312750781096036371604959075799953664196364170289275733916705807968185260742260950143751894385792160716775407660856056041061230366696674346777234726755644589916712684141008010314539177366659472849566748840353066212864651837986938525998033246198651818562444220792336872945085364085210874188739084982027105970804744802498188580114909305185127137988036291016387162785788741452144290261862766022890124845268300766473568287648783277267198164286789042079444568943931859830903470451768867323262539122976495244398804037014305667613803599255585227182019542875175873672475107776789346644725486477870483063307708623700155258580054797564714992272449011428057497695641847532119672232262129641656788566048924169849150974229605341223334538769812792435657663917963116051492226283282553330615438775258460294045071288900531894425275446651415135711361871268749146016697503924861005075684420468317806310325405740779442744542280876392417368185051637599103651319906329474629932045852181224319923238642449473943904386563564240374719324844521865456921025034790705999538231651942110196967605752644268028483030318043057335322280501802860341751689188274606260422686582951407069150471890494925789966504940058823370711500048689561934065931848386336940684098239034371444173760391742350110532288468514242179551729029186510036109841084026509293593963056343130470887251130390768119400901098555782859378291642135766128222103479577459473310474825253466025426531768998092788082327965575318321502497692536006679022680296617001496328685419562661195280424865340147787798469817610331550072627301626759545202218873847103870517218292719175922950571695895397063616710820948094058717904686232348959147964643900192591675137718648328690360156455421950084560986150383480284008030058019449571562827463795394702506037554653587862814760860445678937151306359149460853616123727427326380373722876338971183032500363558977582095690102460515634291092558649382455245502005802182743148097380750227756512203741052272159062052927519186670604753285932253677930610704221087338009838555075918064134609645855953163599711792842836047314686685454847613817475916397364534198964493234863970307763977612025904676375054733902222494567240932386825577627818395309382337512819996087113561478356551952366660563556788418898622840146740590529951702207114044450127666422033145923717125948779683432652102327981350232991173181917703651238070867043818097596022601516129968969942941860844756191381214552943895858742377916347012961245501796720594858382564458465305991376624808413443765039892446333450160708871981204214355757262371893121618180215480063895011823934417121420449530722640166767990116246203122464685546543715447173552277401576290867397106758452099921333420351440389610658926533921828756229326700677984339348917095198778507942194914479881601719323310064956202800941494643794501530854062250814718795858940879160921416237523451127510677031664036811623319202917408473889576323110533424261529473240116279222258785399350229746160627748391104890800941749728410681020066456774992937690913628537193009587752220886709097238954148664644007563144702819620342765315125440097261746493999375817397181179824173609859582594684854365867336866597710306776646779054015223600418924819514541353605409174110984122867238306727129106033867481363488780565457461121421111166599857823982756271224494143071407494048840607538637060242810314855386661333328355978175146163317281189821806288236576686680996217998420111580207677727929122987687856145744160193205461967934860186778845507158706080049888299781489669807701368843532269498536545416558370294980170310859436604404660760194794351810454368978453510487884401022686777982571347740816743571953588477612266036530402739854419822213180878158351073175712118412158256064533485210979364135202959982607510407787037403663098719991147174410691828257829962994116230874150089109413032841821315847998162107280342555556879567852878870989419277375991598243985275734231177282528397689191450181179955979462822649465237416911808584411943733870989695301268340149236566278491290621891455728702122259094645309195316340902063711463216637972798057600284952880848481793800539314356041825175166008239367379199159741035911676388988717540184701725892349893970518930285743652888903037802391946225382155322127355552993975428453506293615603471954592867295611682353834289308283788876781975906241103722673387566684148995261384808667471148314146875796916360205860136356755590334886497210622441427879604040569613061760229812428409848254217971503939097138849907080086543275580256190742132707142524315151716389945057201443475021858485281290000556297034226954250472095181775771285113154920596137223667246153439683573329241911780419567531329415963221012504170688139773034980339406137910997201747867738446967340340102691395538782123871085081586228397335936349189756166133682438828083915092448068093378829653387015455046915895176504722395807541895476497900380265067077097630981487465240310138005318908768582273605016761618746619464316479295725559929672985534711526934714524801198976081733367532601244525108153334164093570296332651726142036633264099761531024670833791295881128372807111113464908989478084020624012289631941627116574229984292635792765154140009790537406627338166329815085351285184402580067823922888609038232074368207930418819070937918749176358298548081506408949071276004301852023014573984935331119189941008537537719562934301625660113611631689534621880102318190002136697804478568712485643775845090858887978837475383091818107006150322255630910166894747802534125713386255818179210615493525575883236595626756505635351861447544335565397470983226436095424861205129174637067130590642307629243536179720534925271191926581718513459577007725718419981760362693998890124807450759249804793903493327341027744000081200734615405405710515069710039046234843447620051263459054658938178953779281395965499367201004900133759566058892007675966880659610760034720055858902225946550104301231273516653168626634847859664462637406245648753516407809237030068681074407902716829360433048735796489899785717548988407891844801295704469910295047586163931064875233213125074540368086672100736021442900506196106147381395432856493469863932131024568637936655125336559319417905376190206047306014431812506620196874917115473605971178569772408171100397371533552124547459077871311795786564705675350501927023477396533122905225058716128979904299618575500310336657256479879827518684072947304373195053357824252903244279943083749608066844354164459078171071682983429451829855941112814994724957495016424180427346811585604502413092790638167460670162747954618327746990077744238957486776153958484937656722719572786645463431616091268100282542146596336252239345089316917285840283423566693326354580799571478337895016968357817482348849190935742763303545778419752496038991054071048957875982636306792066277964337540455974091765024388676005370168791699144747548400243119221696473883799528025238470801024392851125657516777263732016884032544667890707135752142561924524490291100405379946274245324036201798800565187212191087713740736381187190732113672955143767085965372942045440999035907543716561786569601702176758321532681645916740045002390737435026480991056245485874935448254792705897424944951812237223296933454686393069905231189956405670425313695771311131590273818080713469916045139064503982194263008992046624354925784856665539744927231738597774854129270160683415155174371151370503727502792785483327991937994001541664428014273100765370201199360734952219747919397598461689420553973573482781780504410244900058938182569586653889712013229316805738460845250163322246468666174908324960849916901715830293526098364909081134646683438299853515905529452843725739782954850979508930724235186059820854871544701550252690258540446464965724484952253430962618963789314828832866575088592288684878441844790875384539741441870048843665612567234047721908475860085439613490711311917089432953376643841845327746615032459102574519235156077115597054781325560401976634149118851436979854648073092970029102505053022877694123374411993604245191607165528908828167963782968816418279814530352072337520635187827784937438277081099134931629321824276272610462801682699580775411226681046337123778561415461031044954789001553027744951601348130711472388167234385748272366634240845253596025356476648415075475872961656126492389808579544737848881938296250873191743927793544913011050162651277957029846960211783242933521207545413484969856851851141288515163201482995389055097460622098635675003353929224278582935664416262572773308153277514346480313371988612629481483562438178928958867777850072198316174841251955590996672018645093640850803679630220367201383844866791449284737518262813123083439037243678440420897139923778278952770312318778329004894547065489077596835396017153603170050371302014762443872701111379554484309718662306883776010475348441493600491943479041271992920195331983064930106164727241438940877685164658948654886171641124473975626241632750150126655369981021293570066042305482486040883165635862835728637046058352403756085745691239473897891999085976345203704659967157427239535836507133656908815246080139195569461072006301590372954830738644391138016065344131131207604264053897440828904662047183234377547427287691941741535946510882990904477863185473798528388060457568927943633923928872681927502029572963130840854853739937076881035646179383055483433876051402037614424748902969018159186519811051545367967103767182819709135479019131683309330797374408197339831527239040715908112213095126770717606001288898889370710896248862361503869205214536908258196921765593065325392836332142594411134603475509366028145690306350601859295261296263331018682276317567749534571058772235567679556920240789109070521253987131031263902293034744367356932509952188828475362311316445284228640489421809263738423630931243024914587863928134719186104164660605356001591962778646378295413659770782646979236289062616442418071571039282551289348848274522893059561717860194034698241804887531275078109603637160495907579995366419636417028927573391670580796818526074226095014375189438579216071677540766085605604106123036669667434677723472675564458991671268414100801031453917736665947284956674884035306621286465183798693852599803324619865181856244422079233687294508536408521087418873908498202710597080474480249818858011490930518512713798803629101638716278578874145214429026186276602289012484526830076647356828764878327726719816428678904207944456894393185983090347045176886732326253912297649524439880403701430566761380359925558522718201954287517587367247510777678934664472548647787048306330770862370015525858005479756471499227244901142805749769564184753211967223226212964165678856604892416984915097422960534122333453876981279243565766391796311605149222628328255333061543877525846029404507128890053189442527544665141513571136187126874914601669750392486100507568442046831780631032540574077944274454228087639241736818505163759910365131990632947462993204585218122431992323864244947394390438656356424037471932484452186545692102503479070599953823165194211019696760575264426802848303031804305733532228050180286034175168918827460626042268658295140706915047189049492578996650494005882337071150004868956193406593184838633694068409823903437144417376039174235011053228846851424217955172902918651003610984108402650929359396305634313047088725113039076811940090109855578285937829164213576612822210347957745947331047482525346602542653176899809278808232796557531832150249769253600667902268029661700149632868541956266119528042486534014778779846981761033155007262730162675954520221887384710387051721829271917592295057169589539706361671082094809405871790468623234895914796464390019259167513771864832869036015645542195008456098615038348028400803005801944957156282746379539470250603755465358786281476086044567893715130635914946085361612372742732638037372287633897118303250036355897758209569010246051563429109255864938245524550200580218274314809738075022775651220374105227215906205292751918667060475328593225367793061070422108733800983855507591806413460964585595316359971179284283604731468668545484761381747591639736453419896449323486397030776397761202590467637505473390222249456724093238682557762781839530938233751281999608711356147835655195236666056355678841889862284014674059052995170220711404445012766642203314592371712594877968343265210232798135023299117318191770365123807086704381809759602260151612996896994294186084475619138121455294389585874237791634701296124550179672059485838256445846530599137662480841344376503989244633345016070887198120421435575726237189312161818021548006389501182393441712142044953072264016676799011624620312246468554654371544717355227740157629086739710675845209992133342035144038961065892653392182875622932670067798433934891709519877850794219491447988160171932331006495620280094149464379450153085406225081471879585894087916092141623752345112751067703166403681162331920291740847388957632311053342426152947324011627922225878539935022974616062774839110489080094174972841068102006645677499293769091362853719300958775222088670909723895414866464400756314470281962034276531512544009726174649399937581739718117982417360985958259468485436586733686659771030677664677905401522360041892481951454135360540917411098412286723830672712910603386748136348878056545746112142111116659985782398275627122449414307140749404884060753863706024281031485538666133332835597817514616331728118982180628823657668668099621799842011158020767772792912298768785614574416019320546196793486018677884550715870608004988829978148966980770136884353226949853654541655837029498017031085943660440466076019479435181045436897845351048788440102268677798257134774081674357195358847761226603653040273985441982221318087815835107317571211841215825606453348521097936413520295998260751040778703740366309871999114717441069182825782996299411623087415008910941303284182131584799816210728034255555687956785287887098941927737599159824398527573423117728252839768919145018117995597946282264946523741691180858441194373387098969530126834014923656627849129062189145572870212225909464530919531634090206371146321663797279805760028495288084848179380053931435604182517516600823936737919915974103591167638898871754018470172589234989397051893028574365288890303780239194622538215532212735555299397542845350629361560347195459286729561168235383428930828378887678197590624110372267338756668414899526138480866747114831414687579691636020586013635675559033488649721062244142787960404056961306176022981242840984825421797150393909713884990708008654327558025619074213270714252431515171638994505720144347502185848528129000055629703422695425047209518177577128511315492059613722366724615343968357332924191178041956753132941596322101250417068813977303498033940613791099720174786773844696734034010269139553878212387108508158622839733593634918975616613368243882808391509244806809337882965338701545504691589517650472239580754189547649790038026506707709763098148746524031013800531890876858227360501676161874661946431647929572555992967298553471152693471452480119897608173336753260124452510815333416409357029633265172614203663326409976153102467083379129588112837280711111346490898947808402062401228963194162711657422998429263579276515414000979053740662733816632981508535128518440258006782392288860903823207436820793041881907093791874917635829854808150640894907127600430185202301457398493533111918994100853753771956293430162566011361163168953462188010231819000213669780447856871248564377584509085888797883747538309181810700615032225563091016689474780253412571338625581817921061549352557588323659562675650563535186144754433556539747098322643609542486120512917463706713059064230762924353617972053492527119192658171851345957700772571841998176036269399889012480745075924980479390349332734102774400008120073461540540571051506971003904623484344762005126345905465893817895377928139596549936720100490013375956605889200767596688065961076003472005585890222594655010430123127351665316862663484785966446263740624564875351640780923703006868107440790271682936043304873579648989978571754898840789184480129570446991029504758616393106487523321312507454036808667210073602144290050619610614738139543285649346986393213102456863793665512533655931941790537619020604730601443181250662019687491711547360597117856977240817110039737153355212454745907787131179578656470567535050192702347739653312290522505871612897990429961857550031033665725647987982751868407294730437319505335782425290324427994308374960806684435416445907817107168298342945182985594111281499472495749501642418042734681158560450241309279063816746067016274795461832774699007774423895748677615395848493765672271957278664546343161609126810028254214659633625223934508931691728584028342356669332635458079957147833789501696835781748234884919093574276330354577841975249603899105407104895787598263630679206627796433754045597409176502438867600537016879169914474754840024311922169647388379952802523847080102439285112565751677726373201688403254466789070713575214256192452449029110040537994627424532403620179880056518721219108771374073638118719073211367295514376708596537294204544099903590754371656178656960170217675832153268164591674004500239073743502648099105624548587493544825479270589742494495181223722329693345468639306990523118995640567042531369577131113159027381808071346991604513906450398219426300899204662435492578485666553974492723173859777485412927016068341515517437115137050372750279278548332799193799400154166442801427310076537020119936073495221974791939759846168942055397357348278178050441024490005893818256958665388971201322931680573846084525016332224646866617490832496084991690171583029352609836490908113464668343829985351590552945284372573978295485097950893072423518605982085487154470155025269025854044646496572448495225343096261896378931482883286657508859228868487844184479087538453974144187004884366561256723404772190847586008543961349071131191708943295337664384184532774661503245910257451923515607711559705478132556040197663414911885143697985464807309297002910250505302287769412337441199360424519160716552890882816796378296881641827981453035207233752063518782778493743827708109913493162932182427627261046280168269958077541122668104633712377856

4种进制表示形式

  • 十进制:1010, 99, -217
  • 二进制,以0b或0B开头:0b010, -0B101
  • 八进制,以0o或0O开头:0o123, -0O456
  • 十六进制,以0x或0X开头:0x9a, -0X89

数字电路中的BODH(拨电话)体现的这四种形式,与这里不一样?

关于Python整数,就需要知道这些。
• 整数无限制 pow()
• 4种进制表示形式

3.1.2浮点数类型

与数学中实数的概念一致

  • 带有小数点及小数的数字
  • 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
  • 取值范围数量级约-10307至10308,精度数量级10-16

浮点数间运算存在不确定尾数,不是bug
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第33张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第34张图片
浮点数间运算存在不确定尾数,不是bug

>>> 0.1+0.2 == 0.3
False
>>> round(0.1+0.2,1) == 0.3
True
>>> 
  • round(x, d):对x四舍五入,d是小数截取位数
  • 浮点数间运算与比较用round()函数辅助
  • 不确定尾数一般发生在10-16左右,round()十分有效

浮点数可以采用科学计数法表示

关于Python浮点数,需要知道这些。
• 取值范围和精度基本无限制
• 运算存在不确定尾数 round()
• 科学计数法表示

3.1.3复数类型

与数学中复数的概念一致

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第35张图片
Z.real获得实部,Z.imag获得虚部MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第36张图片

3.1.4数值运算操作符

操作符是完成运算的一种符号体系

操作符及使用 描述
x + y 加,x与y之和
x – y 减,x与y之差
x * y 乘,x与y之积
x / y 除,x与y之商 10/3结果是3.3333333333333335
x // y 整数除,x与y之整数商 10//3结果是3
+ x x本身
- y x的负值
x % y 余数,模运算 10%3结果是1
x ** y 幂运算,x的y次幂,xy
当y是小数时,开方运算10**0.5结果是 10 \sqrt{10} 10

二元操作符有对应的增强赋值操作符

增强操作符及使用 描述
x op= y 即 x = x op y,其中,op为二元操作符
x += y  x -= y  x *= y  x /= y
x //= y  x %= y  x **= y
>>> x = 3.1415
>>> x **= 3 # 与 x = x **3 等价
31.006276662836743

这个表格排版参考主要参考https://3nice.cc/2018/10/01/markdowntable

数字类型的关系
类型间可进行混合运算,生成结果为"最宽"类型

  • 三种类型存在一种逐渐"扩展"或"变宽"的关系:
    整数 -> 浮点数 -> 复数
  • 例如:123 + 4.0 = 127.0 (整数+浮点数 = 浮点数)

3.1.5数值运算函数

一些以函数形式提供的数值运算功能

函数及使用 描述
abs(x) 绝对值,x的绝对值
abs(-10.01) 结果为 10.01
divmod(x,y) 商余,(x//y, x%y),同时输出商和余数
divmod(10, 3) 结果为 (3, 1)
pow(x, y[, z]) 幂余,(x**y)%z,[…]表示参数z可省略
pow(3, pow(3, 99), 10000) 结果为 4587
round(x[, d]) 四舍五入,d是保留小数位数,默认值为0
round(-10.123, 2) 结果为 -10.12
max(x1,x2, … ,xn) 最大值,返回x1,x2, … ,xn中的最大值,n不限
max(1, 9, 5, 4, 3) 结果为 9
min(x1,x2, … ,xn) 最小值,返回x1,x2, … ,xn中的最小值,n不限
min(1, 9, 5, 4, 3) 结果为 1
int(x) 将x变成整数,舍弃小数部分
int(123.45) 结果为123; int(“123”) 结果为123
float(x) 将x变成浮点数,增加小数部分
float(12) 结果为12.0; float(“1.23”) 结果为1.23
complex(x) 将x变成复数,增加虚数部分
complex(4) 结果为 4 + 0j

单元小结

数字类型及操作

  • 整数类型的无限范围及4种进制表示
  • 浮点数类型的近似无限范围、小尾数及科学计数法
  • +、-、*、/、//、%、
    **、二元增强赋值操作符
  • abs()、divmod()、pow()、round()、max()、min()
  • int()、float()、complex()

3.2 实例3: 天天向上的力量

3.2.1 "天天向上的力量"问题分析

天天向上的力量

基本问题:持续的价值

  • 一年365天,每天进步1%,累计进步多少呢?
    1.01365
  • 一年365天,每天退步1%,累计剩下多少呢?
    0.99365

需求分析

天天向上的力量

  • 数学公式可以求解,似乎没必要用程序
  • 如果是"三天打鱼两天晒网"呢?
  • 如果是"双休日又不退步"呢?

3.2.2"天天向上的力量"第一问

天天向上的力量

问题1: 1‰的力量

  • 一年365天,每天进步1‰,累计进步多少呢?
    1.001365
  • 一年365天,每天退步1‰,累计剩下多少呢?
    0.999365
#DayDayUpQ1.py
dayup = pow(1.001, 365)
daydown = pow(0.999, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))

运行结果:

向上:1.44,向下:0.69

1.001365 = 1.44  0.999365 = 0.69

1‰的力量,接近2倍,不可小觑哦

3.2.3"天天向上的力量"第二问

天天向上的力量

问题2: 5‰和1%的力量

  • 一年365天,每天进步5‰或1%,累计进步多少呢?
    1.005365  1.01365
  • 一年365天,每天退步5‰或1%,累计剩下多少呢?
    0.995365  0.99365
#DayDayUpQ2.py
#使用变量的好处:一处修改即可
dayfactor = 0.005
dayup = pow(1+dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("‰5向上:{:.2f},‰5向下:{:.2f}".format(dayup, daydown))
dayfactor1 = 0.01
dayup = pow(1+dayfactor1, 365)
daydown = pow(1-dayfactor1, 365)
print("%1向上:{:.2f},%1向下:{:.2f}".format(dayup, daydown))

运行结果:

5向上:6.17,‰5向下:0.16
%1向上:37.78%1向下:0.03

3.2.4"天天向上的力量"第三问

天天向上的力量

问题3: 工作日的力量

  • 一年365天,一周5个工作日,每天进步1%
  • 一年365天,一周2个休息日,每天退步1%
  • 这种工作日的力量,如何呢?
    1.01365 (数学思维)  for…in… (计算思维)
#DayDayUpQ3.py
#采用循环模拟365天的过程
#抽象 + 自动化
dayup = 1.0
dayfactor = 0.01
for i in range(365):
    if i % 7 in [6,0]:
        dayup = dayup*(1-dayfactor)
    else:
        dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f} ".format(dayup))

运行结果:

工作日的力量:4.63 

1.001365 = 1.44  1.005365 = 6.17 1.01365 = 37.78

尽管工作日提高1%,但总体效果介于1‰和5‰的力量之间

3.2.5"天天向上的力量"第四问

天天向上的力量

问题4: 工作日的努力

  • 工作日模式要努力到什么水平,才能与每天努力1%一样?
  • A君: 一年365天,每天进步1%,不停歇
  • B君: 一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
    for…in… (计算思维)  def…while… ("笨办法"试错)
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第37张图片
#DayDayUpQ4.py

#根据df参数计算工作日力量的函数
#参数不同,这段代码可共用
#def保留字用于定义函数
def dayUP(df):
    dayup = 1
    for i in range(365):
        if i % 7 in [6,0]:
            dayup = dayup*(1 - 0.01)
        else:
          dayup = dayup*(1 + df)
    return dayup
dayfactor = 0.01

#while保留字判断条件是否成立,条件成立时循环执行
while dayUP(dayfactor) < 37.78:
    dayfactor += 0.001
print("工作日的努力参数是:{:.3f} ".format(dayfactor))

运行结果:

工作日的努力参数是:0.019 

1.01365 = 37.78  1.019365 = 962.89

工作日模式,每天要努力到1.9%,相当于365模式每天1%的效果!

3.2.6"天天向上的力量"举一反三

天天向上的力量

  • 实例虽然仅包含8-12行代码,但包含很多语法元素
  • 条件循环、计数循环、分支、函数、计算思维
  • 清楚理解这些代码能够快速入门Python语言

问题的变化和扩展

  • 工作日模式中,如果休息日不下降呢?
  • 如果努力每天提高1%,休息时每天下降1‰呢?
  • 如果工作3天休息1天呢?
  • "三天打鱼,两天晒网"呢?
  • "多一份努力"呢? (努力比下降多一点儿)
  • "多一点懈怠"呢?(下降比努力多一点儿)

http://ncre.neea.edu.cn/

3.3 字符串类型及操作

  • 3.3.1 字符串类型的表示
  • 3.3.2 字符串操作符
  • 3.3.3 字符串处理函数
  • 3.3.4 字符串处理方法
  • 3.3.5 字符串类型的格式化

3.3.1 字符串类型的表示

字符串

由0个或多个字符组成的有序字符序列

  • 字符串由一对单引号或一对双引号表示
    "请输入带有符号的温度值: " 或者 ‘C’
  • 字符串是字符的有序序列,可以对其中的字符进行索引
    “请” "请输入带有符号的温度值: " 的第0个字符

字符串有 2类共4种 表示方法

  • 由一对单引号或双引号表示,仅表示单行字符串
    "请输入带有符号的温度值: " 或者 ‘C’
  • 由一对三单引号或三双引号表示,可表示多行字符串
#也经常被认为是多行注释
''' Python
			语言 '''

Python语言为何提供 2类共4种 字符串表示方式?

  • 如果希望在字符串中包含双引号或单引号呢?
    ‘这里有个双引号(")’ 或者 “这里有个单引号(’)”
  • 如果希望在字符串中既包括单引号又包括双引号呢?
    ‘’’ 这里既有单引号(’)又有双引号 (") ‘’’

字符串的序号
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第38张图片
字符串的使用

使用[ ]获取字符串中一个或多个字符

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第39张图片
字符串切片高级用法

使用[M: N: K]根据步长对字符串切片

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第40张图片
字符串的特殊字符

转义符 \

  • 转义符表达特定字符的本意
    “这里有个双引号(\”)" 结果为 这里有个双引号(")
  • 转义符形成一些组合,表达一些不可打印的含义
    "\b"回退 "\n"换行(光标移动到下行首) “\r” 回车(光标移动到本行首)

3.3.2 字符串操作符

字符串操作符

由0个或多个字符组成的有序字符序列

操作符及使用 描述
x + y 连接两个字符串x和y
n * x 或 x * n 复制n次字符串x
x in s 如果x是s的子串,返回True,否则返回False

获取星期字符串

  • 输入:1-7的整数,表示星期几
  • 输出:输入整数对应的星期字符串
  • 例如:输入3,输出 星期三
#WeekNamePrintV1.py
weekStr ="星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId - 1 ) * 3
print(weekStr[pos: pos+3])
#WeekNamePrintV2.py
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期" + weekStr[weekId-1])

3.3.3 字符串处理函数

一些以函数形式提供的字符串处理功能

函数及使用 描述
len(x) 长度,返回字符串x的长度
len(“一二三456”) 结果为 6
str(x) 任意类型x所对应的字符串形式
str(1.23)结果为"1.23" str([1,2])结果为"[1,2]"
hex(x) 或 oct(x) 整数x的十六进制或八进制小写形式字符串
hex(425)结果为"0x1a9" oct(425)结果为"0o651"
chr(u) x为Unicode编码,返回其对应的字符
ord(x) x为字符,返回其对应的Unicode编码

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第41张图片

Unicode编码

Python字符串的编码方式

  • 统一字符编码,即覆盖几乎所有字符的编码方式
  • 从0到1114111 (0x10FFFF)空间,每个编码对应一个字符
  • Python字符串中每个字符都是Unicode编码字符

一些有趣的例子
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第42张图片

3.3.4 字符串处理方法

"方法"在编程中是一个专有名词

一些以方法形式提供的字符串处理功能

方法及使用 描述
str.lower() 或 str.upper() 返回字符串的副本,全部字符小写/大写
"AbCdEfGh".lower() 结果为 “abcdefgh”
str.split(sep=None) 返回一个列表,由str根据sep被分隔的部分组成
"A,B,C".split(",") 结果为 [‘A’,‘B’,‘C’]
str.count(sub) 返回子串sub在str中出现的次数
"an apple a day".count(“a”) 结果为 4
str.replace(old, new) 返回字符串str副本,所有old子串被替换为new
"python".replace(“n”,“n123.io”) 结果为"python123.io"
str.center(width[,fillchar]) 字符串str根据宽度width居中,fillchar可选
"python".center(20,"=") 结果为’=======python=======’
str.strip(chars) 从str中去掉在其左侧和右侧chars中列出的字符
"= python= “.strip(” =np") 结果为"ytho"
str.join(iter) 在iter变量除最后元素外每个元素后增加一个str
",".join(“12345”) 结果为"1,2,3,4,5" #主要用于字符串分隔等

3.3.5 字符串类型的格式化

字符串类型的格式化

格式化是对字符串进行格式表达的方式

  • 字符串格式化使用.format()方法,用法如下:
    <模板字符串>.format(<逗号分隔的参数>)

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第43张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第44张图片

format()方法的格式控制

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第45张图片

>>>"{0:=^20}".format("PYTHON")
'=======PYTHON======='
>>>"{0:*>20}".format("BIT")
'*****************BIT'
>>>"{:10}".format("BIT")
'BIT '

>>>"{0:,.2f}".format(12345.6789)
'12,345.68'
>>>"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
'110101001,Ʃ,425,651,1a9,1A9'
>>>"{0:e},{0:E},{0:f},{0:%}".format(3.14)
'3.140000e+00,3.140000E+00,3.140000,314.000000%'

单元小结

字符串类型及操作

  • 正向递增序号、反向递减序号、<字符串>[M:N:K]
  • +、*、in、len()、str()、hex()、oct()、ord()、chr()
  • .lower()、.upper()、.split()、.count()、.replace()
  • .center()、.strip()、.join()、.format()格式化

3.4 模块2: time库的使用

3.4.1 time库基本介绍

time库概述

time库是Python中处理时间的标准库

  • 计算机时间的表达
  • 提供获取系统时间并格式化输出功能
  • 提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()

time库包括三类函数

  • 时间获取:time() ctime() gmtime()
  • 时间格式化:strftime() strptime()
  • 程序计时:sleep(), perf_counter()

3.4.2时间获取

函数 描述
time() 获取当前时间戳,即计算机内部时间值,浮点数
ctime() 获取当前时间并以易读方式表示,返回字符串
gmtime() 获取当前时间,表示为计算机可处理的时间格式
#获取当前时间戳,即计算机内部时间值,浮点数
>>>time.time()
1516939876.6022282

#获取当前时间并以易读方式表示,返回字符串
>>>time.ctime()
'Fri Jan 26 12:11:16 2018'

#获取当前时间,表示为计算机可处理的时间格式
>>>time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1, 
tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16, 
tm_wday=4, tm_yday=26, tm_isdst=0)

3.4.3 时间格式化

时间格式化

将时间以合理的方式展示出来

  • 格式化:类似字符串格式化,需要有展示模板
  • 展示模板由特定的格式化控制符组成
  • strftime()方法
函数 描述
strftime(tpl, ts) tpl是格式化模板字符串,用来定义输出效果
ts是计算机内部时间类型变量
strptime(str, tpl) str是字符串形式的时间值
tpl是格式化模板字符串,用来定义输入效果
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
'2018-01-26 12:55:20'

>>>timeStr = '2018-01-26 12:55:20'
>>>time.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018,tm_mon=1,tm_mday=26, tm_hour=4, tm_min=11,tm_sec=16,tm_wday=4, tm_yday=26, tm_isdst=0)

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第46张图片

格式化控制符

格式化字符串 日期/时间说明 值范围和实例
%Y 年份 0000~9999,例如:1900
%m 月份 01~12,例如:10
%B 月份名称 January~December,例如:April
%b 月份名称缩写 Jan~Dec,例如:Apr
%d 日期 01~31,例如:25
%A 星期 Monday~Sunday,例如:Wednesday
%a 星期缩写 Mon~Sun,例如:Wed
%H 小时(24h制) 00~23,例如:12
%I 小时(12h制) 01~12,例如:7
%p 上/下午 AM, PM,例如:PM
%M 分钟 00~59,例如:26
%S 00~59,例如:26

3.4.4 程序计时应用

程序计时

程序计时应用广泛

  • 程序计时指测量起止动作所经历时间的过程
  • 测量时间:perf_counter()
  • 产生时间:sleep()
函数 描述
perf_counter() 返回一个CPU级别的精确时间计数值,单位为秒
由于这个计数值起点不确定,连续调用差值才有意义
sleep(s) s拟休眠的时间,单位是秒,可以是浮点数
>>>start = time.perf_counter()
318.66599499718114
>>>end = time.perf_counter() 
341.3905185375658
>>>end - start
22.724523540384666


>>>def wait():
time.sleep(3.3)
>>>wait() #程序将等待3.3秒后再退出

如何使用Python官方文档?

https://docs.python.org/zh-cn/3/

  • 3.7.3版本开始,Python官方文档有了中文版,快去看看吧,能看英文版更好
  • 鉴于官方文档并非教程,而是技术手册,可以阅读但请注意:
    • 不建议初学者阅读,技术手册中包含较多背景知识,阅读要求较高
    • 不建议作为教程学习,官方文档未考虑认知规律,缺少实例,跟学进展会比较慢
    • 建议作为某些疑惑内容深入理解和查阅的工具手册,与字典用法相似

3.5 实例4: 文本进度条

3.5.1 "文本进度条"问题分析

  • 进度条什么原理呢?

需求分析

文本进度条

  • 采用字符串方式打印可以动态变化的文本进度条
  • 进度条需要能在一行中逐渐变化

问题分析

如何获得文本进度条的变化时间?

  • 采用sleep()模拟一个持续的进度
  • 似乎不那么难

3.5.2 "文本进度条"简单的开始

#TextProBarV1.py 简单的开始
import time
scale = 10
print("------执行开始------")
for i in range(scale+1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    print("{:^3.0f}%[{}->{}]".format(c,a,b))
    time.sleep(0.1)
print("------执行结束------")

运行结果:

------执行开始------
 0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
------执行结束------

3.5.3 "文本进度条"单行动态刷新

单行动态刷新

刷新的关键是 \r

  • 刷新的本质是:用之后打印的字符覆盖之前的字符
  • 不能换行:print()需要被控制
  • 要能回退:打印后光标退回到之前的位置 \r
#TextProBarV2.py
import time
for i in range(101):
    print("\r{:3}%".format(i), end="")
    time.sleep(0.1)

IDLE屏蔽了\r功能
命令行执行(pycharm可以执行)

3.5.4 "文本进度条"实例完整效果

#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2, "-"))
start = time.perf_counter()
for i in range(scale+1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    dur = time.perf_counter() - start
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
    time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))

运行结果:
在这里插入图片描述

3.5.5 "文本进度条"举一反三

举一反三

计算问题扩展

  • 文本进度条程序使用了perf_counter()计时
  • 计时方法适合各类需要统计时间的计算问题
  • 例如:比较不同算法时间、统计程序运行时间

进度条应用

  • 在任何运行时间需要较长的程序中增加进度条
  • 在任何希望提高用户体验的应用中增加进度条
  • 进度条是人机交互的纽带之一

文本进度条的不同设计函数

设计名称 趋势 设计函数
Linear Constant f(x) = x
Early Pause Speeds up f(x) = x+(1-sin(x*π*2+π/2)/-8
Late Pause Slows down f(x) = x+(1-sin(x*π*2+π/2)/8
Slow Wavy Constant f(x) = x+sin(x*π*5)/20
Fast Wavy Constant f(x) = x+sin(x*π*20)/80
Power Speeds up f(x) = (x+(1-x)*0.03)2
Inverse Power Slows down f(x) =1+(1-x)1.5 *-1
Fast Power Speeds up f(x) = (x+(1-x)/2)8
Inverse Fast Power Slows down f(x) = 1+(1-x)3 *-1

第4章 程序的控制结构

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第47张图片

  • 4.1 程序的分支结构
  • 4.2 实例5: 身体质量指数BMI
  • 4.3 程序的循环结构
  • 4.4 模块3: random库的使用
  • 4.5 实例6: 圆周率的计算

方法论

  • Python程序的控制语法及结构

实践能力

  • 学会编写带有条件判断及循环的程序

4.1 程序的分支结构

  • 4.1.1单分支结构
  • 4.1.2二分支结构
  • 4.1.3多分支结构
  • 4.1.4条件判断及组合
  • 4.1.5程序的异常处理

4.1.1单分支结构

根据判断条件结果而选择不同向前路径的运行方式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第48张图片
单分支示例

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第49张图片

4.1.2二分支结构

根据判断条件结果而选择不同向前路径的运行方式

在这里插入图片描述
二分支示例

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第50张图片
紧凑形式:适用于简单表达式的二分支结构

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第51张图片

4.1.3多分支结构

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第52张图片
对不同分数分级的问题
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第53张图片

4.1.4条件判断及组合

条件判断
操作符

操作符 数学符号 描述
< < 小于
<= 小于等于
>= 大于等于
> > 大于
== = 等于
!= 不等于

用于条件组合的三个保留字

操作符及使用 描述
x and y 两个条件x和y的逻辑与
x or y 两个条件x和y的逻辑或
not x 条件x的逻辑非

示例

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第54张图片

4.1.5程序的异常处理

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第55张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第56张图片
异常处理的基本使用

原来这个结构叫做异常处理,即便自己在爬取时经常使用这个结构,也不知道这叫异常处理。看来基础真的要牢固!

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第57张图片

#异常处理
#示例1
try :
    num = eval(input("请输入一个整数: "))
    print(num**2)
except :
    print("输入不是整数")
#异常处理
#示例2
try :
	num = eval(input("请输入一个整数: "))
	print(num**2)
#标注异常类型后,仅响应此类异常,异常类型名字等同于变量名
except NameError:
	print("输入不是整数")

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第58张图片
突然想起Verilog语言中的default就是防止生成锁存器

单元小结

  • 单分支 if 二分支 if-else 及紧凑形式
  • 多分支 if-elif-else 及条件之间关系
  • not  and  or  >  >=  ==  <=  <  !=
  • 异常处理 try-except-else-finally

4.2 实例5: 身体质量指数BMI

4.2.1 "身体质量指数BMI"问题分析

身体质量指数BMI

BMI:对身体质量的刻画

  • BMI:Body Mass Index
    国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
  • 定义 : BMI = 体重 (kg) / 身高2 (m2)

BMI:对身体质量的刻画

  • 实例:体重 72 kg 身高 1.75 m
    BMI 值是 23.5
  • 这个值是否健康呢?

国际:世界卫生组织 国内:国家卫生健康委员会

分类 国际BMI值 (kg/m2) 国内BMI值 (kg/m2)
偏瘦 <18.5 <18.5
正常 18.5 ~ 25 18.5 ~ 24
偏胖 25 ~ 30 24 ~ 28
肥胖 ≥30 ≥28

问题需求

  • 输入:给定体重和身高值
  • 输出:BMI指标分类信息(国际和国内)

4.2.2"身体质量指数BMI"实例讲解

身体质量指标BMI

思路方法

  • 难点在于同时输出国际和国内对应的分类
  • 思路1:分别计算并给出国际和国内BMI分类
  • 思路2:混合计算并给出国际和国内BMI分类
#CalBMIv1.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
who = ""
if bmi < 18.5:
    who = "偏瘦"
elif 18.5 <= bmi < 25:
    who = "正常"
elif 25 <= bmi < 30:
    who = "偏胖"
else:
    who = "肥胖"
print("BMI 指标为:国际'{0}'".format(who))
#CalBMIv2.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
nat = ""
if bmi < 18.5:
    nat = "偏瘦"
elif 18.5 <= bmi < 24:
    nat = "正常"
elif 24 <= bmi < 28:
    nat = "偏胖"
else:
    nat = "肥胖"
print("BMI 指标为:国内'{0}'".format(nat))
#CalBMIv3.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
who, nat = "", ""
if bmi < 18.5:
    who, nat = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24:
    who, nat = "正常", "正常"
elif 24 <= bmi < 25:
    who, nat = "正常", "偏胖"
elif 25 <= bmi < 28:
    who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
    who, nat = "偏胖", "肥胖"
else:
    who, nat = "肥胖", "肥胖"
print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))

4.2.3"身体质量指数BMI"举一反三

关注多分支条件的组合

  • 多分支条件之间的覆盖是重要问题
  • 程序可运行,但如果不正确,要注意多分支
  • 分支结构是程序的重要框架,读程序先看分支

4.3 程序的循环结构

  • 4.3.1 遍历循环
  • 4.3.2 无限循环
  • 4.3.3 循环控制保留字
  • 4.3.4 循环的高级用法

4.3.1 遍历循环

遍历某个结构形成的循环运行方式

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第59张图片

  • 从遍历结构中逐一提取元素,放在循环变量中
  • 由保留字for和in组成,完整遍历所有元素后结束
  • 每次循环,所获得元素放入循环变量,并执行一次语句块

遍历循环的应用

计数循环(N次)

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第60张图片

  • 遍历由range()函数产生的数字序列,产生循环

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第61张图片
计数循环(特定次)
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第62张图片

  • 遍历由range()函数产生的数字序列,产生循环

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第63张图片
字符串遍历循环

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第64张图片

  • s是字符串,遍历字符串每个字符,产生循环
>>> for c in "Python123":
	print(c,end=",")

P,y,t,h,o,n,1,2,3,

列表遍历循环

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第65张图片

  • ls是一个列表,遍历其每个元素,产生循环
>>> for item in [123, "PY", 456]:
	print(item, end=",")

123,PY,456,
>>> 

文件遍历循环
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第66张图片

  • fi是一个文件标识符,遍历其每行,产生循环
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第67张图片

4.3.2 无限循环

由条件控制的循环运行方式

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第68张图片

  • 反复执行语句块,直到条件不满足时结束

无限循环的条件

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第69张图片

4.3.3 循环控制保留字

break 和 continue

  • break跳出并结束当前整个循环,执行循环后的语句
  • continue结束当次循环,继续执行后续次数循环
  • break和continue可以与for和while循环搭配使用

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第70张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第71张图片

  • break仅跳出当前最内层循环

4.3.4 循环的高级用法

循环的扩展

循环与else

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第72张图片

  • 当循环没有被break语句退出时,执行else语句块
  • else语句块作为"正常"完成循环的奖励
  • 这里else的用法与异常处理中else用法相似

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第73张图片

单元小结

  • for…in 遍历循环: 计数、字符串、列表、文件…
  • while无限循环
  • continue和break保留字: 退出当前循环层次
  • 循环else的高级用法: 与break有关

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第74张图片

4.4 模块3: random库的使用

4.4.1 random库基本介绍

random库概述

random库是使用随机数的Python标准库

  • 伪随机数: 采用梅森旋转算法生成的(伪)随机序列中元素
  • random库主要用于生成随机数
  • 使用random库: import random

random库包括两类函数,常用共8个

  • 基本随机数函数: seed(), random()
  • 扩展随机数函数: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()

4.4.2 基本随机数函数

在这里插入图片描述

函数 描述
seed(a=None) 初始化给定的随机数种子,默认为当前系统时间
random() 生成一个[0.0, 1.0)之间的随机小数
#产生种子10对应的序列
>>>random.seed(10) 

#生成一个[0.0, 1.0)之间的随机小数
>>>random.random()
0.5714025946899135

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第75张图片

4.4.3 扩展随机数函数

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第76张图片

函数 描述
randint(a, b) 生成一个[a, b]之间的整数
randrange(m, n, k) 生成一个[m, n]之间以k为步长的随机整数
getrandbits(k) 生成一个k比特长的随机整数
uniform(a, b) 生成一个[a, b]之间的随机小数
choice(seq) 从序列seq中随机选择一个元素
shuffle(seq) 将序列seq中元素随机排列,返回打乱后的序列
>>> import random

#生成一个[10, 100]之间的整数
>>> random.randint(10, 100)
79

#生成一个[10, 100]之间以10为步长的随机整数
>>> random.randrange(10,100,10)
60

#生成一个16比特长的随机整数
>>> random.getrandbits(16)
33805

#生成一个[10, 100]之间的随机小数
>>> random.uniform(10, 100)
15.710497268060426

#从序列seq中随机选择一个元素
>>> random.choice([1,2,3,4,5,6,7,8,9])
1

#将序列seq中元素随机排列,返回打乱后的序列
>>> s=[1,2,3,4,5,6,7,8,9];random.shuffle(s);print(s)
[9, 5, 2, 7, 3, 1, 6, 8, 4]

随机数函数的使用

需要掌握的能力

  • 能够利用随机数种子产生"确定"伪随机数
  • 能够产生随机整数
  • 能够对序列类型进行随机操作

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第77张图片

4.5 实例6: 圆周率的计算

4.5.1"圆周率的计算"问题分析

圆周率的近似计算公式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第78张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第79张图片

4.5.2 "圆周率的计算"实例讲解

圆周率的近似计算公式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第80张图片

#CalPiV1.py
pi = 0
N = 100
for k in range(N) :
    pi += 1/pow(16,k)*( \
        4/(8*k+1) - 2/(8*k+4) - \
        1/(8*k+5) - 1/(8*k+6))
print("圆周率值是: {}".format(pi))

运行结果:

圆周率值是: 3.141592653589793

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第81张图片

#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
    x, y = random(), random()
    dist = pow(x ** 2 + y ** 2, 0.5)
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits/DARTS)
print("圆周率值是: {}".format(pi))
print("运行时间是: {:.5f}s".format(perf_counter()-start))

运行结果:

圆周率值是: 3.138692
运行时间是: 0.84175s

4.5.3"圆周率的计算"举一反三

理解方法思维

  • 数学思维:找到公式,利用公式求解
  • 计算思维:抽象一种过程,用计算机自动化求解
  • 谁更准确? (不好说…)

程序运行时间分析

  • 使用time库的计时方法获得程序运行时间
  • 改变撒点数量,理解程序运行时间的分布
  • 初步掌握简单的程序性能分析方法

计算问题的扩展

  • 不求解圆周率,而是某个特定图形的面积
  • 在工程计算中寻找蒙特卡罗方法的应用场景

第5章 函数和代码复用

  • 5.1 函数的定义与使用
  • 5.2 实例7: 七段数码管绘制
  • 5.3 代码复用与函数递归
  • 5.4 模块4: PyInstaller库的使用
  • 5.5 实例8: 科赫雪花小包裹

方法论

  • Python基本代码抽象即函数的使用方法

实践能力

  • 学会编写带有函数并复用代码的程序

5.1 函数的定义与使用

  • 5.1.1 函数的理解与定义
  • 5.1.2 函数的使用及调用过程
  • 5.1.3 函数的参数传递
  • 5.1.4 函数的返回值
  • 5.1.5 局部变量和全局变量
  • 5.1.6 lambda函数

5.1.1 函数的理解与定义

函数的定义

函数是一段代码的表示

  • 函数是一段具有特定功能的、可重用的语句组
  • 函数是一种功能的抽象,一般函数表达特定功能
  • 两个作用:降低编程难度 和 代码复用

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第82张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第83张图片
y = f(x)

  • 函数定义时,所指定的参数是一种占位符
  • 函数定义后,如果不经过调用,不会被执行
  • 函数定义时,参数是输入、函数体是处理、结果是输出 (IPO)

5.1.2 函数的使用及调用过程

函数的调用

调用是运行函数代码的方式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第84张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第85张图片

5.1.3 函数的参数传递

参数个数

函数可以有参数,也可以没有,但必须保留括号

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第86张图片

可选参数传递

函数定义时可以为某些参数指定默认值,构成可选参数

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第87张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第88张图片
函数定义时可以设计可变数量参数,既不确定参数总数量
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第89张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第90张图片

参数传递的两种方式

参数传递的两种方式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第91张图片

5.1.4 函数的返回值

函数可以返回0个或多个结果

  • return保留字用来传递返回值
  • 函数可以有返回值,也可以没有,可以有return,也可以没有
  • return可以传递0个返回值,也可以传递任意多个返回值

函数调用时,参数可以按照位置或名称方式传递

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第92张图片

5.1.5 局部变量和全局变量

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第93张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第94张图片

规则1: 局部变量和全局变量是不同变量

  • 局部变量是函数内部的占位符,与全局变量可能重名但不同
  • 函数运算结束后,局部变量被释放
  • 可以使用global保留字在函数内部使用全局变量

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第95张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第96张图片
规则2: 局部变量为组合数据类型且未创建,等同于全局变量

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第97张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第98张图片
使用规则

  • 基本数据类型,无论是否重名,局部变量与全局变量不同
  • 可以通过global保留字在函数内部声明全局变量
  • 组合数据类型,如果局部变量未真实创建,则是全局变量

5.1.6 lambda函数

lambda函数返回函数名作为结果

  • lambda函数是一种匿名函数,即没有名字的函数
  • 使用lambda保留字定义,函数名是返回结果
  • lambda函数用于定义简单的、能够在一行内表示的函数

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第99张图片

>>> f = lambda x,y:x+y
>>> f(10,15)
25
>>> f = lambda : "lambda函数"
>>> print(f())
lambda函数
>>> 

lambda函数的应用

谨慎使用lambda函数

  • lambda函数主要用作一些特定函数或方法的参数
  • lambda函数有一些固定使用方式,建议逐步掌握
  • 一般情况,建议使用def定义的普通函数

单元小结

  • 使用保留字def定义函数,lambda定义匿名函数
  • 可选参数(赋初值)、可变参数(*b)、名称传递
  • 保留字return可以返回任意多个结果
  • 保留字global声明使用全局变量,一些隐式规则

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第100张图片

5.2 实例7: 七段数码管绘制

5.2.1 "七段数码管绘制"问题分析

问题分析

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第101张图片

七段数码管绘制

  • 需求:用程序绘制七段数码管,似乎很有趣
  • 该怎么做呢?
    turtle绘图体系 -> 七段数码管绘制

七段数码管绘制时间

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第102张图片

5.2.2 "七段数码管绘制"实例讲解

七段数码管绘制

基本思路

  • 步骤1:绘制单个数字对应的数码管
  • 步骤2:获得一串数字,绘制对应的数码管
  • 步骤3:获得当前系统时间,绘制对应的数码管

步骤1: 绘制单个数码管
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第103张图片

import turtle
def drawLine(draw): #绘制单段数码管
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20) #为绘制后续数字确定位置

步骤2: 获取一段数字,绘制多个数码管

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第104张图片

import turtle
def drawLine(draw): #绘制单段数码管
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字
    for i in date:
        drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20181010')
    turtle.hideturtle()
    turtle.done()
main()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第105张图片
绘制漂亮的七段数码管
在这里插入图片描述
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第106张图片

步骤3: 获取系统时间,绘制七段数码管
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第107张图片

import turtle,time
def drawGap(): #绘制数码管间隔
    turtle.penup()
    turtle.fd(5)
def drawLine(draw): #绘制单段数码管
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup() #为绘制后续数字确定位置
    turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字,#data为日期,格式为 '%Y-%m=%d+'
    turtle.pencolor("red")
    for i in date:
        if i == '-':
            turtle.write('年', font=("Arial", 18, "normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == '=':
            turtle.write('月', font=("Arial", 18, "normal"))
            turtle.pencolor("blue")
            turtle.fd(40)
        elif i == '+':
            turtle.write('日', font=("Arial", 18, "normal"))
        else:
            drawDigit(eval(i))
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
    turtle.hideturtle()
    turtle.done()
main()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第108张图片

5.2.3 "七段数码管绘制"举一反三

理解方法思维

  • 模块化思维:确定模块接口,封装功能
  • 规则化思维:抽象过程为规则,计算机自动执行
  • 化繁为简:将大功能变为小功能组合,分而治之

应用问题的扩展

  • 绘制带小数点的七段数码管
  • 带刷新的时间倒计时效果
  • 绘制高级的数码管
  • MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第109张图片
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第110张图片
    更多作品请参考:https://python123.io/index/turtle_drawing

5.3 代码复用与函数递归

  • 5.3.1 代码复用与模块化设计
  • 5.3.2 函数递归的理解
  • 5.3.3 函数递归的调用过程
  • 5.3.4 函数递归实例解析

5.3.1 代码复用与模块化设计

代码复用

把代码当成资源进行抽象

  • 代码资源化:程序代码是一种用来表达计算的"资源"
  • 代码抽象化:使用函数等方法对代码赋予更高级别的定义
  • 代码复用:同一份代码在需要时可以被重复使用

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第111张图片

模块化设计

分而治之

  • 通过函数或对象封装将程序划分为模块及模块间的表达
  • 具体包括:主程序、子程序和子程序间关系
  • 分而治之:一种分而治之、分层抽象、体系化的设计思想

紧耦合 松耦合

  • 紧耦合:两个部分之间交流很多,无法独立存在
  • 松耦合:两个部分之间交流较少,可以独立存在
  • 模块内部紧耦合、模块之间松耦合

5.3.2 函数递归的理解

递归的定义

函数定义中调用函数自身的方式

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第112张图片
两个关键特征

  • 链条:计算过程存在递归链条
  • 基例:存在一个或多个不需要再次递归的基例

类似数学归纳法

  • 数学归纳法
    – 证明当n取第一个值n0时命题成立
    – 假设当nk时命题成立,证明当n=nk+1时命题也成立
  • 递归是数学归纳法思维的编程体现

5.3.3 函数递归的调用过程

递归的实现

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第113张图片
函数 + 分支语句

  • 递归本身是一个函数,需要函数定义方式描述
  • 函数内部,采用分支语句对输入参数进行判断
  • 基例和链条,分别编写对应代码

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第114张图片

5.3.4 函数递归实例解析

字符串反转

将字符串s反转后输出
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第115张图片

斐波那契数列

一个经典数列
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第116张图片
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第117张图片

汉诺塔

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第118张图片

  • 函数 + 分支结构
  • 递归链条
  • 递归基例
count = 0
def hanoi(n, src, dst, mid):
    global count
    if n == 1 :
        print("{}:{}->{}".format(1,src,dst))
        count += 1
    else :
        hanoi(n-1, src, mid, dst)
        print("{}:{}->{}".format(n,src,dst))
        count += 1
        hanoi(n-1, mid, dst, src)
hanoi(3, "A", "C", "B")
print(count)

运行结果:

1:A->C
2:A->B
1:C->B
3:A->C
1:B->A
2:B->C
1:A->C
7

单元小结

  • 模块化设计:松耦合、紧耦合
  • 函数递归的2个特征:基例和链条
  • 函数递归的实现:函数 + 分支结构

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第119张图片

5.4 模块4: PyInstaller库的使用

5.4.1 PyInstaller库基本介绍

将.py源代码转换成无需源代码的可执行文件,竟然忘记了这个,哈哈!
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第120张图片
PyInstaller库是第三方库

  • 官方网站:http://www.pyinstaller.org
  • 第三方库:使用前需要额外安装
  • 安装第三方库需要使用pip工具

PyInstaller库地安装

(cmd命令行) pip install pyinstaller

PyInstaller库使用说明

(cmd命令行) pyinstaller -F <文件名.py>
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第121张图片

PyInstaller库常用参数

参数 描述
-h 查看帮助
–clean 清理打包过程中的临时文件
-D, --onedir 默认值,生成dist文件夹
-F, --onefile 在dist文件夹中只生成独立的打包文件
-i <图标文件名.ico> 指定打包程序使用的图标(icon)文件

使用举例
pyinstaller –i curve.ico –F SevenDigitsDrawV2.py
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第122张图片

5.5 实例8: 科赫雪花小包裹

5.5.1 "科赫雪花小包裹"问题分析

科赫雪花

高大上的分形几何
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第123张图片

  • 分形几何是一种迭代的几何图形,广泛存在于自然界中

科赫曲线,也叫雪花曲线
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第124张图片

科赫雪花绘制

用Python绘制科赫曲线
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第125张图片

5.5.2 "科赫雪花小包裹"实例讲解

科赫雪花小包裹

科赫曲线的绘制
在这里插入图片描述

  • 递归思想:函数+分支
  • 递归链条:线段的组合
  • 递归基例:初始线段
#KochDrawV1.py 科赫曲线的绘制
import turtle
def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)
def main():
    turtle.setup(800,400)
    turtle.penup()
    turtle.goto(-300, -50)
    turtle.pendown()
    turtle.pensize(2)
    koch(600, 3) # 3阶科赫曲线,阶数
    turtle.hideturtle()
main()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第126张图片

#KochDrawV2.py 科赫雪花的绘制
import turtle
def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)
def main():
    turtle.setup(600, 600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    level = 3  # 3阶科赫雪花,阶数
    koch(400, level)
    turtle.right(120)
    koch(400, level)
    turtle.right(120)
    koch(400, level)
    turtle.hideturtle()
main()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第127张图片

打包才能上路…
pyinstaller –i curve.ico –F KochDrawV2.py
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第128张图片

  • 对编写后的科赫雪花代码进行打包处理

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第129张图片

5.5.3"科赫雪花小包裹"举一反三

绘制条件的扩展
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第130张图片

  • 修改分形几何绘制阶数
  • 修改科赫曲线的基本定义及旋转角度
  • 修改绘制科赫雪花的基础框架图形

分形几何千千万

  • 康托尔集、谢尔宾斯基三角形、门格海绵…
  • 龙形曲线、空间填充曲线、科赫曲线…
  • 函数递归的深入应用…

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第131张图片

第6章 组合数据类型

  • 6.1 集合类型及操作
  • 6.2 序列类型及操作
  • 6.3 实例9: 基本统计值计算
  • 6.4 字典类型及操作
  • 6.5 模块5: jieba库的使用
  • 6.6 实例10: 文本词频统计

方法论

  • Python三种主流组合数据类型的使用方法

实践能力

  • 学会编写处理一组数据的程序

6.1 集合类型及操作

  • 6.1.1 集合类型定义
  • 6.1.2 集合操作符
  • 6.1.3 集合处理方法
  • 6.1.4 集合类型应用场景

6.1.1 集合类型定义

集合是多个元素的无序组合

  • 集合类型与数学中的集合概念一致
  • 集合元素之间无序,每个元素唯一,不存在相同元素
  • 集合元素不可更改,不能是可变数据类型(为什么?)

集合是多个元素的无序组合

  • 集合用大括号 {} 表示,元素间用逗号分隔
  • 建立集合类型用 {} 或 set()
  • 建立空集合类型,必须使用set()
#使用{}建立集合
>>> A = {
     "python", 123, ("python",123)}
>>> print(A)
{
     ('python', 123), 123, 'python'}

#使用set()建立集合
>>> B=set("python")
>>> print(B)
{
     'n', 't', 'y', 'p', 'o', 'h'}
>>> c= {
     "python", 123, "python",123}
>>> print(c)
{
     123, 'python'}

6.1.2 集合操作符

集合间操作

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第132张图片

集合操作符

6个操作符

操作符及应用 描述
S | T 并,返回一个新集合,包括在集合S和T中的所有元素
S - T 差,返回一个新集合,包括在集合S但不在T中的元素
S & T 交,返回一个新集合,包括同时在集合S和T中的元素
S ^ T 补,返回一个新集合,包括集合S和T中的非相同元素
S <= T 或 S < T 返回True/False,判断S和T的子集关系
S >= T 或 S > T 返回True/False,判断S和T的包含关系

4个增强操作符

操作符及应用 描述
S|= T 并,更新集合S,包括在集合S和T中的所有元素
S -= T 差,更新集合S,包括在集合S但不在T中的元素
S &= T 交,更新集合S,包括同时在集合S和T中的元素
S ^= T 补,更新集合S,包括集合S和T中的非相同元素
>>> A = {
     "p","y",123}
>>> B = set("pypy123")

#差
>>> A-B
{
     123}
>>> B-A
{
     '3', '1', '2'}

#交
>>> A&B
{
     'y', 'p'}

#并
>>> A|B
{
     '3', '1', 'y', 123, 'p', '2'}

#补
>>> A^B
{
     '3', 123, '1', '2'}

6.1.3 集合处理方法

操作函数或方法 描述
S.add(x) 如果x不在集合S中,将x增加到S
S.discard(x) 移除S中元素x,如果x不在集合S中,不报错
S.remove(x) 移除S中元素x,如果x不在集合S中,产生KeyError异常
S.clear() 移除S中所有元素
S.pop() 随机返回S的一个元素,更新S,若S为空产生KeyError异常
S.copy() 返回集合S的一个副本
len(S) 返回集合S的元素个数
x in S 判断S中元素x,x在集合S中,返回True,否则返回False
x not in S 判断S中元素x,x不在集合S中,返回True,否则返回False
set(x) 将其他类型变量x转变为集合类型
>>> A = {
     "p","y",123}
>>> for item in A:
		print(item,end="")
	
y123p
>>> A
{
     'y', 123, 'p'}

>>> try:
	while True:
		print(A.pop(),end="")
except:
	pass

y123p
>>> A
set()

6.1.4 集合类型应用场景

包含关系比较

>>> "p" in {
     "p","y",123}
True
>>> {
     "p","y"} >= {
     "p","y",123}
False
>>> 

数据去重:集合类型所有元素无重复

>>> ls = ["p","p","y","y",123]

# 利用了集合无重复元素的特点
>>> s = set(ls)
>>> print(s)
{
     'y', 123, 'p'}

# 还可以将集合转换为列表
>>> lt = list(s)
>>> print(lt)
['y', 123, 'p']

单元小结

  • 集合使用{}和set()函数创建
  • 集合间操作:交(&)、并(|)、差(-)、补(^)、比较(>=<)
  • 集合类型方法:.add()、.discard()、.pop()等
  • 集合类型主要应用于:包含关系比较、数据去重

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第133张图片

6.2 序列类型及操作

  • 序列类型定义
  • 序列处理函数及方法
  • 元组类型及操作
  • 列表类型及操作
  • 序列类型应用场景

6.2.1 序列类型定义

序列是具有先后关系的一组元素

  • 序列是一维元素向量,元素类型可以不同
  • 类似数学元素序列: s0, s1, … , sn-1
  • 元素间由序号引导,通过下标访问序列的特定元素

序列是一个基类类型

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第134张图片
序号的定义

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第135张图片

6.2.2 序列处理函数及方法

序列类型通用操作符

6个操作符

操作符及应用 描述
x in s 如果x是序列s的元素,返回True,否则返回False
x not in s 如果x是序列s的元素,返回False,否则返回True
s + t 连接两个序列s和t
s*n 或 n*s 将序列s复制n次
s[i] 索引,返回s中的第i个元素,i是序列的序号
s[i: j] 或 s[i: j: k] 切片,返回序列s中第i到j以k为步长的元素子序列
>>> ls = ["python",123,".io"]
>>> ls[::-1]
['.io', 123, 'python']
>>> s = "python123.io"
>>> s[::-1]
'oi.321nohtyp'

序列类型通用函数和方法

绘制条件的扩展

函数和方法 描述
len(s) 返回序列s的长度,即元素个数
min(s) 返回序列s的最小元素,s中元素需要可比较
max(s) 返回序列s的最大元素,s中元素需要可比较
s.index(x) 或s.index(x, i, j) 返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x) 返回序列s中出现x的总次数
>>> ls = ["python",123,".io"]
>>> len(ls)
3
>>> s = "python123.io"
>>> max(s)
'y'

6.2.3 元组类型及操作

元组类型定义

元组是序列类型的一种扩展

  • 元组是一种序列类型,一旦创建就不能被修改
  • 使用小括号 () 或 tuple() 创建,元素间用逗号 , 分隔
  • 可以使用或不使用小括号
>>> creature = "cat","dog","tiger","human"
>>> creature
('cat', 'dog', 'tiger', 'human')
>>> color = (0x001100,"blue",creature)
>>> color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
>>> 

元组继承序列类型的全部通用操作

  • 元组继承了序列类型的全部通用操作
  • 元组因为创建后不能修改,因此没有特殊操作
  • 使用或不使用小括号
>>> creature = "cat","dog","tiger","human"
>>> creature
('cat', 'dog', 'tiger', 'human')
>>> color = (0x001100,"blue",creature)
>>> color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
>>> color[-1][-2]
'tiger'
>>> 

6.2.4 列表类型及操作

列表类型定义

列表是序列类型的一种扩展,十分常用

  • 列表是一种序列类型,创建后可以随意被修改
  • 使用方括号 [] 或list() 创建,元素间用逗号 , 分隔
  • 列表中各元素类型可以不同,无长度限制
>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls
['cat', 'dog', 'tiger', 1024]
>>> lt = ls
>>> lt
['cat', 'dog', 'tiger', 1024]
>>> 

方括号 [] 真正创建一个列表,赋值仅传递引用

列表类型操作函数和方法

函数或方法 描述
ls[i] = x 替换列表ls第i元素为x
ls[i: j: k] = lt 用列表lt替换ls切片后所对应元素子列表
del ls[i] 删除列表ls中第i元素
del ls[i: j: k] 删除列表ls中第i到第j以k为步长的元素
ls += lt 更新列表ls,将列表lt元素增加到列表ls中
ls *= n 更新列表ls,其元素重复n次
ls.append(x) 在列表ls最后增加一个元素x
ls.clear() 删除列表ls中所有元素
ls.copy() 生成一个新列表,赋值ls中所有元素
ls.insert(i,x) 在列表ls的第i位置增加元素x
ls.pop(i) 将列表ls中第i位置元素取出并删除该元素
ls.remove(x) 将列表ls中出现的第一个元素x删除
ls.reverse() 将列表ls中的元素反转
>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls[1:2]=[1,2,3,4]
>>> ls
['cat', 1, 2, 3, 4, 'tiger', 1024]
>>> del ls[::3]
>>> ls
[1, 2, 4, 'tiger']
>>> ls*2
[1, 2, 4, 'tiger', 1, 2, 4, 'tiger']


>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls.append(1234)
>>> ls
['cat', 'dog', 'tiger', 1024, 1234]
>>> ls.insert(3,"human")
>>> ls
['cat', 'dog', 'tiger', 'human', 1024, 1234]
>>> ls.reverse()
>>> ls
[1234, 1024, 'human', 'tiger', 'dog', 'cat']
>>> 

列表功能默认

 定义空列表lt
 向lt新增5个元素
 修改lt中第2个元素
 向lt中第2个位置增加一个元素
 从lt中第1个位置删除一个元素
 删除lt中第1-3位置元素
 判断lt中是否包含数字0
 向lt新增数字0
 返回数字0所在lt中的索引
 lt的长度
 lt中最大元素
 清空lt

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第136张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第137张图片

6.2.5 序列类型应用场景

数据表示:元组 和 列表

  • 元组用于元素不改变的应用场景,更多用于固定搭配场景
  • 列表更加灵活,它是最常用的序列类型
  • 最主要作用:表示一组有序数据,进而操作它们

元素遍历

for item in ls : <语句块>
for item in tp : <语句块>

数据保护

  • 如果不希望数据被程序所改变,转换成元组类型
>>> ls = ["cat", "dog", "tiger", 1024]
>>> lt = tuple(ls)
>>> lt
('cat', 'dog', 'tiger', 1024)

单元小结

序列类型及操作

  • 序列是基类类型,扩展类型包括:字符串、元组和列表
  • 元组用()和tuple()创建,列表用[]和set()创建
  • 元组操作与序列操作基本相同
  • 列表操作在序列操作基础上,增加了更多的灵活性

6.3 实例9: 基本统计值计算

6.3.1"基本统计值计算"问题分析

问题分析

基本统计值

  • 需求:给出一组数,对它们有个概要理解
  • 该怎么做呢?
    总个数、求和、平均值、方差、中位数…
    • 总个数:len()
    • 求和:for … in
    • 平均值:求和/总个数
    • 方差:
      各数据与平均数差的平方和的平均数
    • 中位数:排序,然后…
      奇数找中间1个,偶数找中间2个取平均

6.3.2 "基本统计值计算"实例讲解

基本统计值计算

  • 获取多数据输入
  • 通过函数分隔功能
#CalStatisticsV1.py 基本统计值计算

 #获取用户不定长度的输入
def getNum():
    nums = []
    iNumStr = input("请输入数字(回车退出): ")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(回车退出): ")
    return nums

#计算平均值
def mean(numbers): 
    s = 0.0
    for num in numbers:
        s = s + num
    return s / len(numbers)

#计算方差
def dev(numbers, mean): 
    sdev = 0.0
    for num in numbers:
        sdev = sdev + (num - mean)**2
    return pow(sdev / (len(numbers)-1), 0.5)

#计算中位数
def median(numbers): 
    sorted(numbers)
    size = len(numbers)
    if size % 2 == 0:
        med = (numbers[size//2-1] + numbers[size//2])/2
    else:
     med = numbers[size//2]
    return med
n = getNum()
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))

6.3.3 "基本统计值计算"举一反三

技术能力扩展

  • 获取多个数据:从控制台获取多个不确定数据的方法
  • 分隔多个函数:模块化设计方法
  • 充分利用函数:充分利用Python提供的内置函数

6.4 字典类型及操作

  • 6.4.1字典类型定义
  • 6.4.2字典处理函数及方法
  • 6.4.3字典类型应用场景

6.4.1字典类型定义

理解“映射”

  • 映射是一种键(索引)和值(数据)的对应

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第138张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第139张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第140张图片
字典类型是“映射”的体现

  • 键值对:键是数据索引的扩展
  • 字典是键值对的集合,键值对之间无序
  • 采用大括号{}和dict()创建,键值对用冒号: 表示
    {<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>}

在字典变量中,通过键获得值

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第141张图片
[ ] 用来向字典变量中索引或增加元素

>>> d = {
     "中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
>>> d
{
     '中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
>>> d["中国"]
'北京'
>>> de={
     };type(de)
<class 'dict'>
>>> 

6.4.2字典处理函数及方法

字典类型操作函数和方法

函数或方法 描述
del d[k] 删除字典d中键k对应的数据值
k in d 判断键k是否在字典d中,如果在返回True,否则False
d.keys() 返回字典d中所有的键信息
d.values() 返回字典d中所有的值信息
d.items() 返回字典d中所有的键值对信息
d.get(k, ) 键k存在,则返回相应值,不在则返回值
d.pop(k, ) 键k存在,则取出相应值,不在则返回值
d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
d.clear() 删除所有的键值对
len(d) 返回字典d中元素的个数
>>> d = {
     "中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
>>> "中国" in d
True
>>> d.keys()
dict_keys(['中国', '美国', '法国'])
>>> d.values()
dict_values(['北京', '华盛顿', '巴黎'])
>>> 

字典功能默写

 定义空字典d
 向d新增2个键值对元素
 修改第2个元素
 判断字符"c"是否是d的键
 计算d的长度
 清空d
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第142张图片

6.4.3字典类型应用场景

映射的表达

  • 映射无处不在,键值对无处不在
  • 例如:统计数据出现的次数,数据是键,次数是值
  • 最主要作用:表达键值对数据,进而操作它们

元素遍历
for k in d : <语句块>

单元小结

字典类型及操作

  • 映射关系采用键值对表达
  • 字典类型使用{}和dict()创建,键值对之间用:分隔
  • d[key] 方式既可以索引,也可以赋值
  • 字典类型有一批操作方法和函数,最重要的是.get()

6.5 模块5: jieba库的使用

6.5.1 jieba库基本介绍

jieba库概述

jieba是优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需掌握一个函数

jieba库的安装

(cmd命令行) pip install jieba

jieba分词的原理

jieba分词依靠中文词库

  • 利用一个中文词库,确定中文字符之间的关联概率
  • 中文字符间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

6.5.2 jieba库使用说明

jieba分词的三种模式

精确模式、全模式、搜索引擎模式

  • 精确模式:把文本精确的切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • 搜索引擎模式:在精确模式基础上,对长词再次切分

jieba库常用函数

函数 描述
jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
jieba.add_word(w) 向分词词典增加新词w
>>> import jieba

#精确模式,返回一个列表类型的分词结果
>>> jieba.lcut("中国是一个伟大的国家")
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\···\Temp\jieba.cache
Loading model cost 0.787 seconds.
Prefix dict has been built successfully.
['中国', '是', '一个', '伟大', '的', '国家']

#全模式,返回一个列表类型的分词结果,存在冗余
>>> jieba.lcut("中国是一个伟大的国家",cut_all=True)
['中国', '国是', '一个', '伟大', '的', '国家']

#搜索引擎模式,返回一个列表类型的分词结果,存在冗余
>>> jieba.lcut_for_search("中华人民共和国是伟大的")
['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']

#向分词词典增加新词w
>>>jieba.add_word("蟒蛇语言")

jieba分词要点

jieba.lcut(s)

6.6 实例10: 文本词频统计

6.6.1 "文本词频统计"问题分析

问题分析

文本词频统计

  • 需求:一篇文章,出现了哪些词?哪些词出现得最多?

  • 该怎么做呢?
    英文文本 -> 中文文本

  • 英文文本:Hamet 分析词频
    https://python123.io/resources/pye/hamlet.txt

  • 中文文本:《三国演义》 分析人物
    https://python123.io/resources/pye/threekingdoms.txt

6.6.2 "Hamlet英文词频统计"实例讲解

  • 文本去噪及归一化
  • 使用字典表达词频
#CalHamletV1.py
def getText():
    txt = open("hamlet.txt", "r").read()
    txt = txt.lower()
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch, " ")
    return txt

hamletTxt = getText()
words = hamletTxt.split()
counts = {
     }
for word in words:
    counts[word] = counts.get(word,0) + 1
    items = list(counts.items())
    items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

运行结果:

  • 运行结果由大到小排序
  • 观察单词出现次数
the        1138
and         965
to          754
of          669
you         550
i           542
a           542
my          514
hamlet      462
in          436

6.6.3 "《三国演义》人物出场统计"实例讲解

  • 中文文本分词
  • 使用字典表达词频
#CalThreeKingdomsV1.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {
     }
for word in words:
    if len(word) == 1:
        continue
    else:
        counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

运行结果:

曹操          953
孔明          836
将军          772
却说          656
玄德          585
关公          510
丞相          491
二人          469
不可          440
荆州          425
玄德曰         390
孔明曰         390
不能          384
如此          378
张飞          358

《三国演义》人物出场统计

将词频与人物相关联,面向问题
词频统计 ->人物统计

  • 中文文本分词
  • 使用字典表达词频
  • 扩展程序解决问题
#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {
     "将军","却说","荆州","二人","不可","不能","如此"}
words = jieba.lcut(txt)
counts = {
     }
for word in words:
    if len(word) == 1:
        continue
    elif word == "诸葛亮" or word == "孔明曰":
        rword = "孔明"
    elif word == "关公" or word == "云长":
        rword = "关羽"
    elif word == "玄德" or word == "玄德曰":
        rword = "刘备"
    elif word == "孟德" or word == "丞相":
        rword = "曹操"
    else:
        rword = word
    counts[rword] = counts.get(rword,0) + 1
for word in excludes:
    del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

运行结果:

#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {
     "将军","却说","荆州","二人","不可","不能","如此"}
words = jieba.lcut(txt)
counts = {
     }
for word in words:
    if len(word) == 1:
        continue
    elif word == "诸葛亮" or word == "孔明曰":
        rword = "孔明"
    elif word == "关公" or word == "云长":
        rword = "关羽"
    elif word == "玄德" or word == "玄德曰":
        rword = "刘备"
    elif word == "孟德" or word == "丞相":
        rword = "曹操"
    else:
        rword = word
    counts[rword] = counts.get(rword,0) + 1
for word in excludes:
    del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))
  • 根据结果进一步优化
    隆重发布《三国演义》人物出场顺序前20:
    曹操、孔明、刘备、关羽、张飞、吕布、赵云、孙权、司马懿、周瑜、袁绍、马超、魏延、黄忠、姜维、马岱、庞德、孟获、刘表、夏侯惇

6.6.4 "文本词频统计"举一反三

应用问题的扩展

  • 《红楼梦》、《西游记》、《水浒传》…
  • 政府工作报告、科研论文、新闻报道 …
  • 进一步呢? 未来还有词云…

第7章 文件和数据格式化

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第143张图片

  • 7.1 文件的使用
  • 7.2 实例11: 自动轨迹绘制
  • 7.3 一维数据的格式化和处理
  • 7.4 二维数据的格式化和处理
  • 7.5 模块6: wordcloud库的使用
  • 7.6 实例12: 政府工作报告词云

方法论

  • 从Python角度理解的文件和数据表示

实践能力

  • 学会编写带有文件输入输出的程序

7.1 文件的使用

  • 7.1.1文件的类型
  • 7.1.2文件的打开和关闭
  • 7.1.3文件内容的读取
  • 7.1.4数据的文件写入

7.1.1文件的类型

文件的理解

文件是数据的抽象和集合

  • 文件是存储在辅助存储器上的数据序列
  • 文件是数据存储的一种形式
  • 文件展现形态:文本文件和二进制文件

文本文件 vs. 二进制文件

  • 文件文件和二进制文件只是文件的展示方式
  • 本质上,所有文件都是二进制形式存储
  • 形式上,所有文件采用两种方式展示

文件是数据的抽象和集合

  • 由单一特定编码组成的文件,如UTF-8编码
  • 由于存在编码,也被看成是存储着的长字符串
  • 适用于例如:.txt文件、.py文件等
  • 直接由比特0和1组成,没有统一字符编码
  • 一般存在二进制0和1的组织结构,即文件格式
  • 适用于例如:.png文件、.avi文件等

文本文件 vs. 二进制文件

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第144张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第145张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第146张图片

7.1.2文件的打开和关闭

文件处理的步骤: 打开-操作-关闭

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第147张图片

文件的打开

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第148张图片
文件路径
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第149张图片
打开模式

文件的打开模式 描述
‘r’ 只读模式,默认值,如果文件不存在,返回FileNotFoundError
‘w’ 覆盖写模式,文件不存在则创建,存在则完全覆盖
‘x’ 创建写模式,文件不存在则创建,存在则返回FileExistsError
‘a’ 追加写模式,文件不存在则创建,存在则在文件最后追加内容
‘b’ 二进制文件模式
‘t’ 文本文件模式,默认值
‘+’ 与r/w/x/a一同使用,在原功能基础上增加同时读写功能
  • 文本形式、只读模式、默认值
    f = open(“f.txt”)
  • 文本形式、只读模式、同默认值
    f = open(“f.txt”, “rt”)
  • 文本形式、覆盖写模式
    f = open(“f.txt”, “w”)
  • 文本形式、追加写模式+ 读文件
    f = open(“f.txt”, “a+”)
  • 文本形式、创建写模式
    f = open(“f.txt”, “x”)
  • 二进制形式、只读模式
    f = open(“f.txt”, “b”)
  • 二进制形式、覆盖写模式
    f = open(“f.txt”, “wb”)

文件的关闭

<变量名>.close()

文件的使用
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第150张图片

7.1.3文件内容的读取

操作方法 描述
.read(size=-1) 读入全部内容,如果给出参数,读入前size长度
.readline(size=-1) 读入一行内容,如果给出参数,读入该行前size长度
.readlines(hint=-1) 读入文件所有行,以每行为元素形成列表
如果给出参数,读入前hint行
#这段代码没有运行
>>>s = f.read(2)
中国

>>>s = f.readline()
中国是一个伟大的国家!

>>>s = f.readlines()
['中国是一个伟大的国家!']

文件的全文本操作

遍历全文本:方法一

  • 一次读入,统一处理
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
txt = fo.read()
#对全文txt进行处理
fo.close()

运行报错(?):

  txt = fo.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

遍历全文本:方法二

  • 按数量读入,逐步处理
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
txt = fo.read(2)
while txt != "": 
	#对txt进行处理
	txt = fo.read(2)
fo.close()

文件的逐行操作

逐行遍历文件:方法一

  • 一次读入,分行处理
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
for line in fo.readlines():
	print(line)
fo.close()

逐行遍历文件:方法二

  • 分行读入,逐行处理
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
for line in fo:
	print(line)
fo.close()

7.1.4数据的文件写入

操作方法 描述
.write(s) 向文件写入一个字符串或字节流
.writelines(lines) 将一个元素全为字符串的列表写入文件
.seek(offset) 改变当前文件操作指针的位置,offset含义如下:
0 – 文件开头; 1 – 当前位置; 2 – 文件结尾
>>>f.write("中国是一个伟大的国家!")

>>>ls = ["中国", "法国", "美国"]
>>>f.writelines(ls)
中国法国美国

>>>f.seek(0) #回到文件开头

文件的写入

  • 写入一个字符串列表
fo = open("output.txt","w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
for line in fo: 
	print(line)
fo.close()
 
 >>> (没有任何输出)
fo = open("output.txt","w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
    print(line)
fo.close()


>>>
中国法国美国

单元小结

文件的使用

  • 文件的使用方式:打开-操作-关闭
  • 文本文件&二进制文件,open( , )和.close()
  • 文件内容的读取:.read() .readline() .readlines()
  • 数据的文件写入:.write() .writelines() .seek()

7.2 实例11: 自动轨迹绘制

7.2.1 "自动轨迹绘制"问题分析

问题分析

自动轨迹绘制

  • 需求:根据脚本来绘制图形?
  • 不通过写代码而通过写数据绘制轨迹
  • 数据脚本是自动化最重要的第一步

自动轨迹绘制
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第151张图片

7.2.2 "自动轨迹绘制"实例讲解

自动轨迹绘制

基本思路

  • 步骤1:定义数据文件格式(接口)
  • 步骤2:编写程序,根据文件接口解析参数绘制图形
  • 步骤3:编制数据文件

数据接口定义

非常具有个性色彩
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第152张图片

#AutoTraceDraw.py
import turtle as t
t.title('自动轨迹绘制')
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
#数据读取
datals = []
f = open("data.txt")
for line in f:
    line = line.replace("\n","")
    datals.append(list(map(eval, line.split(","))))
f.close()
#自动绘制
for i in range(len(datals)):
    t.pencolor(datals[i][3],datals[i][4],datals[i][5])
    t.fd(datals[i][0])
    if datals[i][1]:
        t.right(datals[i][2])
    else:
        t.left(datals[i][2])
#data.txt
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,720,0,0,0

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第153张图片

7.2.3 "自动轨迹绘制"举一反三

理解方法思维

  • 自动化思维:数据和功能分离,数据驱动的自动运行
  • 接口化设计:格式化设计接口,清晰明了
  • 二维数据应用:应用维度组织数据,二维数据最常用

应用问题的扩展

  • 扩展接口设计,增加更多控制接口
  • 扩展功能设计,增加弧形等更多功能
  • 扩展应用需求,发展自动轨迹绘制到动画绘制

小花絮

如何进一步提高Python编程能力?
三个步骤,请参考:https://python123.io/python

  • 第一步:学好Python语法,即掌握非库功能,练好内功
  • 第二步:学好Python领域,数据分析、Web开发、人工智能,找准了深入学
  • 第三步:学好计算机专业知识,构建“系统”是本领,需要专业计算机知识
    数据结构、算法、计算机网络、组成原理、操作系统、网络安全、体系结构、软件工程…

7.3 一维数据的格式化和处理

  • 7.3.1 数据组织的维度
  • 7.3.2 一维数据的表示
  • 7.3.3 一维数据的存储
  • 7.3.4 一维数据的处理

7.3.1 数据组织的维度

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第154张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第155张图片

一维数据

由对等关系的有序或无序数据构成,采用线性方式组织

3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376

  • 对应列表、数组和集合等概念

二维数据

由多个一维数据构成,是一维数据的组合形式
表格是典型的二维数据
其中,表头是二维数据的一部分

多维数据

由一维或二维数据在新维度上扩展形成
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第156张图片

高维数据

仅利用最基本的二元关系展示数据间的复杂结构

{
      
"firstName" : "Tian" , 
"lastName" : "Song" ,
 "address" : {
     
				 "streetAddr" : "中关村南大街5号" ,
				 "city" : "北京市" , 
				 "zipcode" : "100081"
			} ,
"professional" : ["Computer Networking" , "Security"]
 }

数据的操作周期

存储 <-> 表示 <-> 操作
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第157张图片

7.3.2 一维数据的表示

如果数据间有序:使用列表类型

ls = [3.1398, 3.1349, 3.1376]

  • 列表类型可以表达一维有序数据
  • for循环可以遍历数据,进而对每个数据进行处理

如果数据间无序:使用集合类型

st = {3.1398, 3.1349, 3.1376}

  • 集合类型可以表达一维无序数据
  • for循环可以遍历数据,进而对每个数据进行处理

7.3.3 一维数据的存储

存储方式一:空格分隔

中国 美国 日本 德国 法国 英国 意大利

  • 使用一个或多个空格分隔进行存储,不换行
  • 缺点:数据中不能存在空格

存储方式二:逗号分隔

中国,美国,日本,德国,法国,英国,意大利

  • 使用英文半角逗号分隔数据进行存储,不换行
  • 缺点:数据中不能有英文逗号

存储方式三:其他方式

中国$美国$日本$德国$法国$英国$意大利

  • 使用其他符号或符号组合分隔,建议采用特殊符号
  • 缺点:需要根据数据特点定义,通用性较差

7.3.4 一维数据的处理

数据的处理

存储 <-> 表示

  • 将存储的数据读入程序
  • 将程序表示的数据写入文件
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第158张图片

一维数据的读入处理

从空格分隔的文件中读入数据

中国 美国 日本 德国 法国 英国 意大利
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第159张图片
从特殊符号分隔的文件中读入数据

中国$美国$日本$德国$法国$英国$意大利
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第160张图片

一位数据的写入处理

采用空格分隔方式将数据写入文件

ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write(' '.join(ls))
f.close()

采用特殊分隔方式将数据写入文件

ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write('$'.join(ls)) 
f.close()

单元小结

一维数据的格式化和处理

  • 数据的维度:一维、二维、多维、高维
  • 一维数据的表示:列表类型(有序)和集合类型(无序)
  • 一维数据的存储:空格分隔、逗号分隔、特殊符号分隔
  • 一维数据的处理:字符串方法 .split() 和 .join()

7.4 二维数据的格式化和处理

  • 7.4.1 二维数据的表示
  • 7.4.2 CSV数据存储格式
  • 7.4.3 二维数据的存储
  • 7.4.4 二维数据的处理

7.4.1 二维数据的表示

使用列表类型

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第161张图片

  • 使用两层for循环遍历每个元素
  • 外层列表中每个元素可以对应一行,也可以对应一列

一二维数据的Python表示

数据维度是数据的组织形式
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第162张图片

7.4.2 CSV数据存储格式

CSV: Comma-Separated Values

  • 国际通用的一二维数据存储格式,一般.csv扩展名
  • 每行一个一维数据,采用逗号分隔,无空行
  • Excel和一般编辑软件都可以读入或另存为csv文件
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第163张图片
  • 如果某个元素缺失,逗号仍要保留
  • 二维数据的表头可以作为数据存储,也可以另行存储
  • 逗号为英文半角逗号,逗号与数据之间无额外空格

7.4.3 二维数据的存储

按行存?按列存?

  • 按行存或者按列存都可以,具体由程序决定
  • 一般索引习惯:ls[row][column],先行后列
  • 根据一般习惯,外层列表每个元素是一行,按行存

7.4.4 二维数据的处理

二维数据的读入处理

从CSV格式的文件中读入数据

fo = open(fname)
ls = []
for line in fo:
	line = line.replace("\n","")
	ls.append(line.split(",")) 
fo.close()

二维数据的写入处理

将数据写入CSV格式的文件

ls = [[], [], []] #二维列表
f = open(fname, 'w')
for item in ls:
	f.write(','.join(item) + '\n') 
f.close()

二维数据的逐一处理

采用二层循环

ls = [[1,2], [3,4], [5,6]] #二维列表
for row in ls:
	for column in row:
		print(column)

单元小结

二维数据的格式化和处理

  • 二维数据的表示:列表类型,其中每个元素也是一个列表
  • CSV格式:逗号分隔表示一维,按行分隔表示二维
  • 二维数据的处理:for循环+.split()和.join()

7.5 模块6: wordcloud库的使用

7.5.1 wordcloud库基本介绍

wordcloud库概述

wordcloud是优秀的词云展示第三方库
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第164张图片

  • 词云以词语为基本单位,更加直观和艺术地展示文本

wordcloud库的安装

(cmd命令行) pip install wordcloud

7.5.2 wordcloud库使用说明

wordcloud库基本使用

wordcloud库把词云当作一个WordCloud对象

  • wordcloud.WordCloud()代表一个文本对应的词云
  • 可以根据文本中词语出现的频率等参数绘制词云
  • 词云的绘制形状、尺寸和颜色都可以设定

wordcloud库常规方法

w = wordcloud.WordCloud()

  • 以WordCloud对象为基础
  • 配置参数、加载文本、输出文件
方法 描述
w.generate(txt) 向WordCloud对象w中加载文本txt
>>>w.generate(“Python and WordCloud”)
w.to_file(filename) 将词云输出为图像文件,.png或.jpg格式
>>>w.to_file(“outfile.png”)
  • 步骤1:配置对象参数
  • 步骤2:加载词云文本
  • 步骤3:输出词云文件
import wordcloud
c = wordcloud.WordCloud()
c.generate("wordcloud by Python")
c.to_file("pywordcloud.png")

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第165张图片

配置对象参数

w = wordcloud.WordCloud(<参数>)

参数 描述
width 指定词云对象生成图片的宽度,默认400像素
height 指定词云对象生成图片的高度,默认200像素
min_font_size 指定词云中字体的最小字号,默认4号
max_font_size 指定词云中字体的最大字号,根据高度自动调节
font_step 指定词云中字体字号的步进间隔,默认为1
font_path 指定字体文件的路径,默认None
max_words 指定词云显示的最大单词数量,默认200
stop_words 指定词云的排除词列表,即不显示的单词列表
mask 指定词云形状,默认为长方形,需要引用imread()函数
background_color 指定词云图片的背景颜色,默认为黑色
#指定词云对象生成图片的宽度,默认400像素
>>>w=wordcloud.WordCloud(width=600)

#指定词云对象生成图片的高度,默认200像素
>>>w=wordcloud.WordCloud(height=400)

#指定词云中字体的最小字号,默认4号
>>>w=wordcloud.WordCloud(min_font_size=10)

#指定词云中字体的最大字号,根据高度自动调节
>>>w=wordcloud.WordCloud(max_font_size=20)

#指定词云中字体字号的步进间隔,默认为1
>>>w=wordcloud.WordCloud(font_step=2)

#指定字体文件的路径,默认None
>>>w=wordcloud.WordCloud(font_path="msyh.ttc")

#指定词云显示的最大单词数量,默认200
>>>w=wordcloud.WordCloud(max_words=20)

#指定词云的排除词列表,即不显示的单词列表
>>>w=wordcloud.WordCloud(stop_words={
     "Python"})

# 指定词云形状,默认为长方形,需要引用imread()函数
>>>from scipy.misc import imread
>>>mk=imread("pic.png")
>>>w=wordcloud.WordCloud(mask=mk)

#指定词云图片的背景颜色,默认为黑色
>>>w=wordcloud.WordCloud(background_color="white")

wordcloud应用实例

以空格分隔单词

import wordcloud
txt = "life is short, you need python"
w = wordcloud.WordCloud( \
    background_color = "white")
w.generate(txt)
w.to_file("pywcloud.png")

运行结果:

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第166张图片

#中文需要先分词并组成空格分隔字符串
import jieba
import wordcloud
txt = "程序设计语言是计算机能够理解和\
识别用户操作意图的一种交互体系,它按照\
特定规则组织计算机指令,使计算机能够自\
动进行各种运算处理。"
w = wordcloud.WordCloud( width=1000,\
    font_path="msyh.ttc",height=700)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("pywcloud.png") 

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第167张图片

7.6 实例12: 政府工作报告词云

7.6.1 "政府工作报告词云"问题分析

问题分析

直观理解政策文件

  • 需求:对于政府工作报告等政策文件,如何直观理解?
  • 体会直观的价值:生成词云 & 优化词云
    政府工作报告等文件 ->  有效展示的词云

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第168张图片
https://python123.io/resources/pye/新时代中国特色社会主义.txt
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第169张图片
https://python123.io/resources/pye/关于实施乡村振兴战略的意见.txt

7.6.2 "政府工作报告词云"实例讲解

政府工作报告词云

基本思路

  • 步骤1:读取文件、分词整理
  • 步骤2:设置并输出词云
  • 步骤3:观察结果,优化迭代
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
                         width = 1000, height = 700, background_color = "white", \
                         )
w.generate(txt)
w.to_file("grwordcloud.png")

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第170张图片

#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
                         width = 1000, height = 700, background_color = "white", \
                         )
w.generate(txt)
w.to_file("grwordcloud.png")

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第171张图片

#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
                         width = 1000, height = 700, background_color = "white", \
                         max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第172张图片

#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
                         width = 1000, height = 700, background_color = "white", \
                         max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第173张图片

政府工作报告词云

更有形的词云
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第174张图片

#GovRptWordCloudv2.py
import jieba
import wordcloud
from imageio import imread
mask = imread("fivestar.png")
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc", mask = mask\
    width = 1000, height = 700, background_color = "white", \
    )
w.generate(txt)
w.to_file("grwordcloud.png")

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第175张图片

#GovRptWordCloudv2.py
import jieba
import wordcloud
from imageio import imread
mask = imread("bitlogo.png")
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc", mask = mask\
    width = 1000, height = 700, background_color = "white", \ 
    )
w.generate(txt)
w.to_file("grwordcloud.png")

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第176张图片

7.6.3 "政府工作报告词云"举一反三

扩展能力

  • 了解wordcloud更多参数,扩展词云能力
  • 特色词云:设计一款属于自己的特色词云风格
  • 更多文件:用更多文件练习词云生成

第8章 程序设计方法学

  • 8.1 实例13: 体育竞技分析
  • 8.2 Python程序设计思维
  • 8.3 Python第三方库安装
  • 8.4 模块7: os库的基本使用
  • 8.5 实例14: 第三方库自动安装脚本

方法论

  • 理解并掌握Python程序设计思维

实践能力

  • 学会编写更有设计感的程序

8.1 实例13: 体育竞技分析

8.1.1 "体育竞技分析"问题分析

问题分析

体育竞技分析

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第177张图片

  • 需求:毫厘是多少?如何科学分析体育竞技比赛?
  • 输入:球员的水平
  • 输出:可预测的比赛成绩

体育竞技分析:模拟N场比赛

  • 计算思维:抽象 + 自动化
  • 模拟:抽象比赛过程 + 自动化执行N场比赛
  • 当N越大时,比赛结果分析会越科学

比赛规则

  • 双人击球比赛:A & B,回合制,5局3胜 - 开始时一方先发球,直至判分,接下来胜者发球
  • 球员只能在发球局得分,15分胜一局

8.1.2 自顶向下和自底向上

自顶向下(设计)

解决复杂问题的有效方法

  • 将一个总问题表达为若干个小问题组成的形式
  • 使用同样方法进一步分解小问题
  • 直至,小问题可以用计算机简单明了的解决

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第178张图片
(看到这里,突然明白IC验证时,为什么会有自顶向下和自底向上)

自底向上(执行)

逐步组建复杂系统的有效测试方法

  • 分单元测试,逐步组装
  • 按照自顶向下相反的路径操作
  • 直至,系统各部分以组装的思路都经过测试和验证

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第179张图片

8.1.3 "体育竞技分析"实例讲解

体育竞技分析

程序总体框架及步骤

  • 步骤1:打印程序的介绍性信息
    -printInfo()
  • 步骤2:获得程序运行参数:proA, proB, n
    -getInputs()
  • 步骤3:利用球员A和B的能力值,模拟n局比赛
    -simNGames()
  • 步骤4:输出球员A和B获胜比赛的场次及概率
    -printSummary()

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第180张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第181张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第182张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第183张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第184张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第185张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第186张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第187张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第188张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第189张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第190张图片

#第一阶段
def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))

#第二阶段
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB

#第三阶段
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
             scoreB += 1
            else:
             serving="A"
    return scoreA, scoreB

def gameOver(a,b):
    return a==15 or b==15

8.1.4 "体育竞技分析"举一反三

理解自顶向下和自底向上

  • 理解自顶向下的设计思维:分而治之
  • 理解自底向上的执行思维:模块化集成
  • 自顶向下是“系统”思维的简化

应用问题的扩展

  • 扩展比赛参数,增加对更多能力对比情况的判断
  • 扩展比赛设计,增加对真实比赛结果的预测
  • 扩展分析逻辑,反向推理,用胜率推算能力?

8.2 Python程序设计思维

  • 8.2.1 计算思维与程序设计
  • 8.2.2 计算生态与Python语言
  • 8.2.3 用户体验与软件产品
  • 8.2.4 基本的程序设计模式

推荐听课
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第191张图片

单元小结

Python程序设计思维

  • 计算思维:抽象计算过程和自动化执行
  • 计算生态:竞争发展、相互依存、快速更迭
  • 用户体验:进度展示、异常处理等
  • IPO、自顶向下、模块化、配置化、应用开发的四个步骤

8.3 Python第三方库安装

  • 8.3.1 看见更大的Python世界
  • 8.3.2 第三方库的pip安装方法
  • 8.3.3 第三方库的集成安装方法
  • 8.3.4 第三方库的文件安装方法

8.3.1 看见更大的Python世界

Python社区

>13万个第三方库
https://pypi.org/
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第192张图片

PyPI

  • PyPI: Python Package Index
  • PSF维护的展示全球Python计算生态的主站
  • 学会检索并利用PyPI,找到合适的第三方库开发程序

实例:开发与区块链相关的程序

  • 第1步:在pypi.org搜索 blockchain
  • 第2步:挑选适合开发目标的第三方库作为基础
  • 第3步:完成自己需要的功能

实例:开发与区块链相关的程序
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第193张图片

安装Python第三方库

三种方法

  • 方法1(主要方法): 使用pip命令
  • 方法2: 集成安装方法
  • 方法3: 文件安装方法

受教了,之前是先学的网络爬虫,安装第三方库碰了不少灰,看来基础知识真的很重要。人们往往知道一些东西,但就是自己做不到

8.3.2 第三方库的pip安装方法

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第194张图片
常用的pip命令

强调一点:将下载源切换到本国,否则经常报错

  • 安装指定的第三方库
    D:\>pip install <第三方库名>
  • 使用-U标签更新已安装的指定第三方库
    D:\>pip install -U <第三方库名>
  • 卸载指定的第三方库
    D:\>pip uninstall <第三方库名>
  • 下载但不安装指定的第三方库
    D:\>pip download <第三方库名>
  • 列出某个指定第三方库的详细信息
    D:\>pip show <第三方库名>
  • 根据关键词在名称和介绍中搜索第三方库
    D:\>pip search <关键词>
  • 列出当前系统已经安装的第三方库
    D:\>pip list

主要方法,适合99%以上情况

  • 适合Windows、Mac和Linux等操作系统
  • 未来获取第三方库的方式,目前的主要方式
  • 适合99%以上情况,需要联网安装

8.3.3 第三方库的集成安装方法

集成安装:结合特定Python开发工具的批量安装
Anaconda
https://www.continuum.io

  • 支持近800个第三方库
  • 包含多个主流工具
  • 适合数据计算领域开发

8.3.4 第三方库的文件安装方法

为什么有些第三方库用pip可以下载,但无法安装?

  • 某些第三方库pip下载后,需要编译再安装
  • 如果操作系统没有编译环境,则能下载但不能安装
  • 可以直接下载编译后的版本用于安装吗?

http://www.lfd.uci.edu/~gohlke/pythonlibs/

实例:安装wordcloud库

  • 步骤1:在UCI页面上搜索wordcloud
  • 步骤2:下载对应版本的文件
  • 步骤3:使用pip install <文件名>安装

单元小结

Python第三方库安装

  • PyPI:Python Package Index
  • pip命令的各种用法
  • Anaconda集成开发工具及安装方法
  • UCI页面的“补丁”安装方法

8.4 模块7: os库的基本使用

8.4.1 os库基本介绍

os库提供通用的、基本的操作系统交互功能

  • os库是Python标准库,包含几百个函数
  • 常用路径操作、进程管理、环境参数等几类
  • 路径操作:os.path子库,处理文件路径及信息
  • 进程管理:启动系统中其他程序
  • 环境参数:获得系统软硬件信息等环境参数

8.4.2 os库之路径操作

os.path子库以path为入口,用于操作和处理文件路径

import os.path
或
import os.path as op
函数 描述
os.path.abspath(path) 返回path在当前系统中的绝对路径
os.path.normpath(path) 归一化path的表示形式,统一用\\分隔路径
os.path.relpath(path) 返回当前程序与文件之间的相对路径 (relative path)
os.path.dirname(path) 返回path中的目录名称
os.path.basename(path) 返回path中最后的文件名称
os.path.join(path, *paths) 组合path与paths,返回一个路径字符串
os.path.exists(path) 判断path对应文件或目录是否存在,返回True或False
os.path.isfile(path) 判断path所对应是否为已存在的文件,返回True或False
os.path.isdir(path) 判断path所对应是否为已存在的目录,返回True或False
os.path.getatime(path) 返回path对应文件或目录上一次的访问时间
os.path.getmtime(path) 返回path对应文件或目录最近一次的修改时间
os.path.getctime(path) 返回path对应文件或目录的创建时间
os.path.getsize(path) 返回path对应文件的大小,以字节为单位
#返回path在当前系统中的绝对路径
>>>os.path.abspath("file.txt")
'C:\\Users\\Tian Song\\Python36-32\\file.txt'

#归一化path的表示形式,统一用\\分隔路径
>>>os.path.normpath("D://PYE//file.txt")
'D:\\PYE\\file.txt'

#返回当前程序与文件之间的相对路径 (relative path)
>>>os.path.relpath("C://PYE//file.txt")
'..\\..\\..\\..\\..\\..\\..\\PYE\\file.txt'

#返回path中的目录名称
>>>os.path.dirname("D://PYE//file.txt")
'D://PYE'

#返回path中最后的文件名称
>>>os.path.basename("D://PYE//file.txt")
'file.txt'

#组合path与paths,返回一个路径字符串
>>>os.path.join("D:/", "PYE/file.txt")
'D:/PYE/file.txt'

#判断path对应文件或目录是否存在,返回True或False
>>>os.path.exists("D://PYE//file.txt")
False

#判断path所对应是否为已存在的文件,返回True或False
>>>os.path.isfile("D://PYE//file.txt")
True

#判断path所对应是否为已存在的目录,返回True或False
>>>os.path.isdir("D://PYE//file.txt")
False

#返回path对应文件或目录上一次的访问时间
>>>os.path.getatime("D:/PYE/file.txt")
1518356633.7551725

#返回path对应文件或目录最近一次的修改时间
>>>os.path.getmtime("D:/PYE/file.txt")
1518356633.7551725

#返回path对应文件或目录的创建时间
>>time.ctime(os.path.getctime("D:/PYE/file.txt"))
'Sun Feb 11 21:43:53 2018'

#返回path对应文件的大小,以字节为单位
>>>os.path.getsize("D:/PYE/file.txt")
180768

8.4.3 os库之进程管理

os.system(command)

  • 执行程序或命令command
  • 在Windows系统中,返回值为cmd的调用返回信息

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第195张图片MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第196张图片

8.4.4 os库之环境参数

获取或改变系统环境信息

函数 描述
os.chdir(path) 修改当前程序操作的路径
os.getcwd() 返回程序的当前路径
os.getlogin() 获得当前系统登录用户名称
os.cpu_count() 获得当前系统的CPU数量
os.urandom(n) 获得n个字节长度的随机字符串,通常用于加解密运算
#修改当前程序操作的路径
>>>os.chdir("D:")

#返回程序的当前路径
>>>os.getcwd()
'D:\\'

#获得当前系统登录用户名称
>>>os.getlogin()
'Tian Song'

#获得当前系统的CPU数量
>>>os.cpu_count()
8

#获得n个字节长度的随机字符串,通常用于加解密运算
>>>os.urandom(10)
b'7\xbe\xf2!\xc1=\x01gL\xb3'

8.5 实例14: 第三方库自动安装脚本

8.5.1 "第三方库自动安装脚本"问题分析

问题分析

第三方库自动安装脚本

  • 需求:批量安装第三方库需要人工干预,能否自动安装?
  • 自动执行pip逐一根据安装需求安装

如何自动执行一个程序?例如:pip?

第三方库自动安装脚本

库名 用途 pip安装指令
NumPy N维数据表示和运算 pip install numpy
Matplotlib 二维数据可视化 pip install matplotlib
PIL 图像处理 pip install pillow
Scikit-Learn 机器学习和数据挖掘 pip install sklearn
Requests HTTP协议访问及网络爬虫 pip install requests
Jieba 中文分词 pip install jieba
Beautiful Soup HTML和XML解析器 pip install beautifulsoup4
Wheel Python第三方库文件打包工具 pip install wheel
PyInstaller 打包Python源文件为可执行文件 pip install pyinstaller
Django Python最流行的Web开发框架 pip install django
Flask 轻量级Web开发框架 pip install flask
WeRoBot 微信机器人开发框架 pip install werobot
SymPy 数学符号计算工具 pip install sympy
Pandas 高效数据分析和计算 pip install pandas
Networkx 复杂网络和图结构的建模和分析 pip install networkx
PyQt5 基于Qt的专业级GUI开发框架 pip install pyqt5
PyOpenGL 多平台OpenGL开发接口 pip install pyopengl
PyPDF2 PDF文件内容提取及处理 pip install pypdf2
docopt Python命令行解析 pip install docopt
PyGame 简单小游戏开发框架 pip install pygame

8.5.2 "第三方库自动安装脚本"实例讲解

#BatchInstall.py
import os
libs = {
     "numpy","matplotlib","pillow","sklearn","requests",\
        "jieba","beautifulsoup4","wheel","networkx","sympy",\
        "pyinstaller","django","flask","werobot","pyqt5",\
        "pandas","pyopengl","pypdf2","docopt","pygame"}
try:
    for lib in libs:
        os.system("pip install " + lib)
    print("Successful")
except:
    print("Failed Somehow")

8.5.3 "第三方库自动安装脚本"举一反三

自动化脚本+

  • 编写各类自动化运行程序的脚本,调用已有程序
  • 扩展应用:安装更多第三方库,增加配置文件
  • 扩展异常检测:捕获更多异常类型,程序更稳定友好

第9章 Python计算生态概览

  • 9.1 从数据处理到人工智能
  • 9.2 实例15: 霍兰德人格分析雷达图
  • 9.3 从Web解析到网络空间
  • 9.4 从人机交互到艺术设计
  • 9.5 实例16: 玫瑰花绘制

方法论

  • 纵览Python计算生态,看见更大的世界

实践能力

  • 初步编写带有计算生态的复杂程序

9.1 从数据处理到人工智能

  • 9.1.1 Python库之数据分析
  • 9.1.2 Python库之数据可视化
  • 9.1.3 Python库之文本处理
  • 9.1.4 Python库之机器学习

数据表示->数据清洗->数据统计->数据可视化->数据挖掘->人工智能

  • 数据表示:采用合适方式用程序表达数据
  • 数据清理:数据归一化、数据转换、异常值处理
  • 数据统计:数据的概要理解,数量、分布、中位数等
  • 数据可视化:直观展示数据内涵的方式
  • 数据挖掘:从数据分析获得知识,产生数据外的价值
  • 人工智能:数据/语言/图像/视觉等方面深度分析与决策

9.1.1 Python库之数据分析

Numpy: 表达N维数组的最基础库

  • Python接口使用,C语言实现,计算速度优异
  • Python数据分析及科学计算的基础库,支撑Pandas等
  • 提供直接的矩阵运算、广播函数、线性代数等功能

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第197张图片
Pandas: Python数据分析高层次应用库

  • 提供了简单易用的数据结构和数据分析工具
  • 理解数据类型与索引的关系,操作索引即操作数据
  • Python最主要的数据分析功能库,基于Numpy开发

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第198张图片
SciPy: 数学、科学和工程计算功能库

  • 提供了一批数学算法及工程数据运算功能
  • 类似Matlab,可用于如傅里叶变换、信号处理等应用
  • Python最主要的科学计算功能库,基于Numpy开发

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第199张图片

9.1.2 Python库之数据可视化

Matplotlib: 高质量的二维数据可视化功能库

  • 提供了超过100种数据可视化展示效果
  • 通过matplotlib.pyplot子库调用各可视化效果
  • Python最主要的数据可视化功能库,基于Numpy开发

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第200张图片

Seaborn: 统计类数据可视化功能库

  • 提供了一批高层次的统计类数据可视化展示效果
  • 主要展示数据间分布、分类和线性关系等内容
  • 基于Matplotlib开发,支持Numpy和Pandas

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第201张图片
Mayavi:三维科学数据可视化功能库

  • 提供了一批简单易用的3D科学计算数据可视化展示效果
  • 目前版本是Mayavi2,三维可视化最主要的第三方库
  • 支持Numpy、TVTK、Traits、Envisage等第三方库

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第202张图片

9.1.3 Python库之文本处理

PyPDF2:用来处理pdf文件的工具集

  • 提供了一批处理PDF文件的计算功能
  • 支持获取信息、分隔/整合文件、加密解密等
  • 完全Python语言实现,不需要额外依赖,功能稳定

http://mstamy2.github.io/PyPDF2

from PyPDF2 import PdfFileReader, PdfFileMerger
merger = PdfFileMerger()
input1 = open("document1.pdf", "rb")
input2 = open("document2.pdf", "rb")
merger.append(fileobj = input1, pages = (0,3))
merger.merge(position = 2, fileobj = input2, pages = (0,1))
output = open("document-output.pdf", "wb")
merger.write(output)

NLTK:自然语言文本处理第三方库

  • 提供了一批简单易用的自然语言文本处理功能
  • 支持语言文本分类、标记、语法句法、语义分析等
  • 最优秀的Python自然语言处理库

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第203张图片
Python-docx:创建或更新Microsoft Word文件的第三方库

  • 提供创建或更新.doc .docx等文件的计算功能
  • 增加并配置段落、图片、表格、文字等,功能全面

http://python-docx.readthedocs.io/en/latest/index.html

from docx import Document
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
document.add_page_break()
document.save('demo.docx')

9.1.4 Python库之机器学习

Scikit-learn:机器学习方法工具集

  • 提供一批统一化的机器学习方法功能接口
  • 提供聚类、分类、回归、强化学习等计算功能
  • 机器学习最基本且最优秀的Python第三方库

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第204张图片
TensorFlow:AlphaGo背后的机器学习计算框架

  • 谷歌公司推动的开源机器学习框架
  • 将数据流图作为基础,图节点代表运算,边代表张量
  • 应用机器学习方法的一种方式,支撑谷歌人工智能应用

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第205张图片
MXNet:基于神经网络的深度学习计算框架

  • 提供可扩展的神经网络及深度学习计算功能
  • 可用于自动驾驶、机器翻译、语音识别等众多领域
  • Python最重要的深度学习计算框架

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第206张图片

单元小结

  • Numpy、Pandas、SciPy
  • Matplotlib、Seaborn、Mayavi
  • PyPDF2、NLTK、python-docx
  • Scikit-learn、TensorFlow、MXNet

小花絮

小议"函数式编程"
"函数式编程"用函数将程序组织起来,貌似很流行,为何不早学呢?

  • 第一,函数式编程主要源于C语言,Python不是C,这说法不流行
  • 第二,不要纠结于名字,关键在于按照"控制流"编程的过程式编程思维
  • 第三,Python编程中函数不必须,因此更灵活,更探寻本质
    如果您学过其他编程语言,不要被束缚,从本质上看待Python才更有趣!

9.2 实例15: 霍兰德人格分析雷达图

9.2.1 "霍兰德人格分析雷达图"问题分析

问题分析

雷达图 Radar Chart

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第207张图片

霍兰德人格分析

  • 霍兰德认为:人格兴趣与职业之间应有一种内在的对应关系
  • 人格分类:研究型、艺术型、社会型、企业型、传统型、现实性
  • 职业:工程师、实验员、艺术家、推销员、记事员、社会工作者

霍兰德人格分析雷达图

  • 需求:雷达图方式验证霍兰德人格分析

  • 输入:各职业人群结合兴趣的调研数据

  • 输出:雷达图

  • 通用雷达图绘制:matplotlib库 - 专业的多维数据表示:numpy库 - 输出:雷达图

9.2.2 "霍兰德人格分析雷达图"实例展示

#HollandRadarDraw
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)',\
                         '企业型(E)','常规型(C)','现实型(R)']) #雷达标签
nAttr = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
                 [0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
                 [0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
                 [0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
                 [0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
                 [0.34, 0.31, 0.38, 0.40, 0.92, 0.28]]) #数据值
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者','记事员')
angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(facecolor="white")
plt.subplot(111, polar=True)
plt.plot(angles,data,'o-', linewidth=1, alpha=0.2)
plt.fill(angles,data, alpha=0.25)
plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2)
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()

运行结果:
报错

9.2.3 "霍兰德人格分析雷达图"举一反三

目标 + 沉浸 + 熟练

  • 编程的目标感:寻找感兴趣的目标,寻(wa)觅(jue)之
  • 编程的沉浸感:寻找可实现的方法,思(zuo)考(mo)之
  • 编程的熟练度:练习、练习、再练习,熟练之

9.3 从Web解析到网络空间

  • 9.3.1 Python库之网络爬虫
  • 9.3.2 Python库之Web信息提取
  • 9.3.3 Python库之Web网站开发
  • 9.3.4 Python库之网络应用开发

9.3.1 Python库之网络爬虫

Requests: 最友好的网络爬虫功能库

  • 提供了简单易用的类HTTP协议网络爬虫功能
  • 支持连接池、SSL、Cookies、HTTP(S)代理等
  • Python最主要的页面级网络爬虫功能库
    http://www.python-requests.org/

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第208张图片

Scrapy: 优秀的网络爬虫框架

  • 提供了构建网络爬虫系统的框架功能,功能半成品
  • 支持批量和定时网页爬取、提供数据处理流程等
  • Python最主要且最专业的网络爬虫框架
    https://scrapy.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第209张图片

pyspider: 强大的Web页面爬取系统

  • 提供了完整的网页爬取系统构建功能
  • 支持数据库后端、消息队列、优先级、分布式架构等
  • Python重要的网络爬虫类第三方库
    http://docs.pyspider.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第210张图片

9.3.2 Python库之Web信息提取

Beautiful Soup: HTML和XML的解析库

  • 提供了解析HTML和XML等Web信息的功能
  • 又名beautifulsoup4或bs4,可以加载多种解析引擎
  • 常与网络爬虫库搭配使用,如Scrapy、requests等
    https://www.crummy.com/software/BeautifulSoup/bs4

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第211张图片

Re: 正则表达式解析和处理功能库

  • 提供了定义和解析正则表达式的一批通用功能
  • 可用于各类场景,包括定点的Web信息提取
  • Python最主要的标准库之一,无需安装
    https://docs.python.org/3.6/library/re.html

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第212张图片

Python-Goose: 提取文章类型Web页面的功能库

  • 提供了对Web页面中文章信息/视频等元数据的提取功能
  • 针对特定类型Web页面,应用覆盖面较广
  • Python最主要的Web信息提取库
    https://github.com/grangier/python-goose
from goose import Goose
url = 'http://www.elmundo.es/elmundo/2012/10/28/espana/1351388909.html'
g = Goose({
     'use_meta_language': False, 'target_language':'es'})
article = g.extract(url=url)
article.cleaned_text[:150]

9.3.3 Python库之Web网站开发

Django: 最流行的Web应用框架

  • 提供了构建Web系统的基本应用框架
  • MTV模式:模型(model)、模板(Template)、视图(Views)
  • Python最重要的Web应用框架,略微复杂的应用框架
    https://www.djangoproject.com

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第213张图片

Pyramid: 规模适中的Web应用框架

  • 提供了简单方便构建Web系统的应用框架
  • 不大不小,规模适中,适合快速构建并适度扩展类应用
  • Python产品级Web应用框架,起步简单可扩展性好
    https://trypyramid.com/
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
    return Response('Hello World!')
if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('hello', '/')
        config.add_view(hello_world, route_name='hello')
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 6543, app)
    server.serve_forever()

Flask: Web应用开发微框架

  • 提供了最简单构建Web系统的应用框架
  • 特点是:简单、规模小、快速
  • Django > Pyramid > Flask
    http://flask.pocoo.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第214张图片

9.3.4 Python库之网络应用开发

WeRoBot: 微信公众号开发框架

  • 提供了解析微信服务器消息及反馈消息的功能
  • 建立微信机器人的重要技术手段
    https://github.com/offu/WeRoBot
import werobot
robot = werobot.WeRoBot(token='tokenhere') @robot.handler
def hello(message):
	return 'Hello World!'
  • 对微信每个消息反馈一个Hello World

aip: 百度AI开放平台接口

  • 提供了访问百度AI服务的Python功能接口
  • 语音、人脸、OCR、NLP、知识图谱、图像搜索等领域
  • Python百度AI应用的最主要方式
    https://github.com/Baidu-AIP/python-sdk

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第215张图片
MyQR: 二维码生成第三方库

  • 提供了生成二维码的系列功能
  • 基本二维码、艺术二维码和动态二维码
    https://github.com/sylnsfar/qrcode
    MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第216张图片

单元小结

从Web解析到网络空间

  • Requests、Scrapy、pyspider
  • Beautiful Soup、Re、Python-Goose
  • Django、Pyramid、Flask
  • WeRobot、aip、MyQR

9.4 从人机交互到艺术设计

  • 9.4.1 Python库之图形用户界面
  • 9.4.2 Python库之游戏开发
  • 9.4.3 Python库之虚拟现实
  • 9.4.4 Python库之图形艺术

9.4.1 Python库之图形用户界面

PyQt5: Qt开发框架的Python接口

  • 提供了创建Qt5程序的Python API接口
  • Qt是非常成熟的跨平台桌面应用开发系统,完备GUI
  • 推荐的Python GUI开发第三方库
    https://www.riverbankcomputing.com/software/pyqt

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第217张图片
wxPython: 跨平台GUI开发框架

  • 提供了专用于Python的跨平台GUI开发框架
  • 理解数据类型与索引的关系,操作索引即操作数据
  • Python最主要的数据分析功能库,基于Numpy开发
    https://www.wxpython.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第218张图片

PyGObject: 使用GTK+开发GUI的功能库

  • 提供了整合GTK+、WebKitGTK+等库的功能
  • GTK+:跨平台的一种用户图形界面GUI框架
  • 实例:Anaconda采用该库构建GUI
    https://pygobject.readthedocs.io

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第219张图片

9.4.2 Python库之游戏开发

PyGame: 简单的游戏开发功能库

  • 提供了基于SDL的简单游戏开发功能及实现引擎
  • 理解游戏对外部输入的响应机制及角色构建和交互机制
  • Python游戏入门最主要的第三方库
    http://www.pygame.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第220张图片
Panda3D: 开源、跨平台的3D渲染和游戏开发库

  • 一个3D游戏引擎,提供Python和C++两种接口
  • 支持很多先进特性:法线贴图、光泽贴图、卡通渲染等
  • 由迪士尼和卡尼基梅隆大学共同开发
    http://www.panda3d.org

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第221张图片
cocos2d: 构建2D游戏和图形界面交互式应用的框架

  • 提供了基于OpenGL的游戏开发图形渲染功能
  • 支持GPU加速,采用树形结构分层管理游戏对象类型
  • 适用于2D专业级游戏开发
    http://python.cocos2d.org/

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第222张图片

9.4.3 Python库之虚拟现实

VR Zerot: 在树莓派上开发VR应用的Python库

  • 提供大量与VR开发相关的功能
  • 针对树莓派的VR开发库,支持设备小型化,配置简单化
  • 非常适合初学者实践VR开发及应用
    https://github.com/WayneKeenan/python-vrzero

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第223张图片
pyovr: Oculus Rift的Python开发接口

  • 针对Oculus VR设备的Python开发库
  • 基于成熟的VR设备,提供全套文档,工业级应用设备
  • Python+虚拟现实领域探索的一种思路
    https://github.com/cmbruns/pyovr

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第224张图片
Vizard: 基于Python的通用VR开发引擎

  • 专业的企业级虚拟现实开发引擎
  • 提供详细的官方文档
  • 支持多种主流的VR硬件设备,具有一定通用性
    http://www.worldviz.com/vizard-virtual-reality-software

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第225张图片

9.4.4 Python库之图形艺术

Quads: 迭代的艺术

  • 对图片进行四分迭代,形成像素风
  • 可以生成动图或静图图像
  • 简单易用,具有很高展示度
    https://github.com/fogleman/Quads

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第226张图片
ascii_art: ASCII艺术库

  • 将普通图片转为ASCII艺术风格
  • 输出可以是纯文本或彩色文本
  • 可采用图片格式输出
    https://github.com/jontonsoup4/ascii_art

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第227张图片
turtle: 海龟绘图体系
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第228张图片
https://docs.python.org/3/library/turtle.html
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第229张图片

单元小结

从人机交互到艺术设计

  • PyQt5、wxPython、PyGObject
  • PyGame、Panda3D、cocos2d
  • VR Zero、pyovr、Vizard
  • Quads、ascii_art、turtle

小花絮

https://python123.io

  • 这是一段不超过20行的小代码
  • 虽短却小有创意,请实践之
  • 这是别人的精彩,你的呢?
import turtle as t
t.penup()
t.seth(-90)
t.fd(160)
t.pendown()
t.pensize(20)
t.colormode(255)
for j in range(10):
    t.speed(1000)
    t.pencolor(25*j,5*j,15*j)
    t.seth(130)
    t.fd(220)
    for i in range(23):
         t.circle(-80,10)
    t.seth(100)
    for i in range (23):
        t.circle(-80,10)
    t.fd(220)

9.5 实例16: 玫瑰花绘制

9.5.1 "玫瑰花绘制"问题分析

MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第230张图片

  • 需求:用Python绘制一朵玫瑰花,献给所思所念
  • 输入:你的想象力!
  • 输出:玫瑰花
     
  • 绘制机理:turtle基本图形绘制
  • 绘制思想:因人而异
  • 思想有多大、世界就有多大

9.5.2 "玫瑰花绘制"实例展示

# RoseDraw.py
import turtle as t
# 定义一个曲线绘制函数
def DegreeCurve(n, r, d=1):
    for i in range(n):
        t.left(d)
        t.circle(r, abs(d))
# 初始位置设定
s = 0.2 # size
t.setup(450*5*s, 750*5*s)
t.pencolor("black")
t.fillcolor("red")
t.speed(100)
t.penup()
t.goto(0, 900*s)
t.pendown()
# 绘制花朵形状
t.begin_fill()
t.circle(200*s,30)
DegreeCurve(60, 50*s)
t.circle(200*s,30)
DegreeCurve(4, 100*s)
t.circle(200*s,50)
DegreeCurve(50, 50*s)
t.circle(350*s,65)
DegreeCurve(40, 70*s)
t.circle(150*s,50)
DegreeCurve(20, 50*s, -1)
t.circle(400*s,60)
DegreeCurve(18, 50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.right(123)
t.circle(220*s,57)
t.end_fill()
# 绘制花枝形状
t.left(120)
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70, 225*s, -1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20, 2500*s)
DegreeCurve(220, 250*s, -1)
# 绘制一个绿色叶子
t.fillcolor('green')
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40)
# 绘制另一个绿色叶子
t.penup()
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done()

运行结果:
MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》自学笔记_第231张图片

9.5.3 "玫瑰花绘制"举一反三

艺术之于编程,设计之于编程

  • 艺术:思想优先,编程是手段
  • 设计:想法和编程同等重要
  • 工程:编程优先,思想次之

编程不重要,思想才重要!

  • 认识自己:明确自己的目标,有自己的思想(想法) - 方式方法:编程只是手段,熟练之,未雨绸缪为思想服务
  • 为谁编程:将自身发展与祖国发展相结合,创造真正价值

后记

喜欢

全国计算机等级考试二级 Python科目
http://ncre.neea.edu.cn
全国计算机等级考试(简称NCRE)是教育部批准,由教育部考试中心主办,
面向社会,用于考查应试人员计算机应用知识与技能的全国性计算机水平考试体系。 二级Python语言科目在 2018年9月 首考,异常火爆,快去报名试试吧!

你可能感兴趣的:(Python,python,编程语言,程序设计)