Python完全自学教程

978-7-115-59586-7
作者: 明日科技
译者:
编辑: 张天怡
分类: Python

图书目录:

详情

本书可作为Python自学手册。本书系统、全面地介绍了Python程序设计开发所涉及的各类知识。全书共19章,包括Python起步、Python语言基础、Python数据类型、运算符、条件控制语句、循环结构语句、序列、字符串、列表、字典与集合、文件与I/O、函数、GUI编程、异常处理及程序调试、Web编程、Web框架,以及3个实战案例即51商城、BBS问答社区、甜橙音乐网。全书每章内容都与实例紧密结合,有助于读者理解知识、应用知识,达到学以致用的目的。 本书附有配套资源包,资源包中有本书所有实例的源码及教学视频。其中,源码全部经过精心测试,能够在Windows 7、Windows 8、Windows 10操作系统下编译和运行。 本书可作为计算机、软件等相关专业的教材,同时也适合数据库爱好者、初级数据库开发人员阅读参考。

图书摘要

版权信息

书名:Python完全自学教程

ISBN:978-7-115-59586-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    明日科技

责任编辑 张天怡

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内容提要

本书可作为Python自学手册。本书系统、全面地介绍了Python程序设计开发所涉及的各类知识。全书共19章,包括Python起步、Python语言基础、Python数据类型、运算符、条件控制语句、循环结构语句、序列、字符串、列表、字典与集合、文件与I/O、函数、GUI编程、异常处理及程序调试、Web编程、Web框架,以及3个实战案例即51商城、BBS问答社区、甜橙音乐网。全书每章内容都与实例紧密结合,有助于读者理解知识、应用知识,达到学以致用的目的。

本书附有配套资源包,资源包中有本书所有实例的源码及教学视频。其中,源码全部经过精心测试,能够在Windows 7、Windows 8、Windows 10操作系统下编译和运行。

本书可作为计算机、软件等相关专业的教材,同时也适合数据库爱好者、初级数据库开发人员阅读参考。

前  言

Python自问世以来,发展得越来越快,和Python相关的应用也越来越多。当前,实例教学是计算机程序语言教学最有效的方法之一。本书将Python知识和实用的实例有机结合起来:一方面,追踪Python的发展方向,适应市场需求,精心选择内容,突出重点,强调实用性,使知识讲解全面、系统;另一方面,将知识融入实例讲解,使知识与实例相辅相成,既有利于读者学习知识,又有利于指导读者实践。

如果您在学习或使用本书的过程中遇到问题或疑惑,可以通过如下方式与我们联系,我们会尽快提供解答。

服务网站:www.mingrisoft.com。

服务电话:0431-84978981/84978982。

企业QQ:4006751066。

服务信箱:mingrisoft@mingrisoft.com。

书中案例使用的数据信息均属虚构,如有雷同,纯属巧合。

由于编者水平有限,书中难免存在疏漏和不足之处,敬请广大读者批评指正,以便本书得以改进和完善。

明日科技

2023年6月

第1章 Python起步

1.1 初识Python

1.1.1 Python简介

Python 是一种跨平台的、开源的、免费的、解释型的高级编程语言,它具有种类丰富和功能强大的库,能够把用其他语言(尤其是C/C++)制作的各种模块很轻松地“联结”在一起,所以Python常被称为“胶水”语言,其标志如图1.1所示。Python 的应用领域也非常广泛,在 Web 编程、图形处理、大数据处理、网络爬虫和科学计算等领域都能找到 Python 的身影。在全球最大的编程问答社区 Stack Overflow上,Python已经成为受欢迎的编程语言之一,如图1.2所示。

图1.1 Python的标志

图1.2 Python应用趋势

1.1.2 Python的应用领域

Python作为一种功能强大且简单易学的编程语言,广受好评,那么Python的应用领域有哪些呢?概括来说主要有以下几个领域。

Web开发。

大数据处理。

人工智能。

自动化运维开发。

云计算。

爬虫。

游戏开发。

1.2 Python的安装与问题处理

1.2.1 安装Python

1.如何查看计算机操作系统的位数

编程软件为了提高开发效率,分别对32位操作系统和64位操作系统做了优化,推出了不同的开发工具包。Python也不例外,所以在安装Python前,需要了解计算机操作系统的位数。下面介绍在Windows 10下如何查看操作系统的位数。

在桌面找到“此电脑”图标,用鼠标右键单击该图标,在弹出的快捷菜单中选择“属性”命令,如图1.3所示。选择“属性”命令后将弹出图1.4所示的“系统”窗口,在“系统类型”处标示着本机是64位操作系统还是32位操作系统。图1.4中所展示的计算机操作系统为64位。

