第1章 Python概述
1.1 认识Python
计算机目前已应用在人类日常生活的各个场景,计算机通过程序控制,程序通过编程语言编写,对于初次接触编程的小伙伴而言,Python无疑是最为简洁、易上手的编程语言。
1989年圣诞节期间,阿姆斯特丹的Guido(Guido van Rossum)自觉假日无趣,想起自己曾参与设计的一种优美与强大并存,但最终惨遭失败的语言ABC,寻思不如开发一个新的脚本解释程序作为ABC语言的继承,于是Python诞生了。
1.1.1 Python的前世今生
Python语法很多来自C语言,但又受到ABC语言的强烈影响。自诞生开始,Python已经具有了类(class)、函数(function)、异常处理(exception)、包括列表(list)和词典(dict)在内的核心数据类型,以及以模块为基础的拓展系统。
1.1.1 Python的前世今生
2000年10月,Python 2.0发布,Python从基于maillist的开发方式转为完全开源的开发方式。
2008年12月,Python 3.0版本发布,并被作为Python语言持续维护的主要系列。
2010年,Python 2.x系列发布了最后一个版本,其主版本号为2.7,同时,Python的维护者们声称不在2.x系列中继续对主版本号升级,Python 2.x系列慢慢退出历史舞台。
2012年Python 3.3版本发布,2014年Python 3.4版本发布,2015年Python 3.5版本发布,2016年Python 3.6版本发布,2018年6月27日Python 3.7.0发布,2019年10月14日Python3.8.0发布
目前Python的最新版本为2020年2月24日发布的3.8.2。
Guido于1989年定下目标之后便投身于Python语言的设计之中,但Python的第一个公开版本直到1991年才行,此版本使用C语言实现,能调用C语言的库文件。
1.1.1 Python的前世今生
黑格尔说,存在即合理。一件事物能存在必有其合理性,而若该事物同时被大多数人接收与欣赏,那它必定具备许多独到之处与优点。Python作为一种比较优秀的编程语言,其优点主要有以下几点:
1.1.2 Python语言的特点
简洁。Python代码的行数往往只有C、C++、Java代码数量的1/5~1/3
语法优美。Python语言是高级语言,它的代码接近人类语言,只要掌握由英语单词表示的助记符,就能大致读懂Python代码
简单易学。Python是一门简单易学的编程语言,它使编程人员更注重解决问题,而非语言本身的语法和结构
开源。Python是FLOSS(自由/开放源码软件)之一,用户可以自由地下载、拷贝、阅读、修改代码
可移植。Python语言编写的程序可以不加修改地在任何平台中运行。
黑格尔说,存在即合理。一件事物能存在必有其合理性,而若该事物同时被大多数人接收与欣赏,那它必定具备许多独到之处与优点。Python作为一种比较优秀的编程语言,其优点主要有以下几点:
1.1.2 Python语言的特点
扩展性良好。Python不仅可以引入.py文件,还可以通过接口和库函数调用由其它高级语言(如C语言、C++、Java等)编写的代码
类库丰富。世界各地的程序员通过开源社区又贡献了十几万个几乎覆盖各个应用领域的第三方函数库
通用灵活。Python是一门通用编程语言,可被用于科学计算、数据处理、游戏开发、人工智能、机器学习等各个领域
模式多样。Python既支持面向对象编程,又支持面向过程编程
良好的中文支持。Python 3.x解释器采用UTF-8编码表达所有字符信息,编码支持英文、中文、韩文、法文等各类语言
Python因自身的诸多优点得到广泛应用,但Python的缺点也不可忽视。Python主要具有以下缺点:
执行效率不够高,Python程序的效率只有C语言程序的1/10。
Python 3.x和Python 2.x不兼容。
Python解释器有多个版本,考虑到主要的Python标准库更新只针对3.x系列,且当下企业也正从Python 2.x向3.x过渡,因此对于初学Python 的读者而言,Python3.x无疑是明智的选择。
1.2 安装Python解释器
1.访问Python官网的下载页面:https://www.python.org/downloads/。
1.2 安装Python解释器
1.2 安装Python解释器
\2. 进入Windows版本软件下载页面,根据操作系统版本选择相应软件包。本教材使用的是Windows 7 64位操作系统,此处选择3.7.2版本、.exe形式的安装包。
3.勾选“Add Python 3.8 to PATH”,选择“Install Now”开始自动安装Python解释器、配置环境变量。片刻后安装完成。
1.2 安装Python解释器
4.在【开始】菜单栏中搜索“python”,找到并单击打开Python 3.8(64 bit)。
5.在控制台中输入Python,按下Enter键进入Python环境
工欲善其事,必先利其器。虽然安装Python解释器、配置环境变量之后,便可开始Python程序的开发,但使用好的编辑器能大大提升开发效率。常用的Python编辑器有PyCharm、Jupyter Notebook等等。
1.3 常用的Python编辑器
PyCharm常用于编辑Python项目,它具备非常齐备的功能,如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等,使用PyCharm可以实现程序编写、运行、测试的一体化。
1.3 常用的Python编辑器
访问PyCharm官方网址http://www.jetbrains.com/pycharm/download/,进入PyCharm的下载页面。
1.3.1 PyCharm
Professional和Community是PyCharm的两个版本,这两个版本的特点如下。
1.3.1 PyCharm
Jupyter Notebook(简称Jupyter)便于创建和共享文档,支持实时代码,它本质上是一个Web应用程序,与PyCharm相比,它调试方便、小巧灵活、方便图表展示。
1.3.1 Jupyter Notebook
1.3.1 Jupyter Notebook
使用pip工具可以方便地安装Jupyter,pip工具是Python包管理工具,3.4+版本的Python解释器内嵌了pip管理工具,打开Windows命令行,使用pip命令安装Jupyter。
安装命令:pip install jupyter notebook
1.单击桌面上PyCharm的快捷方式打开PyCharm,初次打开PyCharm时会弹出JetBrains Privacy Policy窗口,用户需在该窗口中勾选同意用户协议;之后会进入PyCharm的主题选择窗口,在该窗口中选择PyCharm的主题后方可启动PyCharm,进入PyCharm的欢迎窗口。
1.4.1 使用PyCharm编写Python程序
2.单击“Create New Project”进入Create Project窗口。
1.4.1 使用PyCharm编写Python程序
3.在Create Project窗口可以设置项目的存储路径,这里设置项目存储路径为F:\python\first_proj,设置完成后单击“Create”按钮,进入项目界面。
1.4.1 使用PyCharm编写Python程序
4.经以上操作后我们创建了一个空Python项目,之后还需要在项目中添加Python文件。右击项目名称,在弹出的下拉菜单中选择【New】→【Python File】。
1.4.1 使用PyCharm编写Python程序
5.单击下拉列表中的“Python File”将弹出“New Python file”窗口。
6.这里输入的文件名为“first”,文件添加完成后的PyCharm窗口。
1.4.1 使用PyCharm编写Python程序
在first.py文件中输入:print(“Hello World!”)单击工具栏的运行Run按钮来启动项目,执行结果将在窗口下方显式。
1.4.1 使用PyCharm编写Python程序
在命令行中输入 “jupyter notebook” 命令,Jupyter将在浏览器中启动。这里在F:\python目录下打开命令行窗口,执行Jupyter的启动命令,浏览器中呈现的Jupyter主界面。
1.4.2 使用Jupyter编写Python程序
与PyCharm类似,在编写Python程序之前需先创建Python文件。单击Jupyter主界面文件列表右上角的“New”,选择下拉列表中的“Python 3”,可创建一个Python文件。
1.4.2 使用Jupyter编写Python程序
创建Python文件后Jupyter会在浏览器中打开一个新的页面,在该页面中“Untitled”是文件名;文件名下方是菜单栏,提供保存、打开、新建文件等功能;菜单栏下方是工具栏,提供执行、剪切、粘贴等于代码相关的操作功能。
1.4.2 使用Jupyter编写Python程序
在Jupyter文件页面的“In [ ]:”后的文本框中输入print(“hello world!”),单击文本框上方的运行按钮,程序执行结果将会在文本框下方直接输出。
使用快捷键Ctrl+S(或修改文件页面的文件名)可以将当前页面中编辑的代码和代码的运行结果都保存在以“.ipynb”的文件中,保存后的文件将会出现在Jupyter主页的文件列表中,双击列表中的文件,可在浏览器中打开并继续使用文件。
1.4.2 使用Jupyter编写Python程序
在编写代码的过程中,随着程序复杂度的提高,代码量也会同步增长,这时若还是在一个文件中编写代码,该文件中代码的维护就会越来越困难。为了保证代码的可维护性,开发人员通常将一些功能性代码放在其他文件中,这样用于存放功能性代码的文件就是模块。
1.5 模块的安装、导入与使用
以模块形式组织代码不仅可保证代码的可维护性,也可提高代码的可复用性。Python内置了一些标准模块,Python的使用者也贡献了许多丰富且强大的第三方模块。标准模块可以直接导入与使用,第三方模块则需先行安装。
1.5 模块的安装、导入与使用
利用Python内置的pip工具可以非常方便地安装Python第三方模块,该工具可在命令行中使用,使用该工具在命令行中安装第三方模块的命令为:pip install 模块名。例如安装用于开发游戏的pygame模块,具体命令为:pip install pygame。
1.5.1 模块的安装
1.5.2 模块的导入与使用
在使用模块中定义的内容之前,需先将模块导入到当前程序。Python使用import关键字导入模块,其语法格式如下:
import 模块1,模块2,…
模块导入后,可通过点字符“.”调用模块中的内容,其语法格式如下:
模块.函数
模块.变量
1.5.2 模块的导入与使用
通过点字符调用模块中的内容可避免多个模块中存在同名函数时代码产生歧义,但若不存在同名函数,可使用from…import…语句直接将模块的指定内容导入程序,并在程序中直接使用模块中的内容。
例如将pygame模块的init()函数导入程序,并直接使用该函数,具体代码如下:
from pygame import init
init()
使用from…import…语句也可将指定模块的全部内容导入当前程序,此时可使用“*”指代模块中的全部内容,虽然from…import *可以方便地导入一个模块中的所有内容,但考虑到代码的可维护性,此种方式不应被过多地使用。
例如将pygame模块的init()函数导入程序,并直接使用该函数,具体代码如下:
from pygame import *
1.5.2 模块的导入与使用 模块(module)、包(package)和库(lib)是Python组织代码的三种方式。
模块是最基础的代码组织方式,每个包含有组织的代码片段的.py文件都是一个模块,文件名就是模块名。
包以类似目录的结构组织模块文件或子包,简单来说,一个包含__init__.py文件的目录就是一个包。包中必有__init__.py文件,可以有多个模块或子包。
库是一个抽象概念,它是指具有相关功能的模块的集合。
多学一招:代码的组织方式——模快、包与库
1.6本章小结
本章首先通过Python的发展史、语言特点两方面简单介绍了Python,然后介绍了如何安装Python解释器,之后介绍了PyCharm、Jupyter Notebook两种常用的Python编辑器,以及如何编写Python程序,最后介绍了Python模块的安装、导入与使用。
通过本章的讲解,希望读者能对Python语言有个简单的认识,并能熟练搭建Python开发环境,了解Python编辑器的使用方式,以及模块的安装与使用。 End
第2章 Python基础
良好的代码格式可提升代码的可读性,与其他语言不通,Python代码的格式是Python语法的组成之一,不符合格式规范的Python代码很可能存在语法问题,在运行期间也很可能产生错误。
2.1 良好的代码格式
单行注释以“#”开头,用于说明当前行或之后代码的功能。单行注释既可以单独占一行,也可以位于标识的代码之后,与标识的代码共占一行。
2.1.1注释
2.1.1注释
多行注释是由三对双引号或单引号包裹的语句,主要用于说明函数或类的功能。
2.1.2缩进
Python代码的缩进可以通过Tab键控制,也可使用空格控制。空格是Python3首选的缩进方法,一般使用4个表示一级缩进;Python3不允许混合使用Tab和空格。 if True:
print (“True”)
else:
print ("False”)
print ("False”) if True:
print (“True”)
else:
print (“False”)
print (”hello”)
2.1.3语句换行
Python官方建议每行代码不超过79个字符,若代码过长应该换行。Python会将圆括号、中括号和大括号中的行进行隐式连接,我们可以根据这个特点实现过长语句的换行显示。
string=(“Python是一种面向对象、解释型计算机程序设计语言,”
“由Guido van Rossum于1989年底发明。”
“第一个公开发行版发行于1991年,”
“源代码同样遵循 GPL(GNU General Public License)协议。”) 现实生活中,人们常用一些名称来标记事物。例如,每种水果都有一个名称来标识。
水果名称
2.2.1标识符
若希望在程序中表示一些事物,开发人员需要自定义一些符号和名称,这些符号和名称叫做标识符。 Python中的标识符需要遵守一定的规则。
2.2.1标识符
为了规范命名标识符,关于标识符的命名提以下建议:
见名之意
常量名使用大写的单个单词或由下画线连接的多个单词模块名、函数名使用小写的单个单词或由下画线连接的多个单词;类名使用大写字母开头的单个或多个单词。
2.2.2关键字
关键字是Python已经使用的、不允许开发人员重复定义的标识符。Python3中一共有35个关键字,每个关键字都有不同的作用。在Jupyter单元格中执行“help(”关键字“)”可查看关键字的声明。 程序在运行期间用到的数据会被保存在计算机的内存单元中,为了方便存取内存单元中的数据,Python使用标识符来标识不同的内存单元,如此,标识符与数据建立了联系。
2.3.1变量
标识内存单元的标识符又称为变量名,Python通过赋值运算符“=”将内存单元中存储的数值与变量名建立联系,即定义变量,具体语法格式如下:变量 = 值
将内存单元中存储的数据100与变量名data建立联系 2.3.2数据类型
根据数据存储形式的不同,数据类型分为基础的数字类型和比较复杂的组合类型,其中数字类型又分为整型、浮点型、布尔类型和复数类型;组合类型分为字符串、列表、元组、字典等。
2.3.2数据类型
Python内置的数字类型有整型(int)、浮点型(float)、复数类型(complex)和布尔类型(bool),其中int、float和complex分别对应数学中的整数、小数和复数;bool类型比较特殊,它是int的子类,只有True和False两种取值。数字类型的示例如下:
整型: 0 101 -239 False True 浮点型: 3.1415 4.2E-10 -2.334E-9 复数类型: 3.12+1.2.3j -1.23-93j 布尔类型: True False
2.3.2数据类型 使用单引号包含: ‘Python123¥’ 使用双引号包含: “Python4*&%” 使用三引号包含: ‘’‘Python s1 ~(())’‘’
字符串是一个由单引号、双引号或者三引号包裹的、有序的字符集合。示例如下:
2.3.2数据类型
列表是多个元素的集合,它可以保存任意数量、任意类型的元素,且可以被修改。Python中使用“[]”创建列表,列表中的元素以逗号分隔,示例如下: [1, 2, ‘hello’] 2.3.2数据类型
元组与列表的作用相似,它可以保存任意数量与类型的元素,但不可以被修改。Python中使用“()”创建元组,元组中的元素以逗号分隔,示例如下: (1, 2, ‘hello’]) 2.3.2数据类型
集合与列表和元组类似,也可以保存任意数量、任意类型的元素,不同的是,集合使用“{}”创建,集合中的元素无序且唯一。示例如下: {‘apple’, ‘orange’, 1} 2.3.2数据类型
字典中的元素是“键(Key):值(Value)”形式的键值对,键不能重复。Python中使用“{}”创建字典,字典中的各元素以逗号分隔,示例如下: {“name”: “zhangsan”, “age”: 18}
2.3.3变量的输入与输出
程序要实现人机交互功能,需能从输入设备接收用户输入的数据,也需要向显示设备输出数据。
2.3.3变量的输入与输出
input()函数用于接收用户键盘输入的数据,返回一个字符串类型的数据,其语法格式如下所示:
input([prompt])
prompt表示函数的参数,用于设置接收用户输入时的提示信息。
2.3.3变量的输入与输出
print()函数用于向控制台中输出数据,它可以输出任何类型的数据,其语法格式如下所示:
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout)
objects:表示输出的对象。输出多个对象时,对象之间需要用分隔符分隔。
sep:用于设定分隔符,默认使用空格作为分隔。
end:用于设定输出以什么结尾,默认值为换行符\n。
file:表示数据输出的文件对象。
2.5 数字类型
2.2 标识符和关键字
2.3 变量和数据类型
2.4 精彩实例
2.1 良好的代码格式
2.4.1打印购物小票
购物小票又称购物收据,是指消费者购买商品时由商场或其它商业机构给用户留存的销售凭据。购物小票中一般会包含用户购买的商品名称、数量、单价以及总金额等信息。本实例要求编写代码,实现打印购物小票的功能。
2.4.2打印蚂蚁森林植树证书
蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行、地铁出行、在线消费等行为,可在蚂蚁森林中获取能量,当能量到达一定数值后,用户可以在支付宝中申请一颗虚拟的树,申请成功后会收到支付宝发放的一张植树证书。植树证书中包含申请日期、树苗编号等信息。本实例要求编写代码,实现打印植树证书信息的功能。
2.5.1整型
整数类型(int)简称整型,它用于表示整数。整型常用的计数方式有4种,分别是二进制(以“0B”或“0b”开头)、八进制(以数字“0o”或“0O”开头)、十进制和十六进制(以“0x”或“0X”开头)。以4种计数方式表示整型数据5,示例如下: 0b101 # 二进制
0o5 # 八进制
5 # 十进制
0x5 # 十六进制 2.5.1整型
为了方便使用各进制的数据,Python中内置了用于转换数据进制的函数:bin()、oct()、int()、hex(),关于这些函数的功能说明如下。
2.5.2浮点型
浮点型(float)用于表示实数,由整数和小数部分(可以是0)组成例如,3.14、0.9等。较大或较小的浮点数可以使用科学计算法表示。
科学计数法会把一个数表示成a与10的n次幂相乘的形式,数学中科学计数法的格式为:
a×10n (1≤|a|<10,n∈N) Python程序中省略“×”,使用字母e或E代表底数10,示例如下: -3.14e2 # 即-314
3.14e-3 # 即0.00314 2.5.2浮点型
Python中的浮点型每个浮点型数据占8个字节(即64位),且遵守IEEE标准。Python中浮点型的取值范围为-1.8e308~1.8e308,若超出这个范围,Python会将值视为无穷大(inf)或无穷小(-inf)。
2.5.3复数类型
复数由实部和虚部构成,它的一般形式为:real+imagj,其中real为实部,imag为虚部,j为虚部单位。示例如下: 通过real和imag属性可以获取复数的实部部分和虚部部分。
complex_one = 1 + 2j # 实部为1,虚部为2
complex_two = 2j # 实部为0,虚部为2
2.5.4布尔类型
Python中的布尔类型只有True(真)和False(假)两个取值。实际上,布尔类型也是一种特殊的整型,其值True对应整数1,False对应整数0。若数据符合以下任一条件,其布尔值均为False。 值为None或False的常量 任何数字类型的0:0、0.0、0j 空组合数据类型:‘’、()、[]、set()、{}
2.5.5数字类型转换
Python内置了一系列可实现强制类型转换的函数,使用这些函数可以将目标数据转换为指定的类型。数字类型间进行转换的函数有int()、float()、complex()。需要注意的是浮点型数据转换为整型数据后只保留整数部分
Python运算符是一种特殊的符号,主要用于实现数值之间的运算。根据操作数数量的不同,运算符可分为单目运算符、双目运算符;根据运算符的功能,运算符可分为算术运算符、赋值运算符、比较运算符、逻辑运算符和成员运算符。
2.6.1算术运算符
Python中的算术运算符包括+、-、*、/、//、%和**。以操作数a = 2,b = 8为例对算术运算符进行使用说明。
Python中的算术运算符既支持对相同类型的数值进行运算,也支持对不同类型的数值进行混合运算。在混合运算时,Python会强制将数值的类型进行临时类型转换,这些转换遵循如下原则:
整型与浮点型进行混合运算时,将整型转化为浮点型。
其他类型与复数运算时,将其他类型转换为复数类型。
2.6.1算术运算符
赋值运算符的作用是将一个表达式或对象赋值给一个左值。左值是指一个能位于赋值运算符左边的表达式,它通常是一个可修改的变量,不能是一个常量。例如将整数3赋值给变量num:num=3。
2.6.2赋值运算符
赋值运算符允许同时为多个变量赋值 x = y = z = 1 # 变量x、y、z均赋值为1 Python中的算术运算符可以与赋值运算符组成复合赋值运算符,赋值运算符同时具备运算和赋值两项功能。以变量num为例, Python复合赋值运算符的功能说明及示例如下:
2.6.2赋值运算符
Python3.8中新增了一个赋值运算符——海象运算符“:=”,该运算符用于在表达式内部为变量赋值,因形似海象的眼睛和长牙而得此命名。
2.6.2赋值运算符
比较运算符也叫关系运算符,用于比较两个数值,判断它们之间的关系。Python中的比较运算符包括==、!=、>、<、>=、<=,它们通常用于布尔测试,测试的结果只能是True或False。以变量x=2,y=3为例,具体如下:
2.6.3比较运算符
Python中分别使用“or”,“and”,“not”这三个关键字作为逻辑运算符,其中or与and为双目运算符,not为单目运算符。以x=10,y=20为例,具体如下:
2.6.4逻辑运算符
成员运算符in和not in用于测试给定数据是否存在于序列(如列表、字符串)中,关于它们的介绍如下:
2.6.5成员运算符
in:如果指定元素在序列中返回True,否则返回False。 not in:如果指定元素不在序列中返回True,否则返回False。
位运算符用于按二进制位进行逻辑运算,操作数必须为整数。下面介绍位运算符的功能,并以a=2,b=3为例进行演示,具体如下:
2.6.6位运算符
按位左移(<<)是指将二进制形式操作数的所有位全部左移n位,高位丢弃,低位补0。以十进制9为例,9转为二进制后是00001001,将转换后的二进制数左移4位。
2.6.6位运算符
2.6.6位运算符
按位右移(>>)是指将二进制形式操作数的所有位全部右移n位,低位丢弃,高位补0。以十进制8为例,8转换为二进制后是00001000,将转换后的二进制数右移2位。
2.6.6位运算符
按位与(&)是指将参与运算的两个操作数对应的二进制位进行“与”操作。当对应的两个二进制位均为1时,结果位就为1,否则为0。以十进制9和3为例,9和3转换为二进制后分别是00001001和00000011。
2.6.6位运算符
按位或(|)是指将参与运算的两个操作数对应的二进制位进行“或”操作。若对应的两个二进制位有一个为1时,结果位就为1。若参与运算的数值为负数,参与运算的两个数均以补码出现。以十进制8和3为例,8和3转换为二进制后分别是00001000和00000011。
2.6.6位运算符
按位异或(^)是指将参与运算的两个操作数对应的二进制位进行“异或”操作。当对应的两个二进制位中有一个为1,另一个为0时,结果位为1,否则结果位为0。以十进制8和4为例,8和4转换为二进制后分别是00001000和00000100。
2.6.6位运算符
按位取反(~)是指将二进制的每一位进行取反,0取反为1,1取反为0。按位取反操作首先会获取这个数的补码,然后对补码进行取反,最后将取反结果转换为原码,例如,对9按位取反的计算过程如下:
Python支持使用多个不同的运算符连接简单表达式,实现相对复杂的功能,为了避免含有多个运算符的表达式出现歧义,Python为每种运算符都设定了优先级。Python中运算符的优先级从高到低如下:
2.6.7运算符优先级 绝对温标又称开氏温标、热力学温标,是热力学和统计物理中的重要参数之一,也是国际单位制七个基本物理量之一。绝对温标的单位为开尔文(简称开,符号为K),绝对温标的零度对应我们日常使用的摄氏温度(单位为摄氏度,简称度,符号为℃)的-273.15℃。
本实例要求编写代码,实现将用户输入的摄氏温度转换为移绝对温标标识的开氏温度的功能。
2.7.2 健康指数
BMI指数即身体健康指数,它与人的体重和身高相关,是目前国际常用的衡量人体胖瘦程度以及是否健康的一个标准。已知BMI值的计算公式如下:
体质指数(BMI)= 体重(kg)÷身高^2(m)
本实例要求编写代码实现根据用户输入的身高体重计算BMI指数的功能。
本章主要介绍了Python基础知识,包括代码格式、标识符和关键字、变量和数据类型、数字类型以及运算符。本章比较简单易学,希望大家在初学Python时,结合精彩实例对该部分内容多加练习,为后期深入学习Python打好基础。
end
第3章 流程控制
· if语句
· if语句的嵌套
· 循环语句
· 循环嵌套
· 跳转语句
学习目标
现实生活中,大家在12306网站购票时需要先验证身份,验证通过后可进入购票页面,验证失败则需重新验证。在代码编写工作中,大家可以使用条件语句为程序增设条件,使程序产生分支,进而有选择地执行不同的语句。
3.1 条件语句
思考:
什么是流程控制?
3.1 .1 if语句
if语句由关键字if、判断条件和冒号组成,if语句和从属于该语句的代码段可组成选择结构。
3.1 .1 if语句
若if语句的判断条件成立(判断条件的布尔值为True),执行之后的代码段;若if语句的判断条件不成立(判断条件的布尔值为False),跳出选择结构,继续向下执行。
3.1 .1 if语句
一些场景不仅需要处理满足条件的情况,也需要对不满足条件的情况做特殊处理。因此,Python提供了可以同时处理满足和不满足条件的if-else语句,其格式如下:
3.1.2 if-else语句
执行if-else语句时,若判断条件成立,执行if语句之后的代码段1;若判断条件不成立,执行else语句之后的代码段2。
3.1.2 if-else语句
3.1.3 if-elif-else语句
Python除了提供单分支和双分支条件语句外,还提供多分支条件语句if-elif-else。多分支条件语句用于处理单分支和双分支无法处理的情况,其语法格式如下:
3.1.3 if-elif-else语句
执行if-elif-else语句时,若if条件成立,执行if语句之后的代码段1;若if条件不成立,判断elif语句的判断条件2:条件2成立则执行elif语句之后的代码段2,否则继续向下执行。以此类推,直至所有的判断条件均不成立,执行else语句之后的代码段。
3.1.4 if嵌套
Python中通过if嵌套可以实现程序中条件语句的嵌套逻辑。if嵌套的语法格式如下所示:
if 判断条件1: # 外层条件
代码段1
if 判断条件2: # 内层条件
代码段2
…
3.1.4 if嵌套
执行if嵌套时,若外层判断条件(判断条件1)的值为True,执行代码段1,并对内层判断条件(判断条件2)进行判断:若判断条件2的值为True,则执行代码段2,否则跳出内层条件结构,顺序执行外层条件结构中内层条件结构之后的代码;若外层判断条件的值为False,直接跳过条件语句,既不执行代码段1,也不执行内层的条件结构。 3.2.1 计算器
计算器极大地提高了人们进行数字计算的效率与准确性,无论是超市的收银台,还是集市的小摊位,都能够看到计算器的身影。计算器最基本的功能是四则运算。
本实例要求编写代码,实现计算器的四则运算功能。
3.2.2 猜数字
猜数字由两个人参与,一个人设置一个数字,一个人猜数字,当猜数字的人说出一个数字,由出数字的人告知是否猜中:若猜测的数字大于设置的数字,出数字的人提示“很遗憾,你猜大了”;若猜测的数字小于设置的数字时,出数字的人提示“很遗憾,你猜小了”;若猜数字的人在规定的次数内猜中设置的数字,出数字的人提示“恭喜,猜数成功”。
本实例要求编写代码,实现遵循上述规则的猜数字程序。 3.3.1while语句
while语句一般用于实现条件循环,该语句由关键字while、循环条件和冒号组成,while语句和从属于该语句的代码段组成循环结构。
3.3.2for语句
for语句一般用于实现遍历循环。遍历指逐一访问目标对象中的数据,例如逐个访问字符串中的字符;遍历循环指在循环中完成对目标对象的遍历。
3.3.3循环嵌套
循环之间可以互相嵌套,进而实现更为复杂的逻辑。循环嵌套按不同的循环语句可以划分为while循环嵌套和for循环嵌套。
3.3.3循环嵌套
while循环嵌套是指while语句中嵌套了while或for语句。以while语句中嵌套while语句为例。
3.3.3循环嵌套
for循环嵌套是指for语句中嵌套了while或for语句。以for语句中嵌套for语句为例。 3.4.1 猜数字
逢7拍手游戏的规则是:从1开始顺序数数,数到有7或者包含7的倍数的时候拍手。
本实例要求编写代码,模拟实现逢七拍手游戏,实现输出100以内需要拍手的数字的程序。
3.4.2 打印五子棋棋盘
五子棋是一种由双人对弈的纯策略型棋类游戏,它使用的棋盘一般由横纵等距的各15条平行线构成,这些线垂直交叉形成的225个交叉点为对弈双方的落子点。
本实例要求编写代码,实现按用户要求打印指定大小的五子棋棋盘的程序。 3.5.1break语句
break语句用于结束循环,若循环中使用了break语句,程序执行到break语句时会结束循环;若循环嵌套使用了break语句,程序执行到break语句时会结束本层循环。
3.5.2continue语句
continue语句用于在满足条件的情况下跳出本次循环,该语句通常也与if语句配合使用。
2.5 数字类型
2.2 标识符和关键字
2.3 变量和数据类型
2.4 精彩实例
2.1 良好的代码格式
3.6阶段案例——房贷计算器
房贷计算器是支付宝平台中搭载的一款在线计算工具,按用户选择的贷款类型(商业贷款、公积金贷款、组合贷款)、贷款金额(万)、期限(年)、利率(%)可计算得出每月月供参考(元)、支付利息(元)、还款总额(元)这些信息。
3.6阶段案例——房贷计算器
房贷计算公式如下:
每月月供参考 = 贷款金额 × [月利率 × (1 + 月利率) ^ 还款月数] ÷ { [(1 +月利率) ^ 还款月数] - 1}
还款总额 = 每月月供参考 × 期限 × 12
支付利息 = 还款总额 - 贷款金额 × 10000
以上计算方式中月利率(月利率=利率÷12)指以月为计息周期计算的利息。不同贷款类型的利率是不同的:对于商业贷款而言,五年以下(含五年)的贷款利率是4.75%,五年以上的贷款利率是4.90%;对于公积金贷款利率而言,五年以下(含五年)的贷款利率是2.75%,五年以上的利率是3.25%。
本案例要求编写程序,根据以上计算方式开发一个房贷计算器。
3.7本章小结
本章主要讲解了流程控制的相关知识,包括条件语句、循环语句、跳转语句,并结合众多精彩实例演示了如何利用各种语句实现流程控制。
通过本章的学习,希望读者能掌握程序的执行流程和流程控制语句的用法,为后续的学习打好扎实的基础。
第4章 字符串
· 字符串定义方式
· 字符串格式化
· 字符串常见操作
学习目标 思考:
什么是字符串?
4.1 字符串介绍
4.1 字符串介绍
字符串是一种用来表示文本的数据类型,它是由符号或者数值组成的一个连续序列。 Python支持使用单引号、双引号和三引号定义字符串,其中单引号和双引号通常用于定义单行字符串,三引号通常用于定义多行字符串。
4.1 字符串介绍
Python使用反斜杠“\”转义。例如,在字符串中的引号前添加“\”,此时Python解释器会将“\”之后的引号视为解释为一个普通字符,而非特殊符号。
4.1 字符串介绍
一些普通字符与反斜杠组合后将失去原有意义,产生新的含义。类似这样的由“\”和而成的、具有特殊意义的字符就是转义字符。转移字符通常用于表示一些无法显示的字符,例如空格、回车等等。
多学一招:转义字符 格式化字符串是指将指定的字符串转换为想要的格式。Python字符串可通过%格式符格式化输出。
4.2.1 使用%格式化字符串 字符串 真实数据
不同的占位符为不同类型的变量预留位置,常见的占位符如下所示。
4.2.1 使用%格式化字符串
虽然使用%可以对字符串进行格式化,但是这种方式并不是很直观,一旦开发人员遗漏了替换数据或选择了不匹配的格式符,就会导致字符串格式化失败。为了能更直观、便捷地格式化字符串,Python为字符串提供了一个格式化方法format()。
4.2.2 使用format()方法格式化字符串 字符串 真实数据
f-string提供了一种更为简洁的格式化字符串的方式,它在形式上以f或F引领字符串,在字符串中使用“{变量名}”标明被替换的真实数据和其所在位置。
4.2.3 使用f-string格式化字符串
十进制是实际应用中最常使用的计数方式,除此之外,还可以采用二进制、八进制或十六进制计数。
本实例要求编写代码,实现将用户输入的十进制整数转换为指定进制的功能。
4.3.1 进制转换
进度条一般以图形的方式显示已完成任务量和未完成任务量,并以动态文字的方式显示任务的完成度。
本实例要求编写程序,实现如图所示的文本进度条。
4.3.2 文本进度条
Python中提供了实现字符串查找操作的find()方法,该方法可查找字符串中是否包含子串,若包含则返回子串首次出现的位置,否则返回-1。
4.4.1 字符串的查找与替换
sub:指定要查找的子串。 start:开始索引,默认为0。 end:结束索引,默认为字符串的长度。
Python中提供了实现字符串替换操作的replace()方法,该方法可将当前字符串中的指定子串替换成新的子串,并返回替换后的新字符串。
4.4.1 字符串的查找与替换
old:被替换的旧子串。 new:替换旧子串的新子串。 count:表示替换旧字符串的次数,默认全部替换。
split()方法可以按照指定分隔符对字符串进行分割,该方法会返回由分割后的子串组成的列表。
4.4.2 字符串的分隔与拼接
sep:分隔符,默认为空字符。 maxsplit:分割次数,默认值为-1,
表示不限制分割次数。
join()方法使用指定的字符连接字符串并生成一个新的字符串。join()方法的语法格式如下。
4.4.2 字符串的分隔与拼接
iterable:表示连接字符串的字符
Python还可以使用运算符“+”拼接字符串。
4.4.2 字符串的分隔与拼接
“Py”
“thon”
+ “Python”
字符串中可能会包含一些无用的字符(如空格),在处理字符串之前往往需要先删除这些无用的字符。Python中的strip()、lstrip()和rstrip()方法可以删除字符串中的指定字符。
4.4.3 删除字符串的指定字符
在特定情况下会对英文单词的大小写形式进行要求,表示特殊简称时全字母大写,如CBA;表示月份、周日、节假日时每个单词首字母大写,如Monday。Python中支持字母大小写转换的方法有upper()、lower()、capitalize()和title()。
4.4.4 删除字符串的指定字符
在使用Word处理文档时可能需要对文档的格式进行调整,如标题居中显示、左对齐、右对齐等。Python提供了center()、ljust()、rjust()这3个方法来设置字符串的对齐方式。
4.4.5 字符串对齐
敏感词通常是指带有敏感政治倾向、暴力倾向、不健康色彩的词或不文明的词语,对于文章中出现的敏感词常用的处理方法是使用特殊符号(如“*”)对敏感词进行替换。
本实例要求编写代码,实现具有过滤敏感词功能的程序。
4.5.1 过滤敏感词
文字排版工具是一款强大的文章自动排版工具,它会将文字按现代汉语习惯及发表出版要求进行规范编排。文字排版工具一般具备删除空格、英文标点替换、英文单词大写功能,
本实例要求编写代码,实现具有上述功能的文字排版工具。
4.5.2 文字排版工具
4.6本章小结
本章主要讲解了Python字符串的相关知识,包括什么是字符串、格式化字符串、字符串的常见操作,并结合精彩实例演示了字符串的使用。
通过本章的学习,希望读者能够掌握字符串的使用。
第5章 组合数据类型
· 认识组合数据类型
· 列表
· 元组
· 集合
· 字典
· 组合数据类型与运算符
学习目标
Python中常用的序列类型有字符串、列表和元组。
Python中的序列支持双向索引:正向递增索引和反向递减索引正向递增索引从左向右依次递增,第一个元素的索引为0,第二个元素的索引为1,以此类推;反向递减索引从右向左依次递减,从右数第一个元素的索引为-1,第二个元素的索引为-2,以此类推。
5.1 认识组合数据类型
Python集合具备确定性、互异性和无序性三个特性。Python要求放入集合中的元素必须是不可变类型,Python中的整型、浮点型、字符串类型和元组属于不可变类型,列表、字典及集合本身都属于可变的数据类型。
5.1 认识组合数据类型
确定性:给定一个集合,那么任何一个元素是否在集合中就确定了。 互异性:集合中的元素互不相同。 无序性:集合中的元素没有顺序,顺序不同但元素相同的集合可视为同一集合。
映射类型以键值对的形式存储元素,键值对中的键与值之间存在映射关系。字典(dict)是Python唯一的内置映射类型,字典的键必须遵守以下两个原则: 5.1 认识组合数据类型
每个键只能对应一个值,不允许同一个键在字典中重复出现。 字典中的键是不可变类型。 Python列表的创建方式非常简单,既可以直接使用中括号“[]”创建,也可以使用内置的list()函数快速创建。
5.2.1 创建列表
在Python中,支持通过for…in…语句迭代获取数据的对象就是可迭代对象。目前,我们学习过可迭代的类型有字符串和列表,后续学习的集合、字典、文件也是可迭代类型的对象。使用isinstance()函数可以判断目标是否为可迭代对象,返回True表示为可迭代对象。
多学一招
列表中的元素可以通过索引或切片这两种方式进行访问,也可以在循环中依次访问。
5.2.2 访问列表元素
向列表中添加元素是非常常见的一种列表操作,Python提供了append()、extend()和insert()这几个方法。
5.2.3 添加列表元素 在列表末尾添加元素 在列表末尾添加另一个序列的所有元素 按照索引将元素插入列表的指定
位置
列表的排序是将元素按照某种规定进行排列。列表中常用的排序方法有sort()、reverse()、sorted()。
5.2.4 元素排序 有序的元素会覆盖原来的列表元素,不产生新列表 产生排序后的新列表,排序操作不会对原列表产生影响 逆置列表,即把原列表中的元素从右至左依次排列存放
删除列表元素的常用方式有del语句、remove()方法、pop()方法和clear()方法。
5.2.4 元素排序 有序的元素会覆盖原来的列表元素,不产生新列表 产生排序后的新列表,排序操作不会对原列表产生影响 逆置列表,即把原列表中的元素从右至左依次排列存放
删除列表元素的常用方式有del语句、remove()方法、pop()方法和clear()方法。
5.2.5 删除列表元素 删除列表中指定位置的元素 移除列表中匹配到的第一个元素
删除列表元素的常用方式有del语句、remove()方法、pop()方法和clear()方法。
5.2.5 删除列表元素 移除列表中的某个元素,若未指定具体元素,则移除列表中的最后一个元素 清空列表
列表推导式是符合Python语法规则的复合表达式,它用于以简洁的方式根据已有的列表构建满足特定需求的列表。列表推导式的基本格式如下:
5.2.6 列表推导式
[exp for x in list]
列表推导式还可以结合if判断语句或for循环嵌套,生成更灵活的列表。
带有if语句的列表推导式 for循环嵌套的列表推导式 带有if语句与for循环嵌套的列表推导式 元组的表现形式为一组包含在圆括号“()”中、由逗号分隔的元素,元组中元素的个数、类型不受限制。除了使用()构建元组外,还可以使用内置函数tuple()构建元组。
5.3 元组
t1 = () # 使用()构建元组 t2 = tuple() # 使用tuple构建元组
当使用圆括号“()”创建元组时,如果元组中只包含一个元素,那么需要在该元素的后面添加逗号,从而保证Python解释器能够识别其为元组类型。
5.3 元组
元组支持以索引和切片方式访问元组的元素,也支持在循环中遍历元组。
5.3 元组
tuple_demo = (‘p’,‘y’,‘t’, ‘h’, ‘o’,‘n’)
示例 为丰富校园文化生活,学校拟组织一场歌手大赛,从参赛选手中选拔出十名相对突出的学生,授予“校园十大歌手”称号。比赛之中设置有评委组,每名选手演唱完毕之后会由评委组的十名评委打分。为保证比赛公平公正,防止作弊和恶意打分,计算得分时会先去掉最高分和最低分,再计算平均分。
本实例要求编写程序,实现根据需求计算平均分的功能。 5.4.1 十大歌手
魔方阵又称纵横图,是一种n行n列、由自然数1~n×n组成的方阵,该方阵中的数符合以下规律:
\1. 方阵中的每个元素都不相等。
\2. 每行、每列以及主、副对角线上的个元素之和都相等。
本实例要求编写程序,输出一个5行5列的魔方阵。
5.4.2 神奇魔方阵 Python的集合(set)本身是可变类型,但Python要求放入集合中的元素必须是不可变类型。大括号“{}”或内置函数set()均可构建集合。
5.5 集合
s1 = {1} # 使用{}构建集合 s2 = set([1,2]) # 使用set构建元组
需要注意,使用{}不能创建空集合(不包含元素的{}创建的是字典变量),空集合只能利用set()函数创建。
5.5 集合
set_demo1 = {}
set_demo2 = set()
print(type(set_demo1))
print(type(set_demo2))
示例
集合是可变的,集合中的元素可以动态增加或删除。Python提供了一些内置方法来操作集合,常见内置方法如下:
5.5 集合
集合也可以利用推导式创建,集合推导式的格式与列表推导式相似,区别在于集合推导式外侧为大括号“{}”,具体如下:
5.5 集合
{exp for x in set if cond}
字典的表现形式为一组包含在大括号“{}”中的键值对,每个键值对为一个字典元素,每个元素通过逗号“,”分隔,每对键值通过“:”分隔,除了使用“{}”创建字典还可以使用内置函数dict创建字典。
5.6.1 创建字典
d1 = {‘A’: 123, 12: ‘python’} # 使用{}构建集合 d2 = dict({‘A’: ‘123’, ‘B’: ‘135’}) # 使用dict构建元组
字典的值可通过“键”或内置方法get()访问。
5.6.2 字典的访问
‘123’
‘135’
字典涉及的数据分为键、值和元素(键值对),除了直接利用键访问值外,Python还提供了内置方法keys()、values()和items()。
5.6.2 字典的访问
info.keys()
info.values()
dict_keys([‘name’, ‘age’, ‘height’])
info.items()
dict_values([‘Jack’, 23, 185])
dict_items([(‘name’, ‘Jack’), (‘age’, 23), (‘height’, 185)])
字典支持通过为指定的键赋值或使用update()方法添加或修改元素,下面分别介绍如何添加和修改字典元素。
5.6.3 元素的添加和修改
通过键添加元素:字典变量[键] = 值 使用update()添加元素:dict.update(key=value)
字典支持通过为指定的键赋值或使用update()方法添加或修改元素,下面分别介绍如何添加和修改字典元素。
5.6.3 元素的添加和修改
修改字典元素的本质是通过键获取值,再重新对元素进行赋值。修改元素的操作与添加元素的操作相同。
5.6.3 元素的添加和修改
Python支持通过pop()、popitem()和clear()方法删除字典中的元素。
5.6.4 字典元素的删除
pop():根据指定键值删除字典中的指定元素 popitem():随机删除字典中的元素 clear():清空字典中的元素
字典推导式外侧为大括号“{}”,且内部需包含键和值两部分,具体格式如下:
5.6.5 字典推导式
{new_key:new_value for key,value in dict.items()}
利用字典推导式可快速交换字典中的键和值,示例如下:
如今两年偶像选秀节目风头正盛,吸引了许多喜欢唱跳、有一颗明星梦想的少年少女参加,青春有你正是节目之一。青春有你采用计票机制,选手获得的票数越多,排名就越靠前。
本实例要求编写程序,接收选手的姓名和票数,输出排序后的成绩。
5.7.1 青春有你
通讯录是记录了联系人姓名和联系方式的名录,手机通讯录是最常见的通讯录之一,人们可以在通讯录中通过姓名查看相关联系人的联系方式等信息,也可以在其中新增联系人,或修改、删除联系人信息。
本实例要求编写程序,实现具备添加、查看、修改以及删除联系人信息功能的手机通讯录。
5.7.2 手机通讯录
Python中针对数字类型的运算符对组合数据类型同样适用,包括+、*、in、not in。
5.8 组合数据类型与运算
字符串、列表和元组使用“ + ”运算符,会对数据进行拼接 字符串、列表和元组使用“ * ”运算符,会对数据进行整数倍拼接 “in”“not in”运算符称为成员运算符,用于判断某个元素是否属于某个变量
本章首先带领大家简单认识了Python中的组合数据类型,然后分别介绍了Python中常用的组合数据类型:列表、元组、集合和字典的创建和使用,并结合实例帮助大家巩固这些数据类型,最后介绍了组合数据类型与运算符的相关知识。通过本章的学习,希望大家能掌握并熟练运用Python中的组合数据类型。
5.9 本章小结
第6章 函数
· 函数的定义和调用
· 函数参数的传递
· 函数的返回值
· 变量作用域
· 特殊形式的函数
学习目标 系统 函数是组织好的、实现单一功能或相关联功能的代码段。我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。
6.1 函数概述
print()
input()
6.1 函数概述
(a)未使用函数的程序
(b)使用函数的程序
结构清晰
代码精简
6.1 函数概述
程序若希望再打印一个边长为5个星号的正方形,应该如何解决呢?
6.1 函数概述
6.1 函数概述
函数式编程具有以下优点:
将程序模块化,既减少了冗余代码,又让程序结构更为清晰
提高开发人员的编程效率
方便后期的维护与扩展 前面使用的print()函数和input()都是Python的内置函数,这些函数由Python定义。开发人员也可以根据自己的需求定义函数,Python中使用关键字def来定义函数,其语法格式如下:
6.2.1 定义函数 标记函数的开始
函数的唯一标识 传入函数中的数据
可以包含一个或多个参数
也可以为空
标记函数体的开始 实现函数功能的具体代码
返回函数的处理结果给调用方
标志着函数的结束
若函数没有返回值,可以省略
例如,定义一个计算两个数之和的函数,代码如下:
6.2.1 定义函数 def add():
result = 11 + 22
print(result) def add_modify(a, b):
result = a + b
print(result)
无参函数
有参函数
函数在定义完成后不会立刻执行,直到被程序调用时才会执行。
语法格式如下:
6.2.2 调用函数
函数名([参数列表]) 调用过程
\1. 程序在调用函数的位置暂停执行。
\2. 将数据传递给函数参数。
\3. 执行函数体中的语句。
\4. 程序回到暂停处继续执行。
函数内部也可以调用其他函数,这被称为函数的嵌套调用。
6.2.2 调用函数 嵌套调用函数add()
函数在定义时可以在其内部嵌套定义另外一个函数,此时嵌套的函数称为外层函数,被嵌套的函数称为内层函数。
多学一招:函数的嵌套定义
内嵌函数
我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。
6.3 函数参数的传递
函数参数的传递可以分为位置参数传递、关键字参数传递、默认参数传递、参数的打包与解包以及混合传递。
6.3 函数参数的传递
函数在被调用时会将实参按照相应的位置依次传递给形参,也就是说将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。
6.3.1 位置参数的传递
def get_max(a, b):
if a > b:
print(a,“是较大的值!”)
else:
print(b,“是较大的值!”)
get_max(8, 5) 8是较大的值
关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
6.3.2 关键字参数的传递
def connect(ip, port):
print(f"设备{ip}:{port}连接!")
connect(ip=“127.0.0.1”, port=8080) 无论实参采用位置参数的方式传递,还是关键字参数的方式传递,每个形参都是有名称的,怎么区分用哪种方式传递呢?
6.3.2 关键字参数的传递
符号“/”
Python在3.8版本中新增了仅限位置形参的语法,使用符号“/”来限定部分形参只接收采用位置传递方式的实参。
6.3.2 关键字参数的传递
6.3.3 默认参数的传递
函数在定义时可以指定形参的默认值,如此在被调用时可以选择是否给带有默认值的形参传值,若没有给带有默认值的形参传值,则直接使用该形参的默认值。
6.3.4 参数的打包与解包
如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“*”或“**”:
“*” —— 接收以元组形式打包的多个值
“**”—— 接收以字典形式打包的多个值
6.3.4 参数的打包与解包
6.3.4 参数的打包与解包
6.3.4 参数的打包与解包
虽然函数中添加“”或“**”的形参可以是符合命名规范的任意名称,但这里建议使用args和**kwargs。
若函数没有接收到任何数据,参数*args和**kwargs为空,即它们为空元组或空字典。
6.3.4 参数的打包与解包
实参是元组 → 可以使用“*”拆分成多个值 → 按位置参数传给形参
实参是字典 → 可以使用“**” 拆分成多个键值对 → 按关键字参数传给形参
6.3.4 参数的打包与解包
6.3.4 参数的打包与解包
6.3.5 混合传递
前面介绍的参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的规则,具体规则如下。
优先按位置参数传递的方式。
然后按关键字参数传递的方式。
之后按默认参数传递的方式。
最后按打包传递的方式。
6.3.5 混合传递
在定义函数时:
带有默认值的参数必须位于普通参数之后。
带有“*”标识的参数必须位于带有默认值的参数之后。
带有“**”标识的参数必须位于带有“*”标识的参数之后。
6.3.5 混合传递 6.4 函数的返回值
函数中的return语句会在函数结束时将数据返回给程序,同时让程序回到函数被调用的位置继续执行。
6.4 函数的返回值
6.4 函数的返回值
如果函数使用return语句返回了多个值,那么这些值将被保存到元组中。
6.4 函数的返回值 6.5 变量作用域
变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。
6.5.1 局部变量和全局变量
根据作用域的不同,变量可以划分为局部变量和全局变量。
6.5.1 局部变量和全局变量
函数内部定义的变量,只能在函数内部被使用
函数执行结束之后局部变量会被释放,此时无法再进行访问。
6.5.1 局部变量和全局变量 6.5.1 局部变量和全局变量
不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们相互独立,互不影响。
6.5.1 局部变量和全局变量
全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响。
6.5.1 局部变量和全局变量
6.5.1 局部变量和全局变量
全局变量在函数内部只能被访问,而无法直接修改。
已经声明
没有找到
6.5.1 局部变量和全局变量
这是因为函数内部的变量number视为局部变量,而在执行“number+=1”这行代码之前并未声明过局部变量number。
多学一招:LEGB原则
LEGB是程序中搜索变量时所遵循的原则,该原则中的每个字母指代一种作用域,具体如下:
Python在搜索变量时会按照“L-E-G-B ”这个顺序依次在这四种区域中搜索变量:若搜索到变量则终止搜索,使用搜索到的变量;若搜索完L、E、G、B这四种区域仍无法找到变量,程序将抛出异常。
6.5.2 global和nonlocal关键字
函数内部无法直接修改全局变量或在嵌套函数的外层函数声明的变量,但可以使用global或nonlocal关键字修饰变量以间接修改以上变量。
使用global关键字可以将局部变量声明为全局变量,其使用方法如下:
global 变量
6.5.2 global和nonlocal关键字
使用nonlocal关键字可以在局部作用域中修改嵌套作用域中定义的变量,其使用方法如下:
nonlocal 变量
6.5.2 global和nonlocal关键字 6.8 精彩实例
系统
6.6.1 角谷猜想
以一个正整数n为例,如果n为偶数,就将它变为n/2,如果除后变为奇数,则将它乘3加1(即3n+1)。不断重复这样的运算,经过有限步后,必然会得到1。
本实例要求编写代码,计算用户输入的数据按照以上规律经多少次运算后可变为1。
6.6.2 饮品自动售货机
随着无人新零售经济的崛起,商场、车站、大厦等各种场所都引入了无人饮品自动售货机,方便人们选购自己想要的饮品。购买者选择想要的饮品,通过投币或扫码的方式支付,支付成功后从出货口取出饮品。
本实例要求编写代码,利用函数实现具有显示饮品信息、计算总额等功能的程序。
6.8 精彩实例
系统 6.7.1 递归函数
函数在定义时可以直接或间接地调用其他函数。若函数内部调用了自身,则这个函数被称为递归函数。
6.7.1 递归函数
递归函数在定义时需要满足两个基本条件:一个是递归公式,另一个是边界条件。其中:
递归公式是求解原问题或相似的子问题的结构;
边界条件是最小化的子问题,也是递归终止的条件。
6.7.1 递归函数
递归函数的执行可以分为以下两个阶段:
1.递推:递归本次的执行都基于上一次的运算结果。
2.回溯:遇到终止条件时,则沿着递推往回一级一级地把值返回来。
递归函数的一般定义格式如下所示:
def函数名([参数列表]):
if 边界条件:
rerun 结果
else:
return 递归公式
6.7.1 递归函数
6.7.1 递归函数
边界条件
递归公式
6.7.1 递归函数
6.7.2 匿名函数
匿名函数是一类无需定义标识符的函数,它与普通函数一样可以在程序的任何位置使用。Python中使用lambda关键字定义匿名函数,它的语法格式如下:
lambda <形式参数列表> :<表达式>
6.7.2 匿名函数
匿名函数与普通函数的主要区别如下:
普通函数在定义时有名称,而匿名函数没有名称;
普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式;
普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单;
普通函数能被其他程序使用,而匿名函数不能被其他程序使用。
6.7.2 匿名函数
定义好的匿名函数不能直接使用,最好使用一个变量保存它,以便后期可以随时使用这个函数。
系统 6.8 精彩实例
6.8.1 兔子数列
兔子一般在出生两个月之后就有了繁殖能力,每对兔子每月可以繁殖一对小兔子,假如所有的兔子都不会死,试问一年以后一共有多少对兔子?
本实例要求编写代码,利用递归实现根据月份计算兔子总数量的功能。
6.8.2 归并排序
先将待排序的序列划分成若干长度为1的子序列,依次将两个子序列排序后合并成长度为2的子序列;再依次将两个子序列排序后合并成长度为4的子序列,直至合并成最初长度的序列为止,得到一个排序后的序列。
本实例要求编写代码,利用递归实现归并排序算法。 6.8 精彩实例
系统
6.9 阶段案例——学生管理系统
本案例要求开发一个具有添加、删除、修改、查询学生信息及退出系统功能的简易版的学生管理系统,系统的功能菜单如图所示。
6.8 精彩实例
系统 本章主要讲解了函数的相关知识,包括函数概述、函数的定义和调用、函数参数的传递、函数的返回值、变量作用域、特殊形式的函数,此外本章结合精彩实例演示了函数的用法。通过本章的学习,希望读者能深刻地体会到函数的便捷之处,熟练地在实际开发中应用函数。
6.10 本章小结
第7章 文件与数据格式化
· 文件概述
· 文件的基本操作
· 文件与目录管理
· 数据维度
· 数据格式化
学习目标
7.1 文件概述
文件标识
文件标识的意义:找到计算机中唯一确定的文件。
文件标识的组成:文件路径、文件名主干、文件扩展名。
操作系统以文件为单位对数据进行管理。
7.1 文件概述
文件类型
根据数据的逻辑存储结构,人们将计算机中的文件分为文本文件和二进制文件。
文本文件:专门存储文本字符数据。
二进制文件:不能直接使用文字处理程序正常读写,必须先了解其结构和序列化规则,再设计正确的反序列化规则,才能正确获取文件信息。
二进制文件和文本文件这两种类型的划分基于数据逻辑存储结构而非物理存储结构,计算机中的数据在物理层面都以二进制形式存储。
多学一招:标准文件
标准文件
Python的sys模块中定义了3个标准文件,分别为:
stdin(标准输入文件)。标准输入文件对应输入设备,如键盘。
stdout(标准输出文件)。
stderr(标准错误文件)。标准输出文件和标准错误文件对应输出设备,如显示器。
在解释器中导入sys模块后,便可对标准文件进行操作。
多学一招:标准文件
标准文件
7.2 文件的基本操作
文件的打开、关闭与读写是文件的基础操作,任何更复杂的文件操作都离不开这些操作。
7.2.1 文件的打开与关闭
1.打开文件
内置函数open()用于打开文件,该方法的声明如下:
open(file, mode=‘r’, buffering=-1) file:文件的路径。
mode:设置文件的打开模式,取值有r、w、a。
buffering:设置访问文件的缓冲方式。取值为0或1。
【参数】
r:以只读方式打开文件(mode参数的默认值)。
w:以只写方式打开文件。
a:以追加方式打开文件。
b:以二进制形式打开文件。
+:以更新的方式打开文件(可读可写)
7.2.1 文件的打开与关闭
1.打开文件
7.2.1 文件的打开与关闭
1.打开文件
内置函数open()用于打开文件,该方法的声明如下:
open(file, mode=‘r’, buffering=-1) 若open()函数调用成功,返回一个文件对象。
【返回值】
7.2.1 文件的打开与关闭
1.打开文件
内置函数open()用于打开文件,该方法的声明如下:
open(file, mode=‘r’, buffering=-1) 若open()函数调用成功,返回一个文件对象。
若待打开的文件不存在,文件打开失败,程序会抛出异常,并打印错误信息。
【返回值】
7.2.1 文件的打开与关闭
2.关闭文件
Python可通过close()方法关闭文件,也可以使用with语句实现文件的自动关闭。
close()方法是文件对象的内置方法。
(1)close()方法
7.2.1 文件的打开与关闭
2.关闭文件
Python可通过close()方法关闭文件,也可以使用with语句实现文件的自动关闭。
with语句可预定义清理操作,以实现文件的自动关闭。
(2)with语句
为什么要及时关闭文件?
思考:为什么要及时关闭文件?
计算机中可打开的文件数量是有限
打开的文件占用系统资源
若程序因异常关闭,可能产生数据丢失
思考:为什么要及时关闭文件?
7.2.2 文件的读写
Python提供了一系列读写文件的方法,包括读取文件的read()、readline()、readlines()方法和写文件的write()、writelines()方法,下面结合这些方法分别介绍如何读写文件。
7.2.2 文件的读写
1.读取文件——read()方法
read()方法可以从指定文件中读取指定字节的数据,其语法格式如下:
read(n=-1)
7.2.2 文件的读写
1.读取文件——readline()方法
readline()方法可以从指定文件中读取一行数据,其语法格式如下:
readline()
7.2.2 文件的读写
1.读取文件——readline()方法
readlines()方法可以一次读取文件中的所有数据,若读取成功,该方法会返回一个列表,文件中的每一行对应列表中的一个元素。语法格式如下:
readlines(hint=-1)
参数hint的单位为字节,它用于控制要读取的行数
如果行中数据的总大小超出了hint字节,readlines()不会再读取更多的行。
7.2.2 文件的读写
1.读取文件
read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据
但因为计算机的内存是有限的,若文件较大,read()和readlines()的一次读取便会耗尽系统内存,所以这两种操作都不够安全。
为了保证读取安全,通常多次调用read()方法,每次读取size字节的数据。
7.2.2 文件的读写
2.写文件——write()方法
write()方法可以将指定字符串写入文件,其语法格式如下:
write(data)
以上格式中的参数data表示要写入文件的数据,若数据写入成功,write()方法会返回本次写入文件的数据的字节数。
7.2.2 文件的读写
2.写文件——writelines()方法
writelines()方法用于将行列表写入文件,其语法格式如下:
writelines(lines)
以上格式中的参数lines表示要写入文件中的数据,该参数可以是一个字符串或者字符串列表。
若写入文件的数据在文件中需要换行,需要显式指定换行符。
多学一招:字符与编码
文本文件支持多种编码方式,不同编码方式下字符与字节的对应关系不同,常见的编码方式以及字符与字节的对应关系如表所示。
7.2.3 文件的定位读写
7.2.2节使用read()方法读取了文件file.txt,结合代码与程序运行结果进行分析,可以发现read()方法第1次读取了2个字符,第2次从第3个字符“e”开始读取了剩余字符。
7.2.3 文件的定位读写
在文件的一次打开与关闭之间进行的读写操作是连续的,程序总是从上次读写的位置继续向下进行读写操作。
每个文件对象都有一个称为“文件读写位置”的属性,该属性会记录当前读写的位置。
文件读写位置默认为0,即在文件首部。
7.2.3 文件的定位读写
Python提供了一些获取与修改文件读写位置的方法,以实现文件的定位读写。
tell()。获取文件当前的读写位置。
seek()。控制文件的读写位置。
7.2.3 文件的定位读写
tell()方法用于获取文件当前的读写位置,以操作文件file.txt为例,tell()的用法如下:
1.tell()方法
7.2.3 文件的定位读写
Python提供了seek()方法,使用该方法可控制文件的读写位置,实现文件的随机读写。seek()方法的语法格式如下:
seek(offset, from)
offset:表示偏移量,即读写位置需要移动的字节数。
from:用于指定文件的读写位置,该参数的取值为0、1、2。
2.seek()方法
seek()方法调用成功后会返回当前读写位置。
7.2.3 文件的定位读写
Python提供了seek()方法,使用该方法可控制文件的读写位置,实现文件的随机读写。seek()方法的语法格式如下:
seek(offset, from)
2.seek()方法
7.2.3 文件的定位读写
需要注意的是,在Python3中,若打开的是文本文件,那么seek()方法只允许相对于文件开头移动文件位置,若在参数from值为1、2的情况下对文本文件进行位移操作,将会产生错误。
2.seek()方法
7.2.3 文件的定位读写
若要相对当前读写位置或文件末尾进行位移操作,需以二进制形式打开文件。
2.seek()方法
7.3 文件与目录管理
对于用户而言,文件和目录以不同的形式展现,但对计算机而言,目录是文件属性信息集合,它本质上也是一种文件。
7.3 文件与目录管理
os模块中定义了与文件操作相关的函数,利用这些函数可以实现删除文件、文件重命名、创建/删除目录、获取当前目录、更改默认目录与获取目录列表等操作。
管理文件与目录
删除文件——os.remove(文件名)
文件重命名——os.rename(原文件名,新文件名)
创建/删除目录——os.mkdir(目录名)/os.rmdir(目录名)
获取当前目录——os.getcwd()
更改默认目录——os.chdir(路径名)
获取目录列表——os.listdir(目录/路径)
7.3 文件与目录管理
7.4.1 信息安全策略——文件备份
本实例要求编写程序,实现一个具备备份文件与文件夹功能的备份工具。
7.4.2 用户账户管理
本实例要求编写程序,实现用户注册、登录、修改密码和注销功能(要求程序使用文件存储用户的账户信息)。
维度
从广义上讲,维度是与事物“有联系”的概念的数量,根据“有联系”的概念的数量,事物可分为不同维度。
7.5 数据维度与数据格式化
基于维度的数据分类
根据组织数据时与数据有联系的参数的数量,数据可分为一维数据、二维数据和多维数据。
具有对等关系的一组线性数据,如:
一维列表
一维元组
集合 一维数据
二维数据关联参数的数量为2,如:
矩阵
二维数组
二维列表
二维元组 二维数据
利用键值对等简单的二院关系展示数据间的复杂结构,如:
字典 多维数据
7.5.1 基于维度的数据分类
示例
成都,杭州,重庆,武汉,苏州,西安,天津,南京,郑州,长沙,沈阳,青岛,宁波,东莞,无锡
一维数据
二维数据
7.5.1 基于维度的数据分类
示例
“高三一班考试成绩”:[
{“姓名”: “刘婧”,
“语文”: “124”,
“数学”: “137”,
“英语”: “145”,
“理综”: “260” };
{“姓名”: “张华”,
“语文”: “116”,
“数学”: “143”,
“英语”: “139”,
“理综”: “263” };
……
] 多维数据
7.5.1 基于维度的数据分类
一二维数据的存储与读写
一维数据呈线性排列,一般用特殊字符分隔,例如:
使用空格分隔:成都 杭州 重庆 武汉 苏州 西安 天津
使用逗号分隔:成都,杭州,重庆,武汉,苏州,西安,天津
使用&分隔:成都&杭州&重庆&武汉&苏州&西安&天津
1.数据存储
一维数据的存储需要注意以下几点:
同一文件或同组文件一般使用同一分隔符分隔。
分隔数据的分隔符不应出现在数据中。
分隔符为英文半角符号,一般不使用中文符号作为分隔符。
7.5.2 一二维数据的存储与读写
一二维数据的存储与读写
二维数据可视为多条一维数据的集合,当二维数据只有一个元素时,这个二维数据就是一维数据。
CSV(Commae-Separeted Values,逗号分隔值)是国际上通用的一二维数据存储格式。
1.数据存储
CSV格式规范:
以纯文本形式存储表格数据
文件的每一行对应表格中的一条数据记录
每条记录由一个或多个字段组成
字段之间使用逗号(英文、半角)分隔
7.5.2 一二维数据的存储与读写
一二维数据的存储与读写
1.数据存储
CSV也称字符分隔值,具体示例如下:
姓名,语文,数学,英语,理综
刘婧,124,137,145,260
张华,116,143,139,263
邢昭林,120,130,148,255
鞠依依,115,145,131,240
黄丽萍,123,108,121,235
赵越,132,100,112,210
7.5.2 一二维数据的存储与读写
一二维数据的存储与读写
2.数据读取
Windows平台中CSV文件的后缀名为.csv,可通过Office Excel或记事本打开
Python在程序中读取.csv文件后会以二维列表形式存储其中内容
示例
csv_file = open(‘score.csv’)
lines = []
for line in csv_file:
line = line.replace(‘\n’,‘’)
lines.append(line.split(‘,’))
print(lines)
csv_file.close() 7.5.2 一二维数据的存储与读写
一二维数据的存储与读写
3.数据写入
将一、二维数据写入文件中,即按照数据的组织形式,在文件中添加新的数据。
示例:在保存学生成绩的文件score.csv中写入每名学生的总分。
7.5.2 一二维数据的存储与读写
多维数据的格式化
为了直观地表示多维数据,也为了便于组织和操作,三维及以上的多维数据统一采用键值对的形式进行格式化。
网络平台上传递的数据大多是高维数据,JSON是网络中常见的高维数据格式。JSON格式的数据遵循以下语法规则:
数据存储在键值对(key:value)中,例如“姓名”: “张华”。
数据的字段由逗号分隔,例如“姓名”: “张华”, “语文”: “116”。
一个花括号保存一个JSON对象,例如{“姓名”: “张华”, “语文”: “116”}。
一个方括号保存一个数组,例如[{“姓名”: “张华”, “语文”: “116”}]。
7.5.3 多维数据的格式化
示例:
“高三二班考试成绩”:[
{“姓名”: “陈诚”,
“语文”: “124”,
“数学”: “127”,
“英语”: “145”,
“理综”: “259” };
{“姓名”: “黄思”,
“语文”: “116”,
“数学”: “143”,
“英语”: “119”,
“理综”: “273” };
……
]
7.5.3 多维数据的格式化
示例:将学生成绩以XML格式存储
<高三二班考试成绩>
<姓名>陈诚</姓名><语文>124</语文><数学>127<数学/><英语>145<英语/><理综>259<理综/>
<姓名>黄思</姓名><语文>116</语文><数学>143<数学/><英语>119<英语/><理综>273<理综/>
……
</高三二班考试成绩>
7.5.3 多维数据的格式化
JSON模块——json
利用json模块的dumps()函数和loads()函数可以实现Python对象和JSON数据之间的转换,这两个函数的具体功能如表所示。
7.5.3 多维数据的格式化
Python对象与JSON数据转化时的类型对照表
7.5.3 多维数据的格式化
1.dumps()函数
示例:使用dumps()函数对Python对象进行转码。
>>> import json
>>> pyobj = [[1, 2, 3], 345, 23.12, ‘qwe’, {‘key1’:(1,2,3), ‘key2’:(2,3,4)}, True, False, None]
>>> jsonstr = json.dumps(pyobj)
>>> print(jsonstr)
>>> [[1, 2, 3], 345, 23.12, “qwe”, {“key1”: [1, 2, 3], “key2”: [2, 3, 4]}, true, false, null] 7.5.3 多维数据的格式化
2.loads()函数
示例:使用loads()函数将JSON数据转换为符合Python语法要求的数据类型。
>>> import json
>>> jsonstr = [[1, 2, 3], 345, 23.12, “qwe”, {“key1”: [1, 2, 3], “key2”: [2, 3, 4]}, true, false, null]
>>> pydata = json.loads(jsonstr)
>>> print(pydata)
[[1, 2, 3], 345, 23.12, ‘qwe’, {‘key1’: [1, 2, 3], ‘key2’: [2, 3, 4]}, True, False, None] 7.5.3 多维数据的格式化
本章主要介绍了文件与数据格式化相关的知识,包括计算机中文件的定义、文件的基本操作、文件与目录管理、数据维度与数据格式化。通过本章的学习,希望读者能了解计算机中文件的意义、熟练地读取和管理文件,并掌握常见的数据组织形式。
7.6 本章小结
第8章 面向对象
· 面向对象概述
· 类与对象
· 类的成员
· 构造方法和析构方法
· 封装、继承、多态
· 运算符重载
学习目标
面向对象是程序开发领域的重要思想,这种思想模拟了人类认识客观世界的思维方式,将开发中遇到的事物皆看作对象。
8.1 面向对象概述
面向过程
面向对象
分析解决问题的步骤
使用函数实现每个步骤的功能
按步骤依次调用函数
分析问题,从中提炼出多个对象
将不同对象各自的特征和行为进行封装
通过控制对象的行为来解决问题。
8.1 面向对象概述 分别使用面向过程和面向对象来实现五子棋
8.1 面向对象概述 五子棋游戏——对象特征与行为
8.1 面向对象概述 五子棋游戏——对象特征与行为
8.1 面向对象概述
若加入悔棋功能,面向过程和面向对象,分别怎么实现呢?
8.1 面向对象概述
更简便!
8.1 面向对象概述
8.2 类的定义与使用
面向对象编程有两个非常重要的概念:类和对象。
对象映射现实中真实存在的事物,如一本书。
具有相同特征和行为的事物的集合统称为类。
对象是根据类创建的,一个类可以对应多个对象。
类是对象的抽象,对象是类的实例。
8.2.1 类的定义
类是由3部分组成的:
类的名称:大驼峰命名法,首字母一般大写,比如Person。
类的属性:用于描述事物的特征,比如性别。
类的方法:用于描述事物的行为,比如抬腿。
8.2.1 类的定义
class 类名:
属性名 = 属性值
def 方法名(self):
方法体 语法格式
8.2.1 类的定义
class 类名:
属性名 = 属性值
def 方法名(self):
方法体 语法格式
class Car:
wheels = 4 # 属性
def drive(self): # 方法
print(‘行驶’) 示例
8.2.2 对象的创建与使用
根据类创建对象的语法格式如下:
使用对象的本质是访问对象成员:
car = Car()
car.wheels
car.drive
8.3.1 属性
属性按声明的方式可以分为两类:类属性和实例属性。
8.3.1 属性
1.类属性
声明在类内部、方法外部的属性。
可以通过类或对象进行访问,但只能通过类进行修改。
4
4
3
3
3
4
car对象不能修改类属性的值 为什么对象访问的属性值为4?
8.3.1 属性
2.实例属性
实例属性是在方法内部声明的属性。
Python支持动态添加实例属性。
(1)访问实例属性——只能通过对象访问
8.3.1 属性
2.实例属性
实例属性是在方法内部声明的属性。
Python支持动态添加实例属性。
(2)修改实例属性——通过对象修改
8.3.1 属性
2.实例属性
实例属性是在方法内部声明的属性。
Python支持动态添加实例属性。
(3)动态添加实例属性——类外部使用对象动态添加实例属性
8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
1.实例方法
形似函数,但它定义在类内部。
以self为第一个形参,self参数代表对象本身
只能通过对象调用 8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
2.类方法
类方法是定义在类内部
使用装饰器@classmethod修饰的方法
第一个参数为cls,代表类本身
可以通过类和对象调用
car.stop() # 通过对象调用类方法
Car.stop() # 通过类调用类方法
8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
2.类方法
类方法中可以使用cls访问和修改类属性的值
3 4
8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
2.静态方法
静态方法是定义在类内部
使用装饰器@staticmethod修饰的方法
没有任何默认参数
8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
2.静态方法
静态方法可以通过类和对象调用
8.3.2 方法
Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
2.静态方法
静态方法内部不能直接访问属性或方法,但可以使用类名访问类属性或调用类方法,
8.3.3 私有成员
类的成员默认是公有成员,可以在类的外部通过类或对象随意地访问,这样显然不够安全。
为了保证类中数据的安全,Python支持将公有成员改为私有成员,在一定程度上限制在类的外部对类成员的访问。
8.3.3 私有成员
Python通过在类成员的名称前面添加双下画线(__)的方式来表示私有成员,语法格式如下:
__属性名
__方法名 8.3.3 私有成员
私有成员在类的内部可以直接访问,在类的外部不能直接访问,但可以通过调用类的公有成员方法的方式进行访问。
8.4 特殊方法
除了8.3节介绍的方法之外,类中还包括两个特殊的方法:构造方法和析构方法,这两个方法都是系统内置方法。
构造方法指的是__init__()方法。
创建对象时系统自动调用,从而实现对象的初始化。
每个类默认都有一个__init__()方法,可以在类中显式定义__init__()方法。
init()方法可以分为无参构造方法和有参构造方法。
当使用无参构造方法创建对象时,所有对象的属性都有相同的初始值。
当使用有参构造方法创建对象时,对象的属性可以有不同的初始值。
8.4.1 构造方法
8.4.1 构造方法
8.4.1 构造方法
析构方法(即__del__()方法)是销毁对象时系统自动调用的方法
每个类默认都有一个__del__()方法,可以显式定义析构方法
8.4.2 析构方法
与文件类似,每个对象都会占用系统的一块内存,使用之后若不及时销毁,会浪费系统资源。那么对象什么时候销毁呢?
多学一招:销毁对象
Python通过引用计数器记录所有对象的引用(可以理解为对象所占内存的别名)数量,一旦某个对象的引用计数器的值为0,系统就会销毁这个对象,收回对象所占用的内存空间。
多学一招:销毁对象
本实例要求编写代码,实现一个基于面向对象思想的、具有添加、删除、修改、查找联系人信息,以及查看所有联系人的信息功能的通讯录程序。
8.5.1 通讯录
本实例要求编写代码,实现一个基于面向对象思想的、具有背单词、添加新单词、删除单词、查找单词以及清空、退出生词本功能的生词本程序。
8.5.2 生词本
封装是面向对象的重要特性之一,它的基本思想是对外隐藏类的细节,提供用于访问类成员的公开接口。
如此,类的外部无需知道类的实现细节,只需要使用公开接口便可访问类的内容,这在一定程度上保证了类内数据的安全。
8.6 封装
为了契合封装思想,我们在定义类时需要满足以下两点要求。
1.将类属性声明为私有属性。
2.添加两类供外界调用的公有方法,分别用于设置或获取私有属性的值。
8.6 封装
8.6 封装
继承是面向对象的重要特性之一,它主要用于描述类与类之间的关系,在不改变原有类的基础上扩展原有类的功能。
若类与类之间具有继承关系,被继承的类称为父类或基类,继承其他类的类称为子类或派生类,子类会自动拥有父类的公有成员。
8.7 继承
单继承即子类只继承一个父类。现实生活中,波斯猫、折耳猫、短毛猫都属于猫类,它们之间存在的继承关系即为单继承,如图所示。
8.7.1 单继承
Python中单继承的语法格式如下所示:
class 子类名(父类名):
子类继承父类的同时会自动拥有父类的公有成员。
自定义类默认继承基类object。
8.7.1 单继承
子类不会拥有父类的私有成员,也不能访问父类的私有成员。
8.7 继承
8.7.1 单继承
AttributeError: ‘ScottishFold’ object has no attribute ‘__age’
AttributeError: ‘ScottishFold’ object has no attribute ‘__test’
程序中的一个类也可以继承多个类,如此子类具有多个父类,也自动拥有所有父类的公有成员。
8.7.2 多继承
Python中多继承的语法格式如下所示:
class 子类名(父类名1, 父类名2, …):
8.7.2 多继承
如果House类和Car类中有一个同名的方法,那么子类会调用哪个父类的同名方法呢?
8.7.2 多继承
如果子类继承的多个父类是平行关系的类,那么子类先继承哪个类,便会先调用哪个类的方法。
8.7.2 多继承
子类会原封不动地继承父类的方法,但子类有时需要按照自己的需求对继承来的方法进行调整,也就是在子类中重写从父类继承来的方法。
8.7.3 重写
在子类中定义与父类方法同名的方法,在方法中按照子类需求重新编写功能代码即可。
8.7.3 重写
子类重写了父类的方法之后,无法直接访问父类的同名方法,但可以使用super()函数间接调用父类中被重写的方法。
8.7.3 重写
多态是面向对象的重要特性之一,它的直接表现即让不同类的同一功能可以通过同一个接口调用,表现出不同的行为。
8.8 多态
8.8 多态
运算符重载是指赋予内置运算符新的功能,使内置运算符能适应更多的数据类型。
8.9 运算符重载
基类object中提供的一些特殊方法及其对应的运算符如表所示。
8.9 运算符重载
如果类中重写了Python基类object内置的有关运算符的特殊方法,那么该特殊方法对应的运算符将支持对该类的实例进行运算。
8.9 运算符重载
猜拳游戏一般包含三种手势:石头、剪刀、布,判定规则为石头胜剪刀,剪刀胜布,布胜石头。本实例要求编写代码,实现基于面向对象思想的人机猜拳游戏。
8.10.1 人机猜拳游戏
为使列表支持四则运算,我们可以自定义一个列表类,在其中重载运算符,列表中各元素分别与数值相加、相减、相乘或相除后所得的结果组成该列表的新元素。本实例要求编写代码,重载运算符,使列表支持四则运算。
8.10.2 自定义列表
本案例要求编写程序,实现一个基于面向思想的、具有开户、查询、取款、存款、转账、锁定、解锁和退出功能的银行管理系统。 本章主要讲解了面向对象的相关知识,包括面向对象概述、类的定义和使用、类的成员、特殊方法、封装、继承、多态、运算符重载,并结合众多精彩实例演示了面向对象的编程技巧。通过本章的学习,希望读者能理解面向对象的思想与特性,掌握面向对象的编程技巧,为以后的开发奠定扎实的面向对象编程基础。
8.12 本章小结
第9章 异常
· 异常的概念和类型
· 捕获异常的方式
· raise语句和assert语句
· 异常传递
· 自定义异常
学习目标 程序开发或运行时可能出现异常,开发人员和运维人员需要辨别程序的异常,明确这些异常是源于程序本身的设计问题,还是由外界环境的变化引起,以便有针对性地处理异常。
9.1 异常概述
程序运行出现异常时,若程序中没有设置异常处理功能,解释器会采用系统的默认方式处理异常,即返回异常信息、终止程序。
9.1.1 认识异常
异常信息中通常包含异常代码所在行号、异常的类型和异常的描述信息。
9.1 异常概述
9.1.2 异常的类型
Python程序运行出错时产生的每个异常类型都对应一个类,程序运行时出现的异常大多继承自Exception类,Exception类又继承了异常类的基类BaseException。
所有异常类型的父类
用户中断执行时会产生的异常
生成器退出异常
内置的、非系统退出的异常的基类
Python解释器退出异常
\1. NameError NameError是程序中使用了未定义的变量时会引发的异常。
例如,访问一个未声明过的变量test,代码如下:
8.1 面向对象概述
\2. IndexError IndexError是程序越界访问时会引发的异常。
例如,使用索引0访问空列表num_list,代码如下:
8.1 面向对象概述
\3. AttributeError AttributeError是使用对象访问不存在的属性时引发的异常。
例如,Car类中动态地添加了两个属性color和brand,使用Car类的对象依次访问color、brand属性及不存在的name属性,代码如下:
8.1 面向对象概述
\4. FileNotFoundError FileNotFoundError是未找到指定文件或目录时引发的异常。
例如,打开一个本地不存在的文件,代码如下:
8.1 面向对象概述
Python既可以直接通过try-except语句实现简单的异常捕获与处理的功能,也可以将try-except语句与else或finally子句组合实现更强大的异常捕获与处理的功能。
9.2 异常捕获语句
9.2.1 使用try-except语句捕获异常
try:
可能出错的代码
except [异常类型 [as error]]: # 将捕获到的异常对象赋error
捕获异常后的处理代码 语法格式
try-except语句的语法格式如下:
9.2.1 使用try-except语句捕获异常
try-except语句可以捕获与处理程序的单个、多个或全部异常。
单个异常类型 9.2.1 使用try-except语句捕获异常
try-except语句可以捕获与处理程序的单个、多个或全部异常。
9.2.1 使用try-except语句捕获异常
try-except语句可以捕获与处理程序的单个、多个或全部异常。
多个异常类型 9.2.1 使用try-except语句捕获异常
try-except语句可以捕获与处理程序的单个、多个或全部异常。
异常类型设置为Exception或省略不写 9.2.2 异常结构中的else子句
try:
可能出错的代码
except [异常类型 [as error]]: # 将捕获到的异常对象赋值error
捕获异常后的处理代码
else:
未捕获异常后的处理代码 语法格式
else子句可以与try-except语句组合成try-except-else结构,若try监控的代码没有异常,程序会执行else子句后的代码。
9.2.2 异常结构中的else子句
else子句可以与try-except语句组合成try-except-else结构,若try监控的代码没有异常,程序会执行else子句后的代码。
9.2.3 异常结构中的finally子句
try:
可能出错的代码
except [异常类型 [as error]]: # 将捕获到的异常对象赋值error
捕获异常后的处理代码
finally:
一定执行的代码 语法格式
finally子句可以和try-except一起使用,语法格式如下:
9.2.3 异常结构中的finally子句
无论try子句监控的代码是否产生异常,finally子句都会被执行
finally子句多用于预设资源的清理操作,如关闭文件、关闭网络连接
Python程序中的异常不仅可以自动触发异常,而且还可以由开发人员使用raise和assert语句主动抛出异常。
9.3 抛出异常
使用raise语句可以显式地抛出异常,reise语句的语法格式如下:
9.3.1 使用raise语句抛出异常
使用raise语句可以显式地抛出异常,reise语句的语法格式如下:
9.3.1 使用raise语句抛出异常 创建异常类对象
使用raise语句可以显式地抛出异常,reise语句的语法格式如下:
9.3.1 使用raise语句抛出异常 指定异常的具体信息
使用raise语句可以显式地抛出异常,reise语句的语法格式如下:
9.3.1 使用raise语句抛出异常
assert语句又称为断言语句,其语法格式如下所示:
9.3.2 使用assert语句抛出异常
9.3.2 使用assert语句抛出异常
如果程序中的异常没有被处理,默认情况下会将该异常传递到上一级,如果上一级仍然没有处理异常,那么会继续向上传递,直至异常被处理或程序崩溃。
9.3.3 异常的传递
有时我们需要自定义异常类,以满足当前程序的需求。自定义异常的方法比较简单,只需要创建一个继承Exception类或Exception子类的类(类名一般以“Error”为结尾)即可。
9.4 自定义异常
9.4 自定义异常
假设某网站只允许用户上传jpg、png和jpeg格式的文件,本实例要求编写代码,通过异常捕获语句实现用户上传头像格式检测的功能。
9.5.1 头像格式检测
用户在进行网购时,需要同时选择商品及数量,只有输入的商品数量不小于1才符合规则,小于1则提示错误信息并设为默认值1。
本实例要求编写代码,实现具有检测商品数量是否符合规则的程序。
9.5.2 商品与数量检测
本章主要讲解了Python异常的相关知识,包括异常概述、异常捕获语句、抛出异常和自定义异常,同时结合精彩实例演示了异常的用法。通过本章的学习,希望大家掌握如何处理异常。
9.6 本章小结
第10章 Python计算生态
· Python计算生态
· 各应用领域的常用库
· time库、random库
· turtle库
· jieba库、wordcloud库
· pygame库
学习目标 Python计算生态涵盖网络爬虫、数据分析、文本处理、数据可视化、图形用户界面、机器学习、Web开发、网络应用开发、游戏开发、虚拟现实、图形艺术等多个领域,为各个领域的Python使用者提供了极大便利。
10.1 Python计算生态概述
网络爬虫是一种按照一定的规则,自动从网络上抓取信息的程序或者脚本。通过网络爬虫可以代替手工完成很多工作。
10.1 Python计算生态概述
网络爬虫程序涉及HTTP请求、Web信息提取、网页数据解析等操作,Python计算生态通过Requests、Python-Goose、Re、Beautiful Soup、Scrapy和PySpider等库为这些操作提供了强有力的支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
数据分析指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总、理解与消化,以求最大化地发挥数据的作用。
10.1 Python计算生态概述
Python计算生态通过Numpy、Pandas、SciPy库为数据分析领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
文本指书面语言的表现形式,从文学角度说,文本是具有完整、系统含义的一个句子或多个句子的组合。
文本处理即对文本内容的处理,包括文本内容的分类、文本特征的提取、文本内容的转换等等。
10.1 Python计算生态概述
Python计算生态通过Jieba、PyPDF2、Python-docx、NLTK等库为文本处理领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
数据可视化是一门关于数据视觉表现形式的科学技术研究,它既要有效传达数据信息,也需兼顾信息传达的美学形式,二者缺一不可。
10.1 Python计算生态概述
Python计算生态主要通过Matplotlib、Seaborn、Mayavi等库为数据可视化领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
机器学习是一门涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科的多领域交叉学科,该学科旨在研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能、重新组织已有知识结构并不断改善自身。机器学习是人工智能的核心,是使计算机具有智能的根本途径。
10.1 Python计算生态概述
Python计算生态主要通过Scikit-learn、TensorFlow、MXNet库为机器学习领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
图形用户界面(Graphical User Interface,简称GUI)指采用图形方式显示的计算机操作用户界面,该界面允许用户使用鼠标、键盘等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行一些其他的日常任务。
10.1 Python计算生态概述
Python计算生态通过PyQt5、WxPython、PyGObject库为图形用户界面领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
Web开发指基于浏览器而非桌面进行的程序开发。
10.1 Python计算生态概述
Python计算生态通过Django、Tornado、Flask、Twisted等库为Web开发领域提供了支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
网络应用开发指以网络为基础的应用程序的开发。
10.1 Python计算生态概述
Python计算生态通过WeRoBot、aip、MyQR等库为网络应用开发领域提供支持,这些库各自的功能如表所示。
10.1 Python计算生态概述
Python计算生态通过PyGame、Panda3D库为游戏开发领域提供支持,这些库各自的说明如表所示。
10.1 Python计算生态概述
图形艺术是一种通过标志来表现意义的艺术。标志是一些单纯、显著、易识别的具有指代性或具有表达意义、情感和指令等作用的物象、图形或文字符号,也是图形艺术的表现手段。
10.1 Python计算生态概述
Python计算生态通过Quads、ascii_art和turtle库为图形艺术领域提供支持,这些库各自的说明如表所示。
10.1 Python计算生态概述
图像处理一般指数字图像(数字图像是指用工业相机、摄像机和扫描仪等设备经过拍摄得到的一个大的二维数组,这个数组的元素称为像素,其值称为灰度值)处理,图像处理技术一般包括图像压缩、增强和复原、图像匹配、描述和识别。
10.1 Python计算生态概述
Python通过Numpy、Scipy、Pillow、OpenCV-Python等库为图像处理领域提供支持,这些库各自的说明如表所示。
10.1 Python计算生态概述 库是Python中常常提及的概念,但事实上Python中的库只是一种对特定功能集合的统一说法而非严格定义。Python库的具体表现形式为模块(Module)和包(Package),下面分这两部分介绍Python库的构建与使用,并介绍如何发布第三方库。
10.2Python生态库的构建与发布
Python模块本质上是一个包含Python代码片段的.py文件,模块名就是文件名。那么创建一个.py文件,在其中编写功能代码并保存,便可构建一个模块。
10.2.1 模块的构建与使用
导入模块:
import 模块名
from … import …
10.2.1 模块的构建与使用
将模块放入一个文件夹,并在该文件夹中创建__init__.py文件,就构建了一个Python包。
简单地说,Python中的包就是以目录形式组织起来的、具有层级关系的多个模块。
Python包中可以包含子包,包结构示例如图所示。
10.2.2 包的构建与导入
此时若想在当前程序中导入以上包中的模块module_a,使用的导入语句如下:
import package.package_a.module_a # 方式一
from package.package_a import module_a # 方式二
Python中的第三方库是由Python使用者自行编写与发布的模块或包,同样的,我们也可以将自己编写的模块与包作为库发布。具体步骤如下:
10.2.3 库的发布
1.在与待发布的包同级的目录中创建setup.py文件。
2.编辑setup.py文件,在该文件中设置包中包含的模块。
3.在setup.py文件所在目录下打开命令行,使用python setup.py build命令构建Python库。
4.在setup.py文件所在目录下打开命令行,使用python setup.py sdist命令创建库的安装包。 10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
time()函数
time()函数返回以浮点数表示的从世界标准时间的1970年1月1日00:00:00开始到现在的总秒数,也就是时间戳。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
localtime()与gmtime()函数
localtime()函数和gmtime()函数都可将时间戳转换为以元组表示的时间对象(struct_time),localtime()得到的是当地时间,gmtime()得到的是世界统一时间(Coordinated Universal Time,简称UTC),它们的语法格式如下:
localtime([secs])
gmtime([secs])
参数secs是一个表示时间戳的浮点数,若不提供该参数,默认以time()函数获取的时间戳作为参数。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
localtime()与gmtime()函数
localtime()函数和gmtime()函数都可将时间戳转换为以元组表示的时间对象(struct_time),localtime()得到的是当地时间,gmtime()得到的是世界统一时间(Coordinated Universal Time,简称UTC),它们的语法格式如下:
localtime([secs])
gmtime([secs])
参数secs是一个表示时间戳的浮点数,若不提供该参数,默认以time()函数获取的时间戳作为参数。
10.3.1 time库
struct_time元组元素的含义与取值
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
strftime()和asctime()函数
strftime()函数借助时间格式控制符来输出格式化的时间字符串,该函数的语法格式如下:
strftime(format[, t])
参数format是指代时间格式的字符串。
参数t为struct_time对象,默认为当前时间,即localtime()函数返回的时间,该参数可以省略。
10.3.1 time库
时间格式控制符
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
strftime()和asctime()函数
asctime()函数同样用于输出格式化的时间字符串,但它只将struct_time对象转化为Sat Jan 13 21:56:34 2018’这种形式。asctime()函数的语法格式如下:
asctime([t])
以上格式中的参数t与和strftime()函数的参数t意义相同。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
ctime()函数
ctime()函数用于将一个时间戳(以秒为单位的浮点数)转换为’Sat Jan 13 21:56:34 2018’这种形式(结果同time.asctime()),若该函数未接收到参数,则默认以time.time()作为参数。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
strptime()函数
strptime()函数用于将格式化的时间字符串转化为struct_time,该函数是strftime()函数的反向操作。strptime()函数的语法格式如下:
strptime(string, format)
以上格式中的参数string表示格式化的时间字符串,format表示时间字符串的格式,string与format必须统一。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
sleep()函数
sleep()函数可让调用该函数的程序进入睡眠态,即让其暂时挂起,等待一定时间后再继续执行。sleep()函数接收一个以秒为单位的浮点数作为参数,使用该参数控制进程或线程挂起的时长。
10.3.1 time库
time库
time是最基础的时间处理库,该库本质上是一个模块,它包含的所有内容都定义在time.py文件中。该库中定义了time()、strftime()、localtime()、sleep()和一些用于实现时间格式转换的函数。
时间计算
时间计算通常指时间的加减,时间可以时间戳形式进行加减运算。若要对非时间戳形式表示的时间进行计算,在计算之前可以先将其转换为时间戳形式。各形式之间的转换方式如图所示。
10.3.2 random库
random是Python内置的标准库,在程序中导入该库,可利用库中的函数生成随机数据。random库中常用的函数如表所示。
10.3.3 turtle库
turle绘图模块
turtle(海龟)是Python内置的一个标准模块,它提供了绘制线、圆以及其它形状的函数,使用该模块可以创建图形窗口,在图形窗口中通过简单重复动作直观地绘制界面与图形。
创建窗口
设置画布
绘制图形
turtle的使用主要分为以下三个方面:
10.3.3 turtle库
创建窗口
图形窗口也称为画布(canas)。
控制台无法绘制图形,使用turtle模块绘制图形化界面,需要先使用setup()函数创建图形窗口。
turtle.setup(width, height, startx=None, starty=None) width: 窗口宽度
height: 窗口高度
startx:窗口在计算机屏幕上的横坐标
starty:窗口在计算机屏幕上的纵坐标
参数含义: 值为整数时,表示以像素为单位的尺寸;
值为小数时,表示图形窗口的宽或高与屏幕的比例 startx、starty的取值可以为整数或None;
当取值为整数时,分别表示图形窗口左侧、顶部与屏幕左侧、顶部的距离(单位为像素);
当取值为None时,窗口位于屏幕中心。
10.3.3 turtle库
设置画笔
画笔(pen)的设置包括画笔属性,如尺寸、颜色的设置,和画笔状态的设置。
turtle.pensize() # 设置画笔尺寸
turtle.speed(speed) # 设置画笔移动速度
turtle.color(color) # 设置画笔颜色 (1)画笔属性函数
pensize()函数的参数width可以设置画笔绘制出的线条的宽度;
speed()函数的参数speed用于设置画笔移动的速度;
color()函数的参数color用于设置画笔的颜色
参数含义:
10.3.3 turtle库
设置画笔
turtle.penup() # 提起画笔
turtle.pendown() # 放下画笔 (2)画笔状态函数
turtle模块中为penup()和pendown()函数定义了别名;
penup()函数的别名为pu();
pendown()函数的别名为pd()。 说明:
10.3.3 turtle库
绘制图形
在画笔状态为DOWN时,通过移动画笔可以在画布上绘制图形,可以将画笔想象成一只海龟(这也是turtle模块名字的由来):海龟落在画布上,它可以向前、向后、向左、向右移动,海龟爬动时在画布上留下痕迹,路径即为所绘图形。
(1)移动控制函数
turtle.forward(distance) # 向前移动
turtle.backward(distance) # 向后移动
turtle.goto(x,y=None) # 移动到指定位置 函数forward()和backward()的参数distance用于指定画笔移动的距离,单位为像素;
函数goto()用于将画笔移动到画布上指定的位置,该函数可以使用x、y分别接收表示目标位置的横坐标和纵坐标,也可以仅接收一个表示坐标向量的参数。
参数含义:
10.3.3 turtle库
绘制图形
(2)角度控制函数
turtle.right(degree) # 向右转动
turtle.left(degree) # 向左转动
turtle.seth(angle) # 转动到某个方向 函数right()和left()的参数degree用于指定画笔向右与向左的角度;
函数seth()的参数angle用于设置画笔在坐标系中的角度。
参数含义:
10.3.3 turtle库
绘制图形
(3)绘制函数
turtle.circle(radius, extent=None, steps=None) 参数radius用于设置半径;
参数extent用于设置弧的角度。
参数含义:
当radius为正时,画笔以原点为起点向上绘制弧线;radius为负时,画笔以原点为起点向下绘制弧线。
当extent为正时,画笔以原点为起点向右绘制弧线;extent为负时,画笔以原点为起点向左绘制弧线。
10.3.3 turtle库
绘制图形
(4)图形填充
turtle.begin_fill() # 开始填充
turtle.end_fill() # 结束填充
本实例要求编写程序,在程序中利用turtle模块绘制几何图形,绘制效果如图所示。
10.4.1 图形绘制
本实例要求利用turtle和time绘制下图所示的钟表,并使钟表的日期、周日期、时间跟随本地时间实时变化。
10.4.2 图形绘制 10.5.1 jieba库
中文分词
中文分词是指将一个汉字序列切分成一个一个单独的词,也就是说将连续的字序列按照一定的规范重新组合成词序列的过程,其作用就是将用户输入的中文语句或语段拆成若干汉语词汇。
示例:
中文分词模块——jieba
pip install jieba/pip3 install jieba
安装jieba
导入jieba
import jieba
jieba模块的分词模式
10.5.1 jieba库
常用分词函数
10.5.1 jieba库 import jieba
seg_list = jieba.cut(“我打算到中国科学研究院图书馆学习”, cut_all=True)
print("【全模式】: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.lcut(“我打算到中国科学研究院图书馆学习”)
print("【精确模式】: " + "/ ".join(seg_list)) # 精确模式
# 搜索引擎模式
seg_list = jieba.cut_for_search(“我打算到中国科学研究院图书馆学习”)
print("【搜索引擎模式】: " + ", ".join(seg_list))
示例:分别采用三种模式对中文进行分词操作
10.5.1 jieba库
增加新词——add_word()
10.5.1 jieba库
wordcloud库
Python的第三方库wordcloud是专用于实现词云功能的库,该库能将文本中词语出现的频率作为参数来绘制词云,并支持对词云的形状、颜色和大小等属性进行设置。
10.5.2 wordcloud库
生成词云的主要步骤
1.利用WordCloud类的构造方法WordCloud()创建词云对象。
2.利用WordCloud对象的generate()方法加载词云文本。
3.利用WordCloud对象的to_file()方法生成词云。
WordCloud()函数参数
10.5.2 wordcloud库
generate()方法
generate()方法需要接收一个字符串作为参数,需要注意的是,若generate()方法中的字符串为中文,在创建WordCloud对象时必须指定字体路径。
10.5.2 wordcloud库
to_file()方法
to_file()方法用于以图片形式输出词云,该方法接收一个表示图片文件名的字符串作为参数,图片可以为.png或.jpg格式。
imread()方法
matplotlib.image中定义的imread()函数用于加载图片文件,其语法格式如下:
imread(filename, flags=1)
利用imread()函数读取.png格式的图片,wordcloud会根据图片的可见区域生成相应形状的词云。
10.5.3 pygame库
pygame简介
pygame是为开发2D游戏而设计的Python跨平台模块。
开发人员利用pygame模块中定义的接口,可以方便快捷地实现游戏中的一些功能,如:
图形用户界面创建
图形和图像的绘制
用户键盘和鼠标操作的监听
播放音频
安装pygame
pygame的安装命令:pip install pygame
10.5.3 pygame库
pygame的初始化和退出
init():一次性初始化pygame的所有模块
quit():可以写在所有之前被初始化的pygame模块
一次性初始化pygame的所有模块,如:
显示模块
字体模块
混音器模块
卸载所有之前被初始化的pygame模块。
10.5.3 pygame库
pygame的初始化和退出
导入pygame模块,并在主函数中实现pygame的初始化和退出。
示例:
import pygame # 导入pygame
def main():
pygame.init() # 初始化所有模块
pygame.quit() # 卸载所有模块
if name == ‘main’:
main() 10.5.3 pygame库
创建游戏窗口
pygame通过display子模块创建图形界面窗口,该子模块中与窗口相关的常用函数如下:
10.5.3 pygame库
初始化游戏窗口
set_mode()函数声明如下:
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface resolution:图形窗口的分辨率。本质上是一个元组(宽,高),单位为像素。默认与屏幕大小一致。
flags:标志位。用于设置窗口特性,默认为0。
depth:色深。该参数只取整数,范围为[8,32]。
参数含义:
返回值含义:
返回值为Surface对象。
可以将Surface对象看作画布,必须先有画布,绘制的图形才能够被呈现。
10.5.3 pygame库
set_mode()函数创建的窗口默认为黑色背景,使用Surface对象的fill()方法可以填充画布,修改窗口颜色。
示例:创建一个窗体,并修改其背景颜色。
import pygame # 导入pygame
WINWIDTH = 640 # 窗口宽度
WINHEIGHT = 80 # 窗口高度
BGCOLOR = ( 125, 125, 0) # 预设颜色
def main():
pygame.init() # 初始化所有模块
# 创建窗体,即创建Surface对象
WINSET = pygame.display.set_mode((WINWIDTH, WINHEIGHT))
WINSET.fill(BGCOLOR) # 填充背景颜色
pygame.quit() # 卸载所有模块
if name == ‘main’:
main() 10.5.3 pygame库
设置窗口标题
set_caption()函数声明如下:
set_caption(title, icontitle=None) -> None title:用于设置显示在窗口标题栏上的标题。
icontitle:用于设置显示在任务栏上的程序标题,默认与title一致。
参数含义:
示例:修改程序代码,在其中调用set_caption()函数设置窗口标题。
pygame.display.set_caption(‘小游戏’) 10.5.3 pygame库
刷新窗口
实际上前面代码中使用fill()方法填充背景后背景颜色却未改变,正是因为程序中未调用该函数对窗口进行刷新。
示例:在pygame.quit()语句之前调用update()函数。 …
def main():
pygame.init() # 初始化所有模块
WINSET = pygame.display.set_mode((WINWIDTH, WINHEIGHT))
WINSET.fill(BGCOLOR) # 填充背景颜色
pygame.display.set_caption(‘小游戏’) # 设置窗口标题
pygame.quit() # 卸载所有模块
…
10.5.3 pygame库
游戏循环
游戏启动后一般由玩家手动关闭。
若要使游戏保持运行,需要在程序中添加一个无限循环。
示例: while True:
pass
10.5.3 pygame库
游戏时钟
游戏时钟用于控制帧率,利用视觉暂留现象形成动画。
帧率>60帧/s,就能实现连续、高品质动画效果。
游戏时钟用于解决帧率过高的问题。
Clock类与tick()方法
通过Clock类的tick()方法可以方便地设置游戏循环的执行频率,具体操作如下:
FPSCLOCK = pygame.time.Clock() # 创建Clock对象
FPSCLOCK.tick(FPS) # 为Clock对象设置帧率 示例:修改程序代码,为其添加帧率控制语句。
10.5.3 pygame库
图形化窗口是绘制文本和图形的前提,创建窗口之后方可在其中绘制文本、图形等元素。通过前面的讲解可知,pygame中的图形窗口是一个Surface对象,在窗口中进行绘制实质上就是在Surface对象之上进行绘制。
图形和文本绘制
图形绘制
加载图片
绘制图片
10.5.3 pygame库
加载图片即将图片读取到程序中。
通过pygame中image类的load()方法可以向程序中加载图片,生成Surface对象。
1.加载图片
load()方法
参数filename。被加载的文件名。
返回值Surface。load()方法返回一个Surface对象。
load(filename) -> Surface 方法说明:
示例:使用load()方法加载名为“bg.jpg”的图片。
7.2 游戏模块-pygame
绘制图像即将一个Surface对象叠加在另一个Surface对象之上。
通过Surface对象的blit()方法可以实现图像绘制。
2.绘制图片
blit()方法
source。接收被绘制的Surface对象。
dest。接收一个表示位置的元组(left,top),或接收一个表示矩形的元组(left,top,width,height) ,将矩形的位置作为绘制的位置。
area。是一个可选参数,通过该参数可设置矩形区域。若设置的矩形区域小于source所设置Surface对象的区域,那么仅绘制Surface对象的部分内容。
special_flags。标志位。
blit(source, dest, area=None, special_flags = 0) -> Rect 参数说明:
7.2 游戏模块-pygame
示例:使用blit()方法将加载生成的imgSurf对象绘制到窗口WINSET中。
2.绘制图片
10.5.3 pygame库
文本绘制
创建字体对象
渲染文本内容,生成一张图像
将生成的图像绘制到游戏主窗口中
文本绘制实际上也是图片的叠加,只是在绘制之前需要先结合字体,将文本内容制作成图片。
10.5.3 pygame库
1.创建字体对象
调用font模块的Font()函数可以创建一个字体对象,Font()函数的声明如下:
Font(filename, size) -> Font filename。用于设置字体对象的字体。
size。用于设置字体对象的大小。
参数说明:
示例:
BASICFONT = pygame.font.Font(‘STKAITI.TTF’, 25) Font()函数
10.5.3 pygame库
1.创建字体对象
调用font模块的SysFont()函数可以创建一个字体对象,SysFont()函数的声明如下:
SysFont(name, size, bold=False, italic=False) -> Font name:系统字体的名称。可以设置的字体与操作系统有关,通过pygame.font.get_fonts()函数可以获取当前系统的所有可用字体列表。该参数亦可接收字体路径名。
size:字体大小。
bold:是否设置为粗体,默认为否。
italic:是否设置为斜体,默认为否。
参数说明:
SysFont()函数
10.5.3 pygame库
1.创建字体对象
SysFont()对系统依赖度较高,Font()则可以在设置字体时将字体文件存储到程序路径中,使用自定义的字体。
Font()函数更加灵活,也更利于游戏程序的打包和移植。
Font和SysFont()函数的区别
10.5.3 pygame库
2.渲染文本内容
pygame模块中可通过字体对象的render()方法进行渲染,该方法的声明如下:
render(text, antialias, color, background=None) -> Surface text 参数:文字内容。
antialias参数: 是否抗锯齿(抗锯齿效果会让绘制的文字看起来更加平滑)。
color 参数:文字颜色。
background 参数:背景颜色,默认为 None,表示无颜色。
参数说明:
示例:以调用Font()函数生成的字体对象BASICFONT为例,通过render()方法渲染文本内容。
YELLOW = (255, 255, 193) # 颜色预设
MSGCOLOR = DARKTURQUOISE # 设置字体颜色
MSGBGCOLOR = YELLOW # 按钮背景颜色
msgSurf = BASICFONT.render(‘初始化…’,True,MSGCOLOR,MSGBGCOLOR)
render()方法
10.5.3 pygame库
2.渲染文本内容
通过image类的save()方法可以将渲染生成的Surface对象作为图片存储到本地,save()方法的语法格式如下:
示例:使用save()方法将msgSurf对象保存到本地,并命名为msg.png。
save()方法
save(Surface, filename) -> None 10.5.3 pygame库
3.绘制渲染结果
示例:将创建的文本对象msgSurf绘制到WINSET的(0,0)位置。
10.5.3 pygame库
元素位置控制要点
pygame图形窗口的坐标体系
pygame的Rect类
位置控制
\1. pygame图形窗口的坐标体系
pygame图形窗口坐标体系的定义如下:
坐标原点在游戏窗口的左上角。
x轴与水平方向平行,以向右为正。
y轴与垂直方向平行,以向下为正。
10.5.3 pygame库
示例:将分辨率为160×120的矩形放置在分辨率为640×480的pygame窗口的(80,160)位置。
10.5.3 pygame库
2.Rect类
Rect类用于描述、控制可见对象(文本、图片等)在pygame窗口中的位置,该类定义在pygame模块之中,它的构造函数如下:
Rect(x, y, width, height) -> Rect 示例:创建坐标为(80,160)、分辨率为160×120的矩形对象。
10.5.3 pygame库
2.Rect类
除坐标、宽、高之外,矩形还具有许多用于描述与坐标系相对关系的属性,下面将给出矩形对象的常见属性,并以矩形 rect = Rect(10, 80, 168, 50) 为例对这些属性进行说明,具体如表所示。
10.5.3 pygame库
2.Rect类
矩形属性示意图如图所示。
10.5.3 pygame库
3.位置控制
方式1:将Surface对象绘制到窗口时,以元组(x,y)的形式将坐标传递给参数dest。
方式2:使用get_rect()方法获取Surface对象的矩形属性,重置矩形横纵坐标后,再将矩形属性传递给参数dest以设置绘制位置。
位置控制方式
示例:以在小游戏窗口右下角的功能绘制“自动”按钮为例,使用第二种位置控制方式在窗口中绘制文本。 10.5.3 pygame库
动态效果原理
动态效果分类
移动。多次修改Surface对象绘制的位置并连续绘制刷新。
动画。在同一位置绘制不同的Surface对象。
移动的动画。连续绘制不同Surface对象的同时,修改绘制的位置。
10.5.3 pygame库
动态效果分类
10.5.3 pygame库
copy()方法
pygame的Surface类中定义了copy()方法,使用该方法可以拷贝Surface对象,实现方块的消失。
实现步骤
step1
step2
10.5.3 pygame库
示例:实现小游戏中“自动”按钮的移动
10.5.3 pygame库
事件
程序开发中将玩家会对游戏进行的操作称为事件(Event),根据输入媒介的不同,游戏中的事件分为:
键盘事件
鼠标事件
手柄事件
10.5.3 pygame库
pygame常见事件列表
键盘事件
pygame在子模块locals中对事件进行了更加细致的定义,键盘事件、鼠标事件及其产生途径和参数如表所示。 KEYDOWN
KEYUP
unicode:记录按键的Unicode值。
key:按下或放开的键的键值(K_xx)。
mod:包含组合键信息
参数介绍
10.5.3 pygame库
鼠标事件 MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN
事件相关属性与函数
pygame.event.type——判断事件类型
pygame.event.get()——获取当前时刻产生的所有事件的列表
示例:在程序中添加事件处理代码。 《西游记》篇幅巨大、出场人物繁多本实例要求编写程序,统计提取《西游记》小说中的关键人物的出场次数,判断谁是主角。
10.6.1 出场人物统计
反应力测试小游戏是一个根据游戏得分判定玩家反应力的游戏,该游戏的设定非常简单,游戏主体为小球和挡板:小球从屏幕顶端随机位置出现,垂直落下,玩家用鼠标左右键控制挡板左右移动,接住下落的小球。若挡板接到小球,继续游戏;若没有接到则游戏失败,退出并显示分数。
本实例要求编写程序,实现一个反应力测试小游戏。
10.6.2 反应力测试小游戏
本章简单介绍了Python计算生态、演示了如何构建与发布Python生态库,并介绍了常用的内置Python库和有趣的第三方库,包括time库、random库、turtle库、jieba库、wordcloud库和pygame库。通过本章的学习,希望读者能对Python计算生态涉及的领域所使用的Python库有所了解,掌握构建Python库的方式和random库、turtle库、jieba库的使用,熟悉time库、wordcloud库和pygame库。
10.7 本章小结
end