Python快速导览
撰写时间:2024-11-03
修订时间:2025-09-08
概述
在众多编程语言中,Python语言近20年来,尤其是自2018年开始,取得了令人瞩目的长足的进步。在TIOBE排行榜中,它以29.90%的比例荣居榜首,并且上升幅度为+7.08%。相比之下,第3名的Java语言上升幅度仅为+1.59%,而其它语言要么是+0.XX%,要么是-0.XX%。
Python能迅猛发展,受到了各个领域的程序员的普遍拥趸,个人认为,主要是基于以下几个原因:
- 语言特性简洁高效
- 社区活跃,周边支持库极其丰富
- 人工智能AI的激励
- 已经形成生命力旺盛的独有生态圈
在Anaconda, Jupyter, Matplotlib, SciPy, scikit-learn等行业翘楚的重磅加持下,Python真正成了天选之子,在AI、科学研究、学习教育等各个领域独占鳌头。
现在,越来越多的软件均已加入Python脚本的插件功能, 在视频制作领域,诸如Premiere, After Effect, Cinema 4D, Blender等等。而在文字表格处理领域方面,就连到微软的Excel也来凑热闹了。
基本语言要素
print函数
使用print函数以在标准输出终端输出信息。
类似C语言的字符串输出:
F-string,带格式的字符串字面符,以字符f
或F
作为字符串字面符的前缀:
使用字符串的format方法:
数字的格式化:
时间的格式化:
当print函数有多个参数,在打印时,默认情况下,以空格来分隔每个参数,并在结果后面添加一个回车:
可使用命名参数来设置不同的状态:
注释语句
使用字符#
来注释语句。在任一行语句中,字符#
后面的语句将不被执行。
没有块注释。但可通过多行字符串字面符 ('''...''') 或 ("""...""") 的方式将代码转换为字符串。字符串中的源代码不会被执行,从而实现了注释的效果。此外,在运行时,此字符串会被分配内存,但由于没有被赋值于变量,字符串不会被使用。这也是Python在类、函数、方法中进行文档注释的标准方式。
基本算术运算符
复合赋值运算符:
简单的数据类型
简单的数据类型包括整数、浮点数、字符串,以及布尔型。
与JavaScript不同的是,Python不支持数据类型的自动转换:
此时,应使用int()或str()函数来进行转换:
语句与变量
Python声明无需指定数据类型。一行为一个语句,语句后面无需带有分号;
结尾。
可以同时声明多个变量并赋于初始值。
无需第三方变量,可直接实现两数值交换。
字符串
基本用法
行内分隔符为 ('...') 或 ("..."),多行分隔符为 ("""...""")。
当有些字符串太长,我们希望在输入时断行,但输出时却作为一个整个字符串输出,则可在各个字符串字面符之间加上空格,且在每一行的字符串字面符后面加上一个反斜杆\
(backslash) 字符,表示,下行的内容不另起新行,而应与本行的内容合并
。
字符串是由字符组成的数组,因此可使用数组的特性。
使用len函数来计算基于Unicode编码的字符串长度。
字符串可以乘以一个数值n,即使用n个相同的字符串来构建一个新的字符串。
字符串的join()方法
字符串有一join方法,可用于生成一个使用特定连接符来连接序列(元素类型须为字符串)各个元素的字符串。
将字符串中的每个字母拆开后,使用separator来连接。需注意的是,须调用separator的join方法而不是string的join方法。
join方法的参数可以是tuple或list,但其元素的数据类型须为字符串。
如果一个tuple对象的元素的数据类型为非字符串时,可以使用str函数来将整个tuple对象转换为一个字符串,但需注意结果字符串中也包含了括号(
、)
、空格、以及逗号)
。这些元素也将参与连接。结果看起来很怪异。
此时,可自行先将每个元素转换为字符串,然后再拼接为一个新字符串,最后在新字符串上进行连接。
List
Python中的list,就是其他编程语言中的数组。
声明
上面的list()函数是list的构造函数,参数类型为可遍历对象 (iterable)。
Python有多个内置的数据类型,其类名均为小写,如int, list, tuple, str, dict,等等。它们都有名称与类名相同的构造函数。如int(), list(), tuple(), str(), dict(),等等。
下面的代码将犯下一个无意之错:
第1行先声明了一个名为list的变量,第3行准备调用list构造函数时出错了:变量list不是可被调用的对象。
因此在声明变量时,变量名称最好不要与这些内置数据类型的名称相同。
使用range()函数构建
内置函数range可用以生成一系列可遍历的数值,其结果可用作list函数的参数。
List comprehensions
可以基于一个序列的值,使用简短的方式来生成一个list。
这种方式,称为list comprehensions。
可以将上面的x * 2这一部分,再换成另一个list comprehensions,从而构建嵌套的list comprehensions。
切割
设有以下list:
| element | 5 | 10 | 15 | 20 | 25 |
|---|---|---|---|---|---|
| index | 0 | 1 | 2 | 3 | 4 |
下面进行各种各样的切割:
切割出的list对象是新对象。
但当在切割出的list对象上直接赋值时,却是针对原来的对象来操作。
删除list元素
可以很方便地删除list中的元素。
删除一组连续排列的元素。
使用clear方法来删除list的所有元素。
in操作符
max(), min()
内建函数max, min可直接求出list的最大值与最小值。
count()
list的count方法返回特定元素出现的次数。
append()
list的append方法用于添加新元素。
判断list是否为空
第一种方法:使用not操作符。
第二种方法:使用len函数。
第三种方法:使用bool函数。
bool函数返回list的状态。当list为空值时,返回False。
Tuple
tuple,中文为元组,几乎与list一样。最主要的区别在于,list的内容是可以改写的 (mutable),而tuple的内容是不可改写的 (immutable)。
声明一个tuple时,有2种形式。一种是将序列值使用(...)
括起来;另一种是不使用括号。
上面第二种方式,将序列中的各个元素都打包为一个tuple中。因此称为tuple packing (元组打包)。
声明一个空tuple:
声明一个只带有1个元素的tuple时,须在元素后面加上一个逗号,
:
Dictionaris
dict是一种含有键、值的对象, 中文为字典。
基本用法
上面,当键的数据类型为字符串时,需显式地使用字符串字面符。这一点与JavaScript不同。作为对比,JavaScript的代码如下:
使用[]操作符来访问dict的键值。但不能使用.操作符。
可以在声明dict后,动态地添加或删除键值对。
可以设置为键的数据类型
键的类型为不可修改 (immutable) 的类型。因此字符串与数字 (numbers) 可以设置为键。
当tuple如果只包含字符串、数字、或tuple时,则该tuple可以设为键。
list因是可改写的,因此不能成为dict的键名。
与键相关的函数与操作符
可对dict调用list函数,返回由dict的键名组成的list。
对dict调用len函数,返回dict的键值对的数量。
对dict调用sorted函数,返回经排序的由dict的键名组成的list。
in操作符用于判断dict中是否存在特定键名。
构造器
dict构造函数用以创建dict实例。参数数量为1个,类型为可遍历对象 (iterable)。
上面使用一个list作为构造函数的参数,则此list中每个元素都用于设置dict的键名与键值。
每个元素都使用tuple的数据类型,且tuple的每个元素数量均为2。
由于list与tuple均属于可遍历对象,因此上面构造函数的参数中,里外两层都可以随意使用这两种数据类型。
当键名类型为字符串时,可使用关键字参数 (keyword arguments) 的方式。
可使用以下代码来创建一个dict实例。
这种方式,称为dict comprehensions。
遍历
使用for语句遍历一个dict时,每次返回其键名。
可显式地调用dict的keys方法,以供遍历。
可调用dict的items方法,返回一个dict_items的对象。
外层为list,里层为由键名值对所构成的tuple。
使用for语句遍历该对象:
可调用dict的values方法,返回键值序列。然后调用zip函数以依序创建各个键的名值对序列,以供遍历。
in操作符
当对dict使用in操作符时,其效果是判断dict是否存在特定的键名。
等同于下面显式调用keys方法的代码:
若要判断dict是否含有特定的键值,可显式地调用values方法:
参考资源
流程控制语句
不能用{}
来构成一个语句块。相反,在语句块开始的地方使用:
来声明语句块开始,下面紧随的各行,只要有右缩进,则视为语句块内的内容;取消右缩进来结束语句块的声明。
if语句
如果整个语句块只有1条语句,可将这条语句写在同一行上。
布尔值分别为True及False。
在测试布尔值时,可使用is操作符来代替==操作符。
使用布尔操作符and, or, not来构建复合条件语句。
or操作符有短路功能。各表达式从左到右,如果左边的表达先返回True,则后续表达式不再被执行。
上面,or操作符的左边表达式返回True,则不管右边表达式为True还是False,均不影响or的运算结果。因此,右边表达式将不被执行。
布尔操作符有以下权重优先次序:not > and > or。权重大的操作符优先执行。
上面代码,先执行not y < 20,返回True,再执行x > 5 or True,最后结果为True。
执行次序:
- let value =
not z == 3 - let value =
y < 20 and value - let value =
x > 5 or value
但一般情况下,我们无需记住这些操作符的权重次序,直接使用括号(...)
即可。
布尔表达式可以形成一个链式比较 (chained comparison)。下面先使用and操作符来判断一个数值是否在特定值域内:
使用链式比较,则可改写为:
JavaScript同样支持这种语法特性:
可以通过三元运算符,将一条if ... else语句写成一行语句:
for语句
遍历各种对象
使用for语句以遍历可遍历的对象。
遍历str:
遍历range:
遍历list:
遍历list时若需要访问索引值,可对list对象依序调用len及range函数,以生成索引序列值。
遍历dict:
流程流转控制
使用continue语句来跳过本轮遍历。
使用break语句来中止遍历。
经常有这种情况:在遍历过程中当找到特定元素时,调用break来中止遍历;而搜索全体元素后如果找不到,我们需要额外设置一个状态变量并在遍历完成后来检查它。下面是相应的JavaScript代码:
而在Python中的for语句中,我们可以使用一个else语句来实现此目标。
Python的逻辑是:所有遍历完成后,如果break语句未被执行到,则执行else语句块。Python真的很体贴程序员啊。
在编写格式上,这种else须与for相对齐。
while语句
在while语句中,只要条件为True,则继续执行。
需注意的是,Python没有++运算符, 因此可用+=代替。
在while语句同样存在else语句:
同样,所有遍历完成后,如果break语句未被执行到,则执行else语句块。
match语句
基本形式:
函数
更多细节,详见函数。