图1.3 选择“属性”命令

图1.4 查看系统类型

2.下载Python安装包

在Python的官方网站中,可以很方便地下载Python的开发环境,具体下载步骤可以查看本书相关视频。下载完成后,在下载位置可以看到已经下载的Python安装文件“python-3.8.2.exe”,如图1.5所示。

图1.5 下载后的python-3.8.2.exe文件

3.在Windows 64位操作系统上安装Python

在Windows 64位操作系统上安装Python 3.x的步骤可以查看安装视频。

4.检测Python是否安装成功

按照步骤安装Python后,需要检测Python是否安装成功。例如,在Windows 10操作系统中检测Python是否成功安装,可以在Windows 10操作系统的“开始”菜单上单击鼠标右键,在弹出的快捷菜单中选择“搜索”,接下来在桌面左下角“搜索程序和文件”文本框中输入cmd命令,然后按<Enter>键,启动“命令提示符”窗口(又称命令行界面、命令行窗口),在当前的“命令提示符”窗口中输入python,并且按<Enter>键,如果出现图1.6所示的信息,则说明Python安装成功,同时进入交互式Python解释器。

图1.6 在“命令提示符”窗口中运行的Python解释器

1.2.2 解决提示“‘python’不是内部或外部命令……”

在“命令提示符”窗口中输入python命令后,可能会显示“‘python’不是内部或外部命令,也不是可运行的程序或批处理文件。”,如图1.7 所示。

图 1.7 输入python命令后出错

出现该问题的原因是,在当前的路径中找不到Python.exe可执行程序,具体的解决方法是配置环境变量,这里以Windows 10操作系统为例介绍配置环境变量的方法,具体如下。

(1)在“此电脑”图标上单击鼠标右键,然后在弹出的快捷菜单中选择“属性”命令,并在弹出的“系统”窗口中单击“高级系统设置”超链接,将出现图1.8所示的“系统属性”对话框。

(2)单击“环境变量”按钮,将弹出“环境变量”对话框,如图1.9所示。

图1.8 “系统属性”对话框

图1.9 “环境变量”对话框

(3)在“mingribccd的用户变量”中,选择“Path”环境变量,单击“编辑”按钮,将弹出“编辑环境变量”对话框,单击“新建”按钮,在新建的编辑文本框中输入G:\Python\Python38,再次单击“新建”按钮,在新建的编辑文本框中输入G:\Python\Python38\Scripts\,最后单击“确定”按钮,如图1.10所示,回到“环境变量”对话框。(注意G 盘为编者安装Python的路径,读者可以根据实际情况进行修改。)

图1.10 编辑环境变量

(4)单击“环境变量”中的“Path”环境变量,可以看到刚添加的变量值,如图1.11所示。单击“确定”按钮,完成环境变量的配置。

图1.11 查看添加的变量值

(5)在“命令提示符”窗口中,输入 Python 命令,如果Python解释器可以成功运行,说明配置成功。如果已经正确配置了环境变量,仍无法启动Python解释器,建议重新安装Python。

1.3 Python开发工具

通常情况下,为了提高开发效率,需要使用相应的开发工具。进行Python开发也可以使用开发工具,下面将介绍利用Python自带的集成开发和学习环境(IDLE)进行编程。

在安装Python后,会自动安装IDLE。它是Python Shell(可以在打开的IDLE主窗口的标题栏上看到),也就是一个通过输入文本与程序进行交互的途径,程序开发人员可以利用它与Python交互。下面将详细介绍如何使用IDLE开发Python程序。

1.打开IDLE并编写代码

打开IDLE时,可以单击Windows 10操作系统的“开始”菜单,然后依次选择“所有程序”→“Python 3.8”→“IDLE (Python 3.8 64-bit)”命令,即可打开IDLE主窗口,如图1.12所示。

图1.12 IDLE主窗口

(1)在IDLE主窗口的菜单栏上,选择“File”→“New File”命令,将打开一个新窗口。在该新窗口中,可以直接编写Python代码,并且输入一行代码后再按〈Enter〉键,将自动换到下一行,等待继续输入,如图1.13所示。

图1.13 新创建的Python文件窗口

(2)在代码编辑区中,编写“hello world”程序,代码如下。

print("hello world")

(3)编写完成的代码效果如图1.14所示。按快捷键<Ctrl +S>保存文件,这里将其保存为demo.py,其中.py是Python文件的扩展名。

图1.14 代码效果

(4)运行程序。在菜单栏中选择“Run”→“Run Module”命令(或按<F5>键),运行结果如图1.15所示。

图1.15 运行结果

说明

程序运行结果会在IDLE中呈现,每运行一次程序,程序运行结果就会在IDLE中呈现一次。

