Python
是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python
优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。
Python 官网 上免费提供了 Python
解释器和扩展的标准库,包括源码和适用于各操作系统的机器码形式,并可自由地分发。Python 官网还包含许多免费的第三方 Python 模块、程序和工具发布包及文档链接。
Python 解释器易于扩展,使用 C
或 C++
(或其他 C 能调用的语言)即可为 Python 扩展新功能和数据类型。Python 也可用作定制软件中的扩展程序语言。
本教程只是简单介绍了 Python 语言概念和功能。读者在阅读本教程时最好使用 Python 解释器以便随时动手练习。本教程中的所有示例都是相互独立的并可离线阅读。
本教程对每一个功能的介绍并不完整,甚至没有涉及全部常用功能,只是介绍了 Python 中最值得学习的功能,旨在让读者快速感受一下 Python 的特色。学完本教程的读者可以阅读和编写 Python 模块和程序,也可以继续学习 Python 标准库。
如果您的工作主要是用电脑完成的,总有一天您会想能不能自动执行一些任务。比如,对大量文本文件执行查找、替换操作;利用复杂的规则重命名、重排序一堆照片文件;也可能您想编写一个小型数据库、或开发专用的图形界面应用,甚至是开发一个简单的游戏。
作为一名专业软件开发人员,您可能要处理 C/C++/Java
库,但编码、编译、测试、再编译这些开发流程太慢了;也许您正在给这些库开发测试套件,但总觉得这项工作真是枯燥乏味。又或许,您开发了个使用扩展语言的软件,却不想为这个软件专门设计一种新语言。
那么,Python
正好能满足您的需要。
你可以针对这些任务编写 Unix shell
脚本或 Windows
批处理文件,但 shell
脚本擅长的是移动文件和改变文本数据,而不适合编写 GUI
应用或游戏。 你可以编写 C/C++/Java
程序,但即使只完成一个初始版程序也需要耗费很长的开发时间。 Python 则更为简单易用,同时支持 Windows, macOS
和 Unix
操作系统,并能帮助你更快速地完成工作。
Python 虽然简单易用,但它可是真正的编程语言,提供了大量的数据结构,也支持开发大型程序,远超 shell
脚本或批处理文件;Python 提供的错误检查比 C
还多;作为一种“非常高级的语言”,它内置了灵活的数组与字典等高级数据类型。正因为配备了更通用的数据类型,Python比 Awk
,甚至 Perl
能解决更多问题,而且,很多时候,Python 比这些语言更简单。
Python 支持把程序分割为模块,以便在其他 Python 程序中复用。它还内置了大量标准模块,作为开发程序的基础 —— 您还可以把这些模块当作学习 Python 编程的实例。这些模块包括 I/O、系统调用、套接字,甚至还包括 Tk 图形用户界面工作套件。
Python 是一种 解释型语言 ,不需要编译和链接,可以节省大量开发时间。它的解释器实现了交互式操作,轻而易举地就能试用各种语言功能,编写临时程序,或在自底向上的程序开发中测试功能。同时,它还是一个超好用的计算器。
Python 程序简洁、易读,通常比实现同种功能的 C、C++、Java
代码短很多,原因如下:
Python “可以扩展”:会开发 C 语言程序,就能快速上手为解释器增加新的内置函数或模块,不论是让核心程序以最高速度运行,还是把 Python 程序链接到只提供预编译程序的库(比如,硬件图形库)。只要下点功夫,就能把 Python 解释器和用 C 开发的应用链接在一起,用它来扩展和控制该应用。
顺便提一句,Python语言的命名源自 BBC 的 “Monty Python 飞行马戏团”,与爬行动物无关(Python 原义为“蟒蛇”)
本教程的其他部分将利用各种示例,介绍 Python 语言、系统的功能,开始只是简单的表达式、语句和数据类型,然后是函数、模块,最后,介绍一些高级概念,如,异常、用户定义的类等功能。
在可用的机器上 Python 解释器通常被安装为 /usr/local/bin/python3.13
;将 /usr/local/bin
加入你的 Unix shell
搜索路径就可以通过键入以下命令来启动它:
python3.13
这样,就可以在 shell 中运行 Python 了 。因为可以选择安装目录,解释器也有可能安装在别的位置;如果还不明白,就去问问身边的 Python 大神或系统管理员。(例如,常见备选路径还有 /usr/local/python
。)
在 Windows机器上当你从 Microsoft Store 安装 Python 之后,python3.13 命令将可使用。 如果你安装了 py.exe 启动器,你将可以使用 py 命令。
在主提示符中,输入文件结束符(Unix 里是 Control-D
,Windows里是 Control-Z
),就会退出解释器,退出状态码为 0。如果不能退出,还可以输入这个命令:quit()。
在支持 GNU Readline 库的系统中,解释器的行编辑功能包括交互式编辑、历史替换、代码补全等。检测是否支持命令行编辑最快速的方式是,在首次出现 Python 提示符时,输入 Control-P
。听到“哔”提示音,说明支持行编辑;请参阅附录 交互式编辑和编辑历史,了解功能键。如果没有反应,或回显了 ^P
,则说明不支持行编辑;只能用退格键删除当前行的字符。
解释器的操作方式类似 Unix Shell:用与 tty 设备关联的标准输入调用时,可以交互式地读取和执行命令;以文件名参数,或标准输入文件调用时,则读取并执行文件中的 脚本。
另一种启动解释器的方式是 python -c command [arg] ...
,这将执行 command 中的语句,相当于 shell 的 -c 选项。 由于 Python 语句经常包含空格或其他会被 shell 特殊对待的字符,通常建议用引号将整个 command 括起来。
Python 模块也可以当作脚本使用。输入:python -m module [arg] ...
,会执行 module 的源文件,这跟在命令行把路径写全了一样。
在交互模式下运行脚本文件,只要在脚本名称参数前,加上选项 -i 就可以了。
解释器读取命令行参数,把脚本名与其他参数转化为字符串列表存到 sys
模块的 argv
变量里。执行 import sys
,可以导入这个模块,并访问该列表。该列表最少有一个元素;未给定输入参数时,sys.argv[0]
是空字符串。给定脚本名是 '-'
(标准输入)时,sys.argv[0]
是 '-'
。使用 -c command 时,sys.argv[0]
是 ‘c’。如果使用选项 -m module,sys.argv[0]
就是包含目录的模块全名。解释器不处理 -c command 或 -m module 之后的选项,而是直接留在 sys.argv
中由命令或模块来处理。
在终端(tty)输入并执行指令时,解释器在 交互模式(interactive mode) 中运行。在这种模式中,会显示 主提示符,提示输入下一条指令,主提示符通常用三个大于号(>>>)
表示;输入连续行时,显示 次要提示符,默认是三个点(...)
。进入解释器时,首先显示欢迎信息、版本信息、版权声明,然后才是提示符:
python3.13
Python 3.13 (default, April 4 2023, 09:25:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
输入多行架构的语句时,要用连续行。以 if
为例:
the_world_is_flat = True
if the_world_is_flat:
print("Be careful not to fall off!")
默认情况下,Python 源码文件的编码是 UTF-8
。这种编码支持世界上大多数语言的字符,可以用于字符串字面值、变量、函数名及注释 —— 尽管标准库只用常规的 ASCII
字符作为变量名或函数名,可移植代码都应遵守此约定。要正确显示这些字符,编辑器必须能识别 UTF-8 编码,而且必须使用支持文件中所有字符的字体。
如果不使用默认编码,则要声明文件的编码,文件的 第一 行要写成特殊注释。句法如下:
# -*- coding: encoding -*-
其中,encoding 可以是 Python 支持的任意一种 codecs。
比如,声明使用 Windows-1252 编码,源码文件要写成:
# -*- coding: cp1252 -*-
第一行 的规则也有一种例外情况,源码以 UNIX “shebang” 行 开头。此时,编码声明要写在文件的第二行。例如:
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
注意:
Unix 系统中,为了不与同时安装的 Python 2.x 冲突,Python 3.x 解释器默认安装的执行文件名不是 python。
Python 注释以 #
开头,直到该物理行结束。注释可以在行开头,或空白符与代码之后,但不能在字符串里面。字符串中的 # 号就是 # 号注释用于阐明代码,Python 不解释注释,键入例子时,可以不输入注释。
示例如下:
# 这是第一条注释
spam = 1 # 而这是第二条注释
# ... 而这是第三条!
text = "# 这不是注释因为它是在引号之内。"
解释器像一个简单的计算器:你可以输入一个表达式,它将给出结果值。 表达式语法很直观:运算符 +
, -
, *
和 /
可被用来执行算术运算;圆括号 (()
) 可被用来进行分组。 例如:
2 + 2
50 - 5*6
(50 - 5*6) / 4
8 / 5 # 除法运算总是返回一个浮点数
整数(如,2、4、20 )的类型是 int,带小数(如,5.0、1.6 )的类型是 float。本教程后半部分将介绍更多数字类型。
除法运算 (/)
总是返回浮点数。 如果要做 floor division 得到一个整数结果你可以使用 //
运算符;要计算余数你可以使用 %
:
17 / 3 # 经典除法运算返回一个浮点数
17 // 3 # 向下取整除法运算会丢弃小数部分
17 % 3 # % 运算返回相除的余数
5 * 3 + 2 # 向下取整的商 * 除数 + 余数
Python 用 **
运算符计算乘方
5 ** 2 # 5 的平方
2 ** 7 # 2 的 7 次方
等号(=)
用于给变量赋值。赋值后,下一个交互提示符的位置不显示任何结果:
width = 20
height = 5 * 9
width * height
如果变量未定义(即,未赋值),使用该变量会提示错误:
n # 试图访问一个未定义的变量
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
Python 全面支持浮点数;混合类型运算数的运算会把整数转换为浮点数:
4 * 3.75 - 1
交互模式下,上次输出的表达式会赋给变量 _。把 Python 当作计算器时,用该变量实现下一步计算更简单,例如:
tax = 12.5 / 100
price = 100.50
price * tax
price + _
round(_, 2)
最好把该变量当作只读类型。不要为它显式赋值,否则会创建一个同名独立局部变量,该变量会用它的魔法行为屏蔽内置变量。
除了 int
和 float
,Python 还支持其他数字类型,例如 Decimal 或 Fraction。Python 还内置支持 复数,后缀 j 或 J 用于表示虚数(例如 3+5j
)。
除了数字 Python 还可以操作文本(由 str
类型表示,称为“字符串”)。 这包括字符 “!”, 单词 “rabbit”, 名称 “Paris”, 句子 “Got your back.” 等等. “Yay! 😃”。 它们可以用成对的单引号 ('...'
) 或双引号 ("..."
) 来标示,结果完全相同
'spam eggs' # single quotes
"Paris rabbit got your back :)! Yay!" # double quotes
'1975' # digits and numerals enclosed in quotes are also strings
要标示引号本身,我们需要对它进行“转义”,即在前面加一个 \
。 或者,我们也可以使用不同类型的引号:
'doesn\'t' # 使用 \' 来转义单引号...
"doesn't" # ...或者改用双引号
'"Yes," they said.'
"\"Yes,\" they said."
'"Isn\'t," they said.'
在 Python shell 中,字符串定义和输出字符串看起来可能不同。 print()
函数会略去标示用的引号,并打印经过转义的特殊字符,产生更为易读的输出:
s = 'First line.\nSecond line.' # \n 表示换行符
s # 不用 print(),特殊字符将包括在字符串中
print(s) # 用 print(),特殊字符会被转写,因此 \n 将产生一个新行
如果不希望前置 \
的字符转义成特殊字符,可以使用 原始字符串,在引号前添加 r
即可:
print('C:\some\name') # 这里 \n 表示换行符!
print(r'C:\some\name') # 请注意引号前的 r
原始字符串还有一个微妙的限制:一个原始字符串不能以奇数个 \ 字符结束;
字符串文字可以跨越多行。一种方法是使用三重引号:"""..."""
或 '''...'''
。行尾会自动包含在字符串中,但可以通过在行尾添加 \ 来避免这种情况。 在下面的示例中,不包含首行换行符::
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")
字符串可以用 +
合并(粘到一起),也可以用 *
重复:
# 3 乘以 'un',再加 'ium'
3 * 'un' + 'ium'
相邻的两个或多个 字符串字面值 (引号标注的字符)会自动合并:
'Py' 'thon'
'Python'
拼接分隔开的长字符串时,这个功能特别实用:
text = ('Put several strings within parentheses '
'to have them joined together.')
text
'Put several strings within parentheses to have them joined together.'
这项功能只能用于两个字面值,不能用于变量或表达式:
prefix = 'Py'
prefix 'thon' # 不能拼接变量和字符串字面值
File "<stdin>", line 1
prefix 'thon'
^^^^^^
SyntaxError: invalid syntax
('un' * 3) 'ium'
File "<stdin>", line 1
('un' * 3) 'ium'
^^^^^
SyntaxError: invalid syntax
合并多个变量,或合并变量与字面值,要用 +
:
合并多个变量,或合并变量与字面值,要用 +:
字符串支持 索引 (下标访问),第一个字符的索引是 0。单字符没有专用的类型,就是长度为一的字符串:
word = 'Python'
word[0] # 0 号位的字符
'P'
word[5] # 5 号位的字符
'n'
索引还支持负数,用负数索引时,从右边开始计数:
word[-1] # 最后一个字符
'n'
word[-2] # 倒数第二个字符
'o'
word[-6]
'P'
注意,-0
和 0
一样,因此,负数索引从 -1
开始。
除了索引操作,还支持 切片。 索引用来获取单个字符,而 切片 允许你获取子字符串:
word[0:2] # 从 0 号位 (含) 到 2 号位 (不含) 的字符
'Py'
word[2:5] # 从 2 号位 (含) 到 5 号位 (不含) 的字符
'tho'
切片索引的默认值很有用;省略开始索引时,默认值为 0,省略结束索引时,默认为到字符串的结尾:
word[:2] # 从开头到 2 号位 (不含) 的字符
'Py'
word[4:] # 从 4 号位 (含) 到末尾
'on'
word[-2:] # 从倒数第二个 (含) 到末尾
'on'
注意,输出结果包含切片开始,但不包含切片结束。因此,s[:i] + s[i:] 总是等于 s:
word[:2] + word[2:]
'Python'
word[:4] + word[4:]
'Python'
还可以这样理解切片,索引指向的是字符 之间 ,第一个字符的左侧标为 0,最后一个字符的右侧标为 n ,n 是字符串长度。例如:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
第一行数字是字符串中索引 0…6 的位置,第二行数字是对应的负数索引位置。i 到 j 的切片由 i 和 j 之间所有对应的字符组成。
对于使用非负索引的切片,如果两个索引都不越界,切片长度就是起止索引之差。例如, word[1:3] 的长度是 2。
索引越界会报错:
word[42] # word 只有 6 个字符
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
但是,切片会自动处理越界索引:
word[4:42]
'on'
word[42:]
''
Python 字符串不能修改,是 immutable 的。因此,为字符串中某个索引位置赋值会报错:
word[0] = 'J'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
word[2:] = 'py'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
要生成不同的字符串,应新建一个字符串:
'J' + word[1:]
'Jython'
word[:2] + 'py'
'Pypy'
内置函数 len()
返回字符串的长度:
s = 'supercalifragilisticexpialidocious'
len(s)
34
Python 支持多种 复合 数据类型,可将不同值组合在一起。最常用的 列表 ,是用方括号标注,逗号分隔的一组值。列表 可以包含不同类型的元素,但一般情况下,各个元素的类型相同:
squares = [1, 4, 9, 16, 25]
squares
[1, 4, 9, 16, 25]
和字符串(及其他内置 sequence 类型)一样,列表也支持索引和切片:
squares[0] # 索引操作将返回条目
1
squares[-1]
25
squares[-3:] # 切片操作将返回一个新列表
[9, 16, 25]
列表还支持合并操作:
squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
与 immutable 字符串不同, 列表是 mutable类型,其内容可以改变:
cubes = [1, 8, 27, 65, 125] # 这里有点问题
4 ** 3 # 4 的立方是 64,不是 65!
64
cubes[3] = 64 # 替换错误的值
cubes
[1, 8, 27, 64, 125]
你也可以在通过使用 list.append()
方法,在列表末尾添加新条目(我们将在后面介绍更多相关的方法):
cubes.append(216) # 添加 6 的立方
cubes.append(7 ** 3) # 和 7 的立方
cubes
[1, 8, 27, 64, 125, 216, 343]
Python 中的简单赋值绝不会复制数据。 当你将一个列表赋值给一个变量时,该变量将引用 现有的列表。你通过一个变量对列表所做的任何更改都会被引用它的所有其他变量看到。:
rgb = ["Red", "Green", "Blue"]
rgba = rgb
id(rgb) == id(rgba) # 它们指向同一个对象
True
rgba.append("Alph")
rgb
["Red", "Green", "Blue", "Alph"]
切片操作返回包含请求元素的新列表。以下切片操作会返回列表的 浅拷贝:
correct_rgba = rgba[:]
correct_rgba[-1] = "Alph"
correct_rgba
["Red", "Green", "Blue", "Alph"]
rgba
["Red", "Green", "Blue", "Alph"]
为切片赋值可以改变列表大小,甚至清空整个列表:
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
# 替换一些值
letters[2:5] = ['C', 'D', 'E']
letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
# 现在移除它们
letters[2:5] = []
letters
['a', 'b', 'f', 'g']
# 通过用一个空列表替代所有元素来清空列表
letters[:] = []
letters
[]
内置函数 len()
也支持列表:
letters = ['a', 'b', 'c', 'd']
len(letters)
4
还可以嵌套列表(创建包含其他列表的列表 例如:
a = ['a', 'b', 'c']
n = [1, 2, 3]
x = [a, n]
x
[['a', 'b', 'c'], [1, 2, 3]]
x[0]
['a', 'b', 'c']
x[0][1]
'b'
当然,我们还能用 Python 完成比二加二更复杂的任务。 例如,我们可以像下面这样写出 斐波那契数列 初始部分的子序列:
# 斐波那契数列:
# 前两项之和即下一项的值
a, b = 0, 1
while a < 10:
print(a)
a, b = b, a+b
0
1
1
2
3
5
8
本例引入了几个新功能。
第一行中的 多重赋值:变量 a 和 b 同时获得新值 0 和 1 最后一行又用了一次多重赋值,体现了,等号右边的所有表达式的值,都是在这一语句对任何变量赋新值之前求出来的——求值顺序为从左到右。
while 循环只要条件(这里是 a < 10)为真就会一直执行。Python 和 C 一样,任何非零整数都为真,零为假。这个条件也可以是字符串或列表类型的值,事实上,任何序列都可以:长度非零就为真,空序列则为假。示例中的判断只是最简单的比较。比较操作符的写法和 C 语言一样: < (小于)、 > (大于)、 == (等于)、 <= (小于等于)、 >= (大于等于)及 != (不等于)。
循环体 是 缩进的:缩进是 Python 组织语句的方式。在交互式命令行里,得为每个缩进的行输入空格(或制表符)。使用文本编辑器可以实现更复杂的输入方式;所有像样的文本编辑器都支持自动缩进。交互式输入复合语句时,要在最后输入空白行表示完成(因为解析器不知道哪一行代码是代码块的最后一行)。注意,同一块语句的每一行的缩进相同。
print()
函数输出给定参数的值。 除了可以以单一的表达式作为参数(比如,前面的计算器的例子),它还能处理多个参数,包括浮点数与字符串。 它输出的字符串不带引号,且各参数项之间会插入一个空格,这样可以实现更好的格式化操作,就像这样:
i = 256*256
print('The value of i is', i)
The value of i is 65536
关键字参数 end
可以取消输出后面的换行, 或用另一个字符串结尾:
a, b = 0, 1
while a < 1000:
print(a, end=',')
a, b = b, a+b
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,