简介
本书是一本语法与实践相结合的
Python
入门教程,全书分为上、下篇。上篇为“
Python
语法与实践”,以简明的语言、易懂的案例介绍Python
的变量与对象、运算符与表达式、控制语句、函数、内置数据类型,Python的面向对象特征,如类与对象、派生类、类的实例与静态方法等
Python
语言的核心语法,以及迭代器与可迭代对象、闭包、装饰器、@property
、深拷贝与浅拷贝等高级语言特征,还介绍了错误与异常、调试。在核心语法部分采用来自数据结构、游戏编程、信息管理、机器学习、强化学习等其他学科和领域的一些经典问题作为实战演练,展示了Python解决实际问题的强大功能,以提高初学者的实际编程能力,使其尽快熟悉语法的使用。
只有通过具体、长期的实战训练,才能逐步精通一种编程语言。语法知识可以在短期内学习并
理解,但只有经过大量实战训练才能真正熟练掌握一种编程语言。
一:Python介绍
1.1.1计算机是什么:
计算机是一种根据指令对数据进行处理的通用计算设备。每台计算机都有一个称为“中央处理单元(CPU)”的微处理器芯片用于执行对数据进行处理的指令,不同计算机的指令集是不一样的。
1.计算机指令:
计算机接收一系列指令作为输入,然后逐个处理它们,最后输出某些信息以显示它已完成的操作。这一过程类似人们日常生活中通过一系列操作步骤完成一个任务的过程。
程序:告诉计算机如何执行复杂任务的指令序列
算术:加、减、乘或除。执行这些指令的操作称为算术操作(运算)。
比较:比较两个数字,查看哪个值更大,或者它们是否相等。执行这些指令的操作称为逻辑操作(运算)
分支:跳转到程序的其他指令处,并从那里继续运行程序。执行这些操作的指令称为控制语句。
2.计算机的组成部分
计算机包含以下四种主要类型的组件或设备:
输入设备:允许计算机从用户处接收信息的设备,包括键盘、鼠标、扫描仪和麦克风。
处理组件:处理信息的计算机组件。计算机的主要处理组件是中央处理单元(
CPU
),但在
现代计算机中也可能有其他处理单元。例如,许多图形卡都带有图形处理单元(
GPU
),
GPU
以前只用于处理图形,但现在也可用于处理通用程序。
存储组件:存储信息的组件,包括主存储器(也称“
内存
”)和二级存储器(如硬盘驱动器、
CD
或闪存盘等外部存储器)。存储组件是存储程序的指令和数据的地方。
输出设备:用于向用户显示信息的任何设备,包括显示器、扬声器和打印机。
可以用自动售票机来理解计算机的组件或设备(尽管自动售票机严格地讲并不是计算机)。
输入设备:投币口和选择按钮是自动售票机的输入设备。
处理组件:当使用者进行选择时,自动售票机执行的操作包括验证是否有满足条件的票;
验证身份信息;检查和验证是否收到足够的资金;修改数据库;计算差额。执行所有 这些操作的机器部分可以看作处理组件。
输出设备:显示结果;打印票据;退回多余资金。
存储组件:保存销售数据及价格等信息。
3.中央处理单元(CPU)
CPU
是计算机中最重要的部分,是计算机的“大脑”,主要负责计算、处理数据、控制其他设
备等工作。
它有以下几个重要的子组件:
算术/
逻辑单元(
ALU
):执行算术和比较运算。
控制单元:确定下一个要执行的指令。
寄存器:形成一个高速存储区以
保存
临时的运行结果。不同种类的 CPU
可以处理不同的指令集, 如
Intel IA-32
、
x86-64
、
IBM PowerPC
或
ARM
等。
4.存储器(Memory)
计算机将信息(程序、数据)存储在存储器中,存储器分为两类,
主存储器
(也称
内存
)和
辅助存
储器
(也称
外存
)。
主存储器
直接连接
CPU
(或其他处理单元),通常称为
随机存取存储器(
RAM
)
。计算机关闭时,
大多数主存储器都会丢失其内容,即具有“易失性”。
可以将主存储器看作一组一排乘一列的存储器单元,每个存储器单元都可以通过其存储器地址
寻址。第一个单元的地址为零,并且每个后续单元的地址比它之前的地址多一个,正如一个班级的
学生的学号从
1
开始依次递增一样。每个存储器单元只能保存长度固定的用二进制表示的数值,但
CPU
可以随时用新的数值替换原有数值。
辅助存储器
比主存储器价格便宜,但可以存储更多内容。虽然辅助存储器的存储速度比主存储
器慢得多,但它是非易失性的,也就是说,即使在计算机关闭后其保存的信息也会保留,如硬盘和
闪存盘。
计算机的操作系统提供操作辅助存储器的高级接口,这些接口允许信息以文件的形式保存在辅
助存储器中,并且文件组织呈目录式的层级结构。接口和层级结构通常称为“文件系统”。
1.1.2
计算机编程
1
.算法
(
Algorithms
)
算法是完成某个任务或解决某个问题的一系列步骤(指令)。
2
.编程和程序
编程就是使用计算机的指令来表示算法,即将算法转换为计算机可以执行的程序。程序就是算
法在计算机中的表示和实现。
3
.二进制
因为计算机硬件是由很多晶体管元器件组成的,而晶体管元器件只有“开”和“关”两种状态,
所以
1
个晶体管只能表示两个数字:
0
和
1
。通过多个表示
0
或
1
的晶体管元器件可以组合出更复
杂的数值,如整数或字符等。无论多么复杂的程序数据,在计算机硬件中都是以二进制(
0
和
1
)的
形式表示的。
1
个晶体管元器件只能表示
1
位二进制数(
0
或
1
),称为
1
比特
(
Bit
),简记为
b
或
1
位。
8
个晶
体管元器件可以表示
8
位二进制数字,即可表示
2
8
个不同的数值。
8
位二进制数,称为
1
字节
(
Byte
,
简记为
B
)。
16
个晶体管元器件可以表示
16
位二进制数,即
2B
。
8×1024 个晶体管元器件可以表示 1024B,即 1KB。 8×1024×1024 个晶体管元器件可以表示 1024KB,即 1MB。 8×1024×1024×1024 个晶体管元器件可以表示 1024MB,即 1GB。
4
.机器语言
(
machine language
)
计算机中的指令和数据都是用
0
和
1
表示的。机器语言是用这种二进制数表示的、计算机能够
直接识别和执行的机器指令集合。
例如,下列是将
17
和
20
相加的机器指令(采用
Intel 8086
机器语言,
Intel Pentium
机器语言
的子集):
1011 0000 0001 0001
0000 0100 0001 0100
1010 0010 0100 1000 0000 0000
第一行告诉计算机将
17
复制到
AL
寄存器:前
4
位二进制数(
1011
)告诉计算机将信息复制到寄
存器中,接下来的
4
位二进制数(
0000
)告诉计算机使用名为
AL
的寄存器,最后
8
位二进制数(
0001
0001
,表示整数
17
)为要复制的数。
用机器语言编写程序非常困难,也很难被人们阅读和理解,但在
20
世纪
40
年代,第一台计算
机的程序员必须这样做,他们通过纸上打孔表示
0
和
1
来编写机器语言的程序,因为没有其他选择!
5
.汇编语言
(
assembly language
)
为了简化编程过程,人们引入了汇编语言。每条汇编指令对应一条机器语言指令,使人们更容
易理解,如上述的机器语言用
8086
汇编语言中等效的加法程序可写为:
MOV AL, 17D
ADD AL, 20D
MOV [SUM], AL
用汇编语言编写的程序不能直接被计算机理解,因此需要翻译步骤。一种叫作“
汇编程序
”的
程序可以将汇编语言编写的程序转化为机器语言程序。
6
.高级语言
(
High-level language
)
虽然汇编语言对机器语言有很大的改进,但它仍然很神秘,而且它的级别太低,和机器语言一
样,即便是完成最简单的任务也需要很多条指令。于是,人们发明了高级语言,使编程变得更加容易。
在高级语言中,一条指令可以对应多条机器语言指令,高级语言采用类人类的语言表示指令,
这使得程序更易于读取和写入。以下是上述代码的
Python
等效代码:
sum = 17 + 20
1.1.4 Python
程序开发步骤
利用
Python
编写程序要经历以下几个步骤。
(
1
)理解问题:如这是一个什么样的问题?输入数据是什么?要产生什么结果?
(
2
)提出算法:解决这个问题的指令(步骤)序列。
(
3
)编写程序:将算法转换成某种编程语言的程序。
(
4
)测试:输入各种可能的不同的数据,检测是否产生预期的结果。
例如,要计算一组数值的平均值,可以按照上述步骤进行。
1.2 Python
语言的主要特征
Python
语言是由
Guido Van Rossum
于
1991
年发明的高级通用编程语言。所谓高级,是指它隐
藏了机器指令的底层细节,并且提供给程序员的是一种人类易于理解的编程语言的语法。所谓通用,
是指它可以开发各类应用程序。和其他高级编程语言,如
C
、
C++
、
Java
等不同,
Python
语言以其
简单易懂和编程效率高而著名。
Python
语言的主要特征如下。
1
.简单易学
Python
语言简单,特别适合初学者学习和使用,使初学者可以把精力集中在问题本身和求解方
7
法上,而不用担心语法、类型等外在因素。
Python
语言对代码的逐句解释执行方式,可以帮助初学
者非常容易发现程序错误。正是由于其简单性,国内外很多教育机构都将
Python
语言作为中小学的
首选编程语言。
2
.编程效率高
同一个任务,用
Python
语言编写的代码往往是用其他编程语言所编写的代码的代码量的几分之
一甚至几十分之一。例如,有时,用其他编程语言可能需要编写几百行甚至几千行代码,用
Python
可能只需编写几行代码。
3
.跨平台
Python
语言是一个跨平台的编程语言,用该语言编写的程序可以在各种操作系统,如
Windows
、
UNIX/Linux
、
Mac
,甚至手机操作系统,如
Android
等,平台上运行。
4
.解释性语言
Python
语言是一个解释型编程语言,而
C
、
C++
则是编译型编程语言。
5
.大量的库
Python
语言提供大量丰富的库,包括
Python
语言自带的标准库和第三方的库。利用这些大量优
秀的库,可以避免程序员重复“造轮子”。
由于
Python
语言的这些优点,
Python
语言不再是程序员的专利,各行各业的人都在使用
Python
语言处理他们的数据和业务。特别是处理大数据和人工智能,都普遍采用
Python
语言作为其编程开
发的语言。目前,世界范围内掀起了学习
Python
语言的热潮,从计算机专业到其他专业的研究开发
人员,从大学生到中小学生,都在学习
Python
语言,国内许多大学、中学、小学都已经将
Python
语言作为首选编程语言。教育部考试中心于
2017
年
10
月
11
日发布了《关于全国计算机等级
(
NCRE
)体系调整》的通知,决定自
2018
年
3
月起,在计算机二级考试加入“
Python
语言程序设
计”科目。
注意:
如何退出
Python
解释器
在
Windows
平台输入【
Ctrl+Z
】,在
Linux
、
UNIX
或
Mac
平台输入【
Ctrl+D
】,将退出
Python
解释器
需要说明的是,
Python
的函数并不是
Python
语言的语法组成部分,
函数
实际上是一组语句的名
字,程序员可以用
Python
语句编写各种各样的函数,每个函数完成一个特定的专门的工作。
Python
语言的实现者除提供了一个执行
Python
语句的解释器外,通常会也提供一些最常使用的函数,它们
被称为“
内置函数
”。程序员也可以定义自己的函数,它们和内置函数在定义和使用上没有区别。通
过将一组排列好的指令语句用函数名命名,就可以多次通过这个
函数名
去调用这个函数名指示的这组
指令语句(也称
代码块
或
程序块
),从而可以避免多次重复编写同样的指令语句,极大地提高了编程效率。
定义每个函数时,都会说明该函数可以接收什么样的数据。在调用该函数时,应该按照该函数
的规范传递合适的数据给这个被调用的函数。这些传递给函数的数据称为“
实际参数
”,这些“实
际参数”都是放在函数名后的圆括号里传递给函数的。例如,
print
(
"hello world!"
)就是通过圆括号
传递给函数
print
()一个双引号括起来的字符串。
1.4.3
运行脚本文件模式
可以将多个
Python
指令(命令)放在一个后缀为
.py
的文本文件中,这种文件称为
Python
脚本
文件
(
script
)。例如,用文本编辑工具,如“记事本”,编辑下列代码:
print
(
1+2
)
print
(
"1+2"
)
print
(
'1+2'
)
print
(
"hello, world!"
)
print
(
"hello", "world!"
)
并保存在命名为“
first.py
”的文件中。在命令行窗口输入:
>>>python first.py
Python
是解释器程序,因此解释器将解释执行
first.py
中的
Python
指令,并输出如下信息:
3
1+2
1+2
hello, world!
helloworld!
注:
函数
print
()默认输出后换行。
函数
print
()可以输出多个量,这些量以逗号隔开,如
print
(
"hello", "world!"
)输出了两个字
符串。
后缀为
.py
的脚本文件也称为
模块
(
module
)
1.5
数和字符的表示
1.5.1
数的表示
1
.十进制和二进制
程序的数据和代码在计算机内部都是以
0
、
1
表示的。而在编程语言中,数的表示方式有多种。
例如,可以用日常生活中常用的“
十进制(
Decimal
)
”,即用
10
个不同的数字
0
、
1
、
2
、
...
、
9
表示
一个数。对于小于
10
的数,可以直接用这
10
个不同数字中的一个来表示或区分就可以了,即
1
位
数字就可以表示不超过
10
的数。但如果一个数超过了
10
,就需要用两位数字、三位数字等多位数
字来表示,即用“
逢十进一
”的多位数表示。例如,一个整数
329
意思是“
3
个
100
”加“
2
个
10
”
加“
1
个
9
”,可以表示成
10
i
的多项式:
329 = 3 × 100 + 2 × 10 + 9 = 3 × 10
2
+ 2 × 10
1
+ 9 × 10
0
但在计算机中,由于计算机硬件,即晶体管元器件,只有“开”和“关”两种状态,也就是在说,
1
个晶体管元器件的开和关状态只能区分两种不同情况,相当于只能表示
0
和
1
两个数字。如果要表示
更大的数字,则可以采用“
逢二进一
”的方法,即采用多个晶体管元器件,即多个
0
和
1
的排列来表
示一个很大的数字。这种用两个数字
0
和
1
表示数的方法就称为“
二进制
”表示法。例如,二进制数
1011
可以表示成
2
i
的多项式:
1011 = 1 × 2
3
+ 0 × 2
2
+ 1 × 2
1
+ 1 × 2
0
= 1 × 8 + 0 ×4 + 1 × 2+ 1 × 1 = 11
即相当于十进制数
11
。
1
位二进制位经常也称为
1
比特(
Bit
,简记为
b
),而
8
位二进制位经常也称为
1
字节(
Byte
,简
记为
B
)。
8
位二进制数对应的十进制数如表
1-1
所示。
使用前
7
位二进制位可以表示
0
到
127
共
128
个不同数字,使用全部
8
位二进制位可以表示一
共
256
,即
2
8
个不同的数。如果有
n
位二进制位,则可以表示
2
n
个不同的数,如正整数
0
到
2
n
1
。
2
.十六进制
当处理更大的二进制数时,则二进制数的位数太多不方便使用。例如:
1011 0101 1101 1001 1110 0101
如果表示成十进制数
11917797
,则只要
8
位。然而,十进制数在某些情况下也不方便,如希望
将从右往左的第
17
位二进制位设置成
1
,就很难用十进制做到。解决方法就是采用“
十六进制
”,
即用十六个不同的数字来表示一个数,即用十进制的
10
个数字
0
、
1
、
2
、
…
、
9
加上英文字母的前
6
个字母
A
(
a
)、
B
(
b
)、
C
(
c
)、
D
(
d
)、
E
(
e
)、
F
(
f
)来分别表示一个数(英文字母不区分大小写)。如
表
1-2
所示是十六进制、十进制和二进制之间的对应关系。
因为
1
位十六进制数对应
4
位二进制数,所以可以将任何
1
个二进制数按照
4
位一组的方式以
十六进制形式表示。例如:
1011 0101 1101 1001 1110 0101
对应十六进制表示法,很简单就可以写出来:
b 5 d 9 e 5