2.IDLE常用的快捷键

在程序开发过程中,合理地使用快捷键,不但可以降低代码的错误率,而且可以提高开发效率。因此,掌握一些IDLE常用的快捷键是必须的。在IDLE中,可通过选择“Options”→“Configure IDLE”命令,在打开的“Settings”对话框的“Keys”选项卡中查看快捷键,但该界面是英文的,不便于查看,所以编者将一些IDLE常用的快捷键通过表1.1列出。

表1.1 IDLE常用的快捷键

快捷键

说明

适用环境

F1

打开Python帮助文档

Python文件窗口和Python Shell窗口均可用

Alt+P

浏览历史命令(上一条)

仅Python Shell窗口可用

Alt+N

浏览历史命令(下一条)

仅Python Shell窗口可用

Alt+/

自动补全前面曾经出现过的单词。如果之前有多个单词具有相同的前缀,可以连续按该快捷键,在多个单词中循环来选择

Python文件窗口和Python Shell窗口均可用

Alt+3

注释代码块

仅Python文件窗口可用

Alt+4

取消代码块注释

仅Python文件窗口可用

Alt+G

转到某一行

仅Python文件窗口可用

Ctrl+Z

撤销操作

Python文件窗口和Python Shell窗口均可用

Ctrl+Shift+Z

恢复上一次的撤销操作

Python文件窗口和Python Shell窗口均可用

Ctrl+S

保存文件

Python文件窗口和Python Shell窗口均可用

Ctrl+]

缩进代码块

仅Python文件窗口可用

Ctrl+[

取消代码块缩进

仅Python文件窗口可用

Ctrl+F6

重新启动Python Shell

仅Python Shell窗口可用

说明

由于IDLE使用起来简单、方便,很适合练习用,所以本书将IDLE作为开发工具。

1.4 基本输出函数print()

在Python中,使用内置的print()函数可以将结果输出到IDLE或者标准控制台上。print()函数的语法格式如下。

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

参数说明如下。

value:表示要输出的值;可以是数字、字符串、各种类型的变量等。

…:值列表,表示可以一次性输出多个值;输出多个值时,需要使用“,”(英文逗号)分隔,输出的各个值之间默认用空格隔开。

sep:表示输出的各个值之间的间隔符,默认是一个空格,也可以设置为其他的分隔符。

end:表示输出完最后一个值后需要添加的字符串,用来设定输出语句以什么结尾,默认是换行符“\n”,即输出完会跳到新行;可以换成其他字符串,如end='\t' 或end=' '等。

file:表示输出的目标对象,可以是文件,也可以是数据流,默认是sys.stdout。也可以设置“file = 文件存储对象”,把内容存到该文件中。

flush:表示是否立刻将输出语句输出到目标对象,flush的值为False或者True,默认flush=False,表示输出值会存在缓存;当flush=True时,输出值会被强制写入文件。

其中,输出内容可以是数字和字符串(字符串需要使用引号括起来),此类内容将直接输出;输出内容也可以是包含运算符的表达式,此类内容将计算结果输出。例如:

a = 100                          # 变量a,值为100
b = 5                            # 变量b,值为5
print(9)                         # 输出数字9
print(a)                         # 输出变量a的值100
print(a*b)                       # 输出a*b的结果500
print("go big or go home")       # 输出“go big or go home”(要么出众,要么出局)

多学两招

在Python中,默认情况下,使用print()语句输出结果后会自动换行,如果想要一次输出多个内容,而且不换行,可以将要输出的内容使用英文逗号分隔。下面的代码将在一行上输出变量a和b的值,以及字符串。

print(a,b,'要么出众,要么出局')           # 输出结果:100 5 要么出众,要么出局

注意

sep、end、file、flush都必须以命名参数方式传参,否则会被当作需要输出的对象。

提示

如果print()函数不传递任何参数,将会输出end参数的默认值,即输出空行。

1.4.1 使用连接符连接多个字符串

数值可以直接输出,但使用“+”连接数值和其他类型数据时,系统会默认为加法计算,会报错。可以使用“,”连接,或者将数值作为字符串来处理,即在两端加英文单引号或英文双引号。

print(1314)                     # 直接输出整数,可不带英文双引号或英文单引号
1314
print(12.22)                    # 直接输出浮点数
12.22
print(10 / 3)                   # 可以包含运算表达式,输出运算结果
3.3333333333333335
print(100 * 3.13 + 60)          # 可以包含运算表达式,输出运算结果
373
print(2, 0, 2, 0)                 # 使用“,”连接要输出的数值,输出结果中间用空格分隔
2 0 2 0
print(192, 168, 1, 1, sep='.')  # 使用“.”连接输出数值,数值间用“.”分隔
192.168.1.1
print("广州恒大" + 43)          # 不能直接使用“+”连接字符串和数值,会报错
TypeError: can only concatenate str (not“int”) to str
print("广州恒大" + str(43))      # 使用“+”连接字符串和数值时,数值要转换为字符串
广州恒大43
print("广州恒大", 43)          # 使用“,”连接字符串和数值,输出的字符串和数值用
空格分隔 广州恒大 43 print("%e" % 120563332111098) # 使用操作符“"%e"%”格式化数值为科学记数法 1.205633e+14

1.4.2 指定位数编号输出

zfill()函数可按指定位数输出编号,如将输入的数字格式化为5位编号输出,代码如下。

instr=input('请输入一个数字:')
print (instr.zfill(5))        # 输出5位编号

运行程序,输入一个数字,会将其格式化为5位编号,如图1.16所示。

图1.16 输出5位编号

1.5 输入函数input()

在Python中,使用内置函数input()可以接收用户用键盘输入的信息。input()函数的基本用法如下。

variable = input("提示文字")

其中,variable为保存输入结果的变量,双引号内的提示文字表示用于提示要输入的内容。例如,想要接收用户输入的内容,并保存到变量tip中,可以使用下面的代码实现。

tip = input("请输入文字:")

在Python 3.x中,无论输入的是数字还是字符,都将被当作字符串读取。如果想要接收数值,需要把接收到的字符串进行类型转换。例如,想要接收整型的数字并保存到变量num中,可以使用下面的代码。

num = int(input("请输入您的幸运数字:"))

想要获得字符对应的ASCII值该如何实现呢?通过ord()函数可以将字符的ASCII值转换为数字。下面的代码用于实现根据输入字符,输出相应的ASCII值。

name=input("输入字符:")                              # 输入字母或数字,不能输入汉字
print(name+" 的ASCII值为:",ord(name))               # 显示字符对应的ASCII值

如输入字符“A”,则结果输出为“A的ASCII值为65”;输入数字5,则结果输出为“5的ASCII值为53”。

 示例  根据输入的年份,计算年龄大小。

实现根据输入的年份(4位数字,如1981),计算目前的年龄。程序中使用input()函数输入年份,使用datetime模块获取当前年份,然后用当前年份减去输入的年份,就是计算的年龄,代码如下。

import datetime                              # 调入时间模块
imyear = input("请输入您的出生年份:")           # 输入的出生年份必须是4位数字的,如1981
nowyear= datetime.datetime.now().year        # 计算当前年份
age = nowyear- int(imyear)                   # 用于计算实际年龄
print("您的年龄为:"+str(age ) +"岁")           # 输出年龄
# 根据计算的年龄判断所处的年龄阶段
if age<18:                                    # 如果年龄小于18岁
     print("您现在为未成年人 ~@_@~")            # 输出为“您现在为未成年人 ~@_@~”
if age>=18 and age<66:                        # 如果18age<66
     print("您现在为青年人 (-_-)")              # 输出为“您现在为青年人 (-_-)”
if age>=66 and age<80:                        # 如果66age<80
     print("您现在为中年人~@_@~")               # 输出为“您现在为中年人~@_@~”
if age>=80:                                   # 如果age80
     print("您现在为老年人 *-_-* ")             # 输出为“您现在为老年人*-_-*”

运行程序,会提示输入出生年份,如图1.17所示。输入出生年份,出生年份必须是4位数字,如1981。

输入出生年份,如输入2007,按<Enter>键,运行结果如图1.18所示。

图1.17 提示输入出生年份

图1.18 根据输入的年份计算年龄

1.5.1 常用输入

使用input()输入信息时,提示信息参数可以为空(不提示任何信息),也可以和转义字符结合(如在提示信息后加\n,表示在提示信息后换行)。常见应用代码如下。

name = input("")                  # 无提示型输入,不换行
name1 = input("name:")            # 简洁型输入,不换行
name2 = input("请输入您的姓名:")   # 提示型输入,不换行
name3 = input("姓名:\n")          # 提示型输入,换行

运行结果如下。

张三丰
name:李铁
请输入您的姓名:理想
姓名:
李世民     

1.5.2 去除输入的非法字符

输入数据时,可能会输入空格等非法字符,这时可以使用字符串的strip()、lstrip()或rstrip()等方法去除输入的非法字符。例如下面的代码。

name = input("请输入您的姓名:").strip(' ')    # 去除输入数据两端的空格
age = input("请输入您的年龄:").lstrip(' ')    # 去除输入数据左侧的空格
print(name)
print(age)

运行结果如下。

请输入您的姓名: joy
请输入您的年龄: 12
joy   12

1.5.3 多数据输入

input()函数支持多个数据的输入,输入的时候通常使用字符串的split()方法进行分割,如同时输入某一地点的坐标值等。示例代码如下。

# 一行输入两个不限定类型的值
x,y=input("请输入出发地点的横、纵坐标值,用英文逗号分隔:").split(',')
name,age,height=input('请输入你的姓名、年龄和身高,用英文逗号分隔:\n').split(',') 
# 一行输入两个限定类型为整型的值
a,b=map(int,input('请输入两个数,用空格分隔:\n').split())        
print(x,y)
print(age)
print(a,b)

运行结果如下。

请输入出发地点的横、纵坐标值,用英文逗号分隔:123,210
请输入你的姓名、年龄和身高,用英文逗号分隔:
joy,22,1.68
请输入两个数,用空格分隔:
27 89
123 210
22
27 89

说明

如果不按指定规则输入,将输出“ValueError: not enough values to unpack”异常。

通过循环语句也可以实现多个数据的输入,也需要使用字符串的split()方法对输入的数据进行分割。代码如下。

sum = 0
for x in input('请输入多个加数,中间用空格分隔:').split(' '):
    sum = sum+int(x)
print(sum)

运行结果如下。

请输入多个加数,中间用空格分隔:
1 2 3 4 5 6 7 8
36

1.5.4 强制转换输入

用户通过input()函数输入的数据都是字符串类型的,有时程序要求输入的数据为某种特定数据类型,如整型、浮点型或日期型等,这时就需要在输入后进行强制转换。例如,使用int()函数将用户输入的字符串类型的数据转换为整型数据。代码如下。

age = int(input('age:'))
print(age)
print(type(age))

运行结果如下。

age:30
30
<class 'int'>

有时对输入的数据是有一定要求的,如首字母大写、全部为小写等,这时可以使用字符串的lower()、upper()、capitalize()或title()等方法对输入的数据进行强制转换。代码如下。

password = input('请输入您的密码:').upper()      # 将输入的数据转换为全部大写
name = input('请输入您的姓名:').capitalize()     # 将输入的数据转换为首字母大写
school = input('请输入您的学校:').title()         # 将输入的数据全部转换为首字母大写
print(password,name,school)                    # 输出以上转换后的内容

运行结果如下。

请输入您的密码:abcdefg      
请输入您的姓名:joy
请输入您的学校:harvard university
ABCDEFG Joy Harvard University

1.5.5 对输入数据进行验证

Python提供了一些对输入数据进行验证的方法,通过这些方法可以非常方便地判断输入内容是大写字母、小写字母、数字或空白字符等。主要方法如下。

isalnum():用于验证所有字符都是数字或者字母。

isalnum():用于验证所有字符都是字母。

isdigit():用于验证所有字符都是数字。

islower():用于验证所有数据都是小写。

isupper():用于验证所有数据都是大写。

istitle():用于验证所有数据都是首字母大写,类似标题。

isspace():用于验证所有数据都是空白字符,如\t、\n、\r。

使用字符串的isdigit()方法可以验证输入数据是否为数字。例如,需要输入纯数字方可进入系统,否则将退出系统,代码如下。

if input('请输入数字验证码:').isdigit():
    print('正在登录草根之家商务系统!')
else:
    print('输入非法,将退出系统!')

输入纯数字的运行结果如下。

请输入数字验证码:1314
正在登录草根之家商务系统!

输入非纯数字的运行结果如下。

请输入数字验证码:q1e2
输入非法,将退出系统!

第2章 Python语言基础

2.1 注释

注释,是指在代码中对代码功能进行解释说明的标注性文字,可以提高代码的可读性,让代码更容易理解和维护。程序运行时,注释的内容将被Python解释器忽略,并且不会在执行结果中体现出来。

编写程序时,及时添加注释不但可以记录程序的作用和功能,还可以通过注释对程序进行调试,这是一些有经验的编程人员经常使用的调试手段。

Python通常包括3种类型的注释,分别是单行注释、多行注释和中文编码声明注释。

2.1.1 单行注释

在Python中,可使用“#”作为单行注释的符号。从“#”开始直到换行为止,其中的所有内容都作为注释而被Python解释器忽略。语法格式如下。

# 注释内容

单行注释可以放在要注释代码的前一行,也可以放在要注释代码的右侧。例如,下面的两种注释形式都是正确的。

当行注释(注释直接占一行) :

# 数字竞猜小游戏程序
# 预设竞猜数字给变量instr
instr = input("请输入预设的竞猜数字:")

行末注释(在代码的右侧添加注释):

guess = -1                                   # 设置默认输入的竞猜数字为-1
print("======数字猜谜小游戏======")           # 输出游戏名称
while guess != number:                       # 如果竞猜错误,重新竞猜

使用当行注释还是行末注释,需要根据编写程序的实际情况进行选择,当需要解释、说明的内容较多时,推荐使用当行注释。当行注释和行末注释的综合应用代码如下。

# 用户登录判断程序
# 只要输入user列表中的用户,就可以模拟登录系统
user=['like','ming','sun','xiaobei','star'] # 用户名称列表
while True:                                 # 要求重复输入,直到输入正确的用户名称
    instr = input('用户名称:')            # 要求输入用户名称
    if instr in user:                     # 如果输入的用户在列表中
        print('正在进入系统,请稍后!')
        break                             # 退出程序
    else:
        print('密码不正确,请重新输入!')
        continue                          # 继续执行程序

注意

在任何代码行前面加上“#”符号,该行代码就可以变成注释。利用这个方法,在遇到程序中暂时无法调试的代码时,可以先将其变成注释的形式,进行部分程序的优先调试。

2.1.2 多行注释

在Python中,并没有单独的多行注释标记,而是将包含在一对三引号(' ' '……' ' ')或者(" " "……" " ")之间的内容都称为多行注释。这样的内容将被解释器忽略。由于这样的内容可以分为多行编写,所以也作为多行注释。语法格式如下。

'''
注释内容1
注释内容2
……
''' 

或者

"""
注释内容1
注释内容2
……
"""

多行注释通常用来为Python文件、模块、类或者函数等添加版权、功能等信息,例如,下面的代码将使用多行注释为程序添加功能、开发者、版权所有、开发日期等信息。

'''
信息加密模块
开发者:天星
版权所有:明日科技
2018年9月
'''

多行注释也经常被用来解释代码中重要的函数、参数等信息,便于后续开发者维护代码,例如:

'''
库存类主要的函数
update改/更新
find查找
delete删除
create添加
'''

多行注释其实可以采用单行注释多行书写的方式实现,如上面的多行注释可以写成如下形式。

# 库存类主要的函数
# update改/更新
# find查找
# delete删除
# create添加

2.1.3 中文编码声明注释

在Python中编写代码的时候,如果用到指定字符编码类型的中文编码,需要在文件开头加上中文编码声明注释,这样可以在程序中指定字符编码类型的中文编码,不至于出现代码错误。所以说,中文编码声明注释很重要。Python 3.x提供的中文编码声明注释语法格式如下。

# -*- coding:编码 -*-

或者

# coding=编码

例如,保存文件编码格式为UTF-8,可以使用下面的中文编码声明注释。

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

为代码添加注释,是一个优秀的程序员必须要做的工作。但要确保注释的内容都是重要的,看一眼就知道代码的作用,而有些代码是不需要加注释的。

说明

在上面的代码中,“-*-”没有特殊的作用,只是为了美观才加上的,所以上面的代码也可以使用“# coding:utf-8”代替。

为了便于读者理解程序中的代码,本书对大多数代码都进行了注释。在实际开发中,读者只要对关键代码进行注释就可以了,不必像本书一样。

2.1.4 注释程序进行调试

在编码时,有些代码可能会出现编码错误,无法编译;或者我们不希望编译、运行程序中的某些代码,这时可以将这些代码注释掉。这种调试方式简单、实用,有经验的程序员经常采用这种方式进行程序调试。下面以计算长方形的对角线长、周长和面积为例来演示如何通过注释调试程序。计算长方形的对角线长、周长和面积的代码如下。

a,b=map(float,input('请输入长方形两个边的边长,用英文逗号间隔:').split(','))    
s=a*b
l=(a+b)*2
d=(a**2+b**2)**(1/2)
print('长方形的对角线长为:',d)   # 输出长方形的对角线长
print('长方形周长为:',l)        # 输出长方形周长
print('长方形面积为:',s)        # 输出长方形面积

在上面的代码中,如果只想计算长方形面积,但要保留计算对角线长和周长的代码,则只需将计算对角线长和周长的代码注释即可,代码如下。

a,b=map(float,input('请输入长方形两个边的边长,用英文逗号间隔:').split(','))    
s=a*b
# l=(a+b)*2
# d=(a**2+b**2)**(1/2)
# print('长方形的对角线长为:',d)       # 输出长方形的对角线长
# print('长方形周长为:',l)            # 输出长方形周长
print('长方形面积为:',s)              # 输出长方形面积

在上面的代码中,如果想计算长方形的面积和周长,则只需将计算周长的代码恢复即可,代码如下。

a,b=map(float,input('请输入长方形两个边的边长,用英文逗号间隔:').split(','))    
s=a*b
l=(a+b)*2
# d=(a**2+b**2)**(1/2)
# print('长方形的对角线长为:',d)       # 输出长方形的对角线长
print('长方形周长为:',l)              # 输出长方形周长
print('长方形面积为:',s)              # 输出长方形面积

2.2 编码格式

2.2.1 代码缩进

Python采用代码缩进和冒号“:”区分代码之间的层次。缩进可以使用<Space>键或者<Tab>键实现。使用<Space>键时,通常情况下采用4个空格作为缩进量;而使用<Tab>键时,则将按一次<Tab>键产生的缩进作为缩进量。通常情况下建议使用<Space>键进行缩进。

在Python中,对于类定义、函数定义、流程控制语句,以及异常处理语句等,行尾的冒号和下一行的缩进表示一个代码块的开始,而缩进结束,则表示一个代码块的结束。

例如,下面代码中的缩进为正确的缩进。

pwd = input("输入密码:").strip()        # 要求输入密码,strip()方法用于去除空格
repwd = input("确认密码:").strip()     # 要求输入确认密码,strip()方法用于去除空格
 
if pwd == repwd :                      # 判断密码是否一致
    print("密码输入正确!")              # 输出"密码输入正确!"
else:
    print("确认密码与输入密码不一致!")    # 输出"确认密码与输入密码不一致!"

Python对代码的缩进要求非常严格,同一个级别的代码块的缩进量必须相同。如果不进行合理的代码缩进,将抛出SyntaxError异常。例如,代码中有的缩进量是4个空格,还有的是3个空格,就会出现SyntaxError异常,如图2.1所示。

图2.1 缩进量不同导致的SyntaxError异常

在IDLE中,一般以4个空格作为基本缩进量。不过也可以选择“Options”→“Configure IDLE”命令,在打开的“Settings”对话框(如图2.2所示)的“Fonts/Tabs”选项卡中修改基本缩进量。

图2.2 修改基本缩进量

多学两招

在IDLE的文件窗口中,可以通过选择主菜单中的“Format”→“Indent Region”命令(或按快捷键<Ctrl+]>),将选中的代码进行缩进(向右移动指定的缩进量),也可通过选择主菜单中的“Format”→“Dedent Region”命令(或按快捷键<Ctrl+[>),对代码进行反缩进(向左移动指定的缩进量)。

2.2.2 编码规范

Python采用PEP 8作为编码规范,其中PEP是Python Enhancement Proposal的缩写,翻译成中文是Python增强建议书,而8表示版本号。PEP 8是Python代码的样式指南。下面给出PEP 8编码规范中的一些应该严格遵守的条目。

每个import语句只导入一个模块,尽量避免一次导入多个模块。图2.3所示为推荐写法,而图2.4所示为不推荐写法。

图2.3 推荐写法

图2.4 不推荐写法

不要在行尾添加分号“;”,也不要用分号将两条命令放在同一行。例如,图2.5所示的代码为不规范写法。

图2.5 不规范写法

建议每行不超过80个字符,如果超过,建议使用圆括号“()”将多行内容隐式地连接起来,而不推荐使用反斜线“\”进行连接。例如,某个字符串文本在一行上显示不完全,那么可以使用圆括号将其分行显示,代码如下。

print("虽然我是一只蜗牛,我一直在爬,也许还没有爬到金字塔的顶端,"
      "但是只要我在爬,就足以给自己带来令生命感动的瞬间。")

例如,以下通过反斜线进行连接的做法是不推荐使用的。

print("虽然我是一只蜗牛,我一直在爬,也许还没有爬到金字塔的顶端,\
但是只要我在爬,就足以给自己带来令生命感动的瞬间。")

不过以下两种情况除外。

导入模块的语句过长。

注释里的URL。

使用必要的空行可以增加代码的可读性。一般在顶级定义(如函数或者类的定义)之间空两行,而在方法定义之间空一行。另外,在用于分隔某些功能的位置也可以空一行。

通常情况下,在运算符两侧、函数参数之间、逗号“,”两侧建议使用空格进行分隔。

应该避免在循环中使用“+”和“+=”运算符累加字符串。这是因为字符串是不可变的,这样做会创建不必要的临时对象。推荐将每个子字符串加入列表,然后在循环结束后使用join()方法连接列表。

适当使用异常处理结构可提高程序的容错性,但不能过分依赖异常处理结构,适当的显式判断还是必要的。

2.3 关键字与标识符

2.3.1 关键字

关键字是Python中被赋予了特定意义的一些单词,开发程序时,不可以把关键字作为变量、函数、类、模块和其他对象的名称来使用。Python的常用关键字如表2.1所示。

表2.1 Python的常用关键字

关键字

def

del

elif

else

except

finally

for

from

False

global

if

import

in

is

lambda

nonlocal

not

None

or

pass

raise

return

try

True

while

with

yield

注意

在Python的关键字中,True、False、None这3个关键字的首字母需要大写,其他关键字全部小写,如果写错,将会影响程序执行或者导致报错。代码如下。

password=['123456','888888','666666']
while True:                            # True首字母大写
    passin = input('请输入您的密码:')
    if passin in password:             # 如果输入的密码在列表中
        print('正在进入系统,请稍后!')
        break                          # 退出系统
    else:
        print('您输入的密码不正确,请重新输入')
        continue                       # 继续输入密码

运行程序,分别输入密码123000和888888,运行结果如下。

请输入您的密码:123000
您输入的密码不正确,请重新输入
请输入您的密码:888888
正在进入系统,请稍后!

如果将关键字True写成true,则程序会把true当成没有定义的变量,报出如下错误。

NameError: name 'true' is not defined

大部分关键字在程序代码中起着重要的作用,如循环语句中的if、elif、else、while、for等,逻辑判断中经常用到的True、False,逻辑运算符and、or、not等。关键字通常在开发环境中以特殊颜色显示。

关键字、内置对象、字符串等通过不同颜色进行区分,以便于代码输入和阅读。

如果在代码中使用这些关键字定义变量、函数、类,将会造成语法冲突,所以一定不要使用关键字定义变量、函数等。如把关键字while作为变量使用,运行程序,将会弹出图2.6所示的错误(语法错误)。代码如下。

while=5

错误所在位置将会以红色高亮显示,如图2.7所示。所以遇到语法错误时,可以看看是否出现了关键字非法使用的情况。

图2.6 while定义变量错误

图2.7 高亮显示错误处

注意

Python中所有的关键字是区分字母大小写的。例如,and、as、if、True、False是关键字,但是And、AS、IF、false、ture就不是关键字,如图2.8和图2.9所示。

图2.8 True是关键字,但true不是关键字

图2.9 if是关键字,但IF不是关键字

多学两招

Python中的关键字可以在IDLE中输入以下两行代码查看。

import keyword
keyword.kwlist

运行结果如图2.10所示。

图2.10 查看Python中的关键字

2.3.2 标识符

标识符可以简单地理解为名字,它主要用来标识变量、函数、类、模块和其他对象。

Python标识符命名规则如下。

由字母A~Z和a~z、下画线“_”和数字组成,并且第一个字符不能是数字。

不能使用Python中的关键字。

不能包含空格、“@”、“%” 以及 “$” 等特殊字符。

例如,下面是合法的标识符。

USERID
book
user_id
myclass                  # 关键字和其他字符组合是合法的标识符
book01                   # 数字在标识符的后面是可以的

下面是非法的标识符。

4word                    # 以数字开头
class                    # class是Python中的关键字
@book                    # 不能使用特殊字符"@"
book name                # book和name之间包含了特殊字符空格

注意

在Python中,标识符的字母是严格区分大小写的。两个同样的单词,如果大小写不一样,所代表的意义是完全不同的。例如,下面3个变量是完全独立、毫无关系的,就像相貌相似的“三胞胎”,彼此都是独立的个体。

book = 0                 # 全部小写
Book = 1                 # 部分大写
BOOK = 2                 # 全部大写

Python中以下画线开头的标识符有特殊意义,一般应避免使用相似的标识符。

以单下画线开头的标识符(如_width)表示不能直接访问的类属性,也不能通过“from xxx import *”导入。

以双下画线开头的标识符(如__add)表示类的私有成员。

以双下画线开头和结尾的是Python里专用的标识符,如“__init__()”表示构造函数。

说明

在Python中允许使用汉字作为标识符,如“我的名字=”明日科技””,在程序运行时并不会出现错误(如图2.11所示),但建议读者尽量不要使用汉字作为标识符。

图2.11 使用汉字作为标识符

标识符的命名,除了要遵守以上这几条规则外,不同场景中的标识符,其名称也有一定的规范可循。

当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使用下画线分割多个字母,如 game_main、game_register 等。

当标识符用作包的名称时,应尽量短小,也全部使用小写字母,不推荐使用下画线,如 com.mr、com.mr.book 等。

当标识符用作类名时,应采用单词首字母大写的形式。例如,定义一个图书类,可以命名为 Book。

模块内部的类名,可以采用“下画线+首字母大写”的形式,如 _Book。

函数名、类中的属性名和方法名,应全部使用小写字母,多个单词之间可以用下画线分割。

常量命名应全部使用大写字母,单词之间可以用下画线分割。

相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程