2.4 Python基础知识
如前所述,Python 是一种解释型的高级编程语言,既简单明确,又具有很好的扩展性;既可以非常轻松地用其他语言编写模块供其调用,用 Python 编写的模块也可以通过各种方式轻松地被其他语言调用。所以,一种常见的 Python使用方式是:底层复杂且对效率要求高的模块用 C/C++等语言实现,顶层调用的 API 用 Python 封装,这样可以通过简单的语法实现顶层逻辑。这种特性的好处是,无须将很多时间花费在编程实现上,而可以用更多的时间专注于思考问题的逻辑;尤其对于做算法和深度学习的从业人员,这种方式是非常理想的。所以,在如今的大部分深度学习框架中,其官方接口要么就是 Python 接口,要么支持Python接口[4-6]。
2.4.1 基本语法
标识符
标识符是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。
在 Python 中,标识符由字母、数字、下画线组成。所有标识符可以包括英文字母、数字以及下画线,但不能以数字开头。在 Python 中的标识符区分大小写。
行和缩进
与其他语言相比,学习 Python 时最大的区别是:代码块不使用花括号“{}”来控制类、函数以及其他逻辑判断。Python 最具特色的是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量。
Python 开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。而且,Python 语言利用缩进来表示语句块的开始和退出:增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。可见,缩进成了语法的一部分。例如:
【例2-1】
注释
一行当中,以“#”开始的地方就是注释。三个单引号(''')或三个双引号(""")放在文件的开头、函数的开头或者一个类的开头,就是文档注释。Python解释器会忽略它们。例如:
拆行和一行写多个语句
如果一行太长了,写不下,就需要在下一行接着写。这时可以使用“\”来告诉Python下一行继续,例如:
Python 中一个语句放在一行,行尾可以有选择性地加上“;”,但如果想在一行放多个语句,就需要用“;”来分隔语句。例如:
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一个空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
多个语句构成代码组
缩进相同的一组语句构成一个代码块,称为代码组。像 if、while、def 和class 这样的复合语句,首行以关键字开始,以冒号(:)结束,该行之后的一行或多行代码构成代码组。将首行及后面的代码组称为一个子句。例如:
【例2-2】
保留字
在 Python 中,一切皆对象。因为所有东西都是对象,一个简简单单的赋值操作就可以把系统内置的函数变成一个普通变量,所以一定要注意保留字。
Python中的保留字如表2.2所示。这些保留字不能用作常数、变量或任何其他标识符名称。
表2.2 Python中的保留字
2.4.2 基本数据类型和运算
基本数据类型
Python 中最基本的数据类型包括整型、浮点型、布尔型和字符串。类型不需要声明,例如:
变量和引用
Python中基本变量的赋值,其建立的一般是个引用,例如:
a 赋值为1 后,b=a 执行时并不会将 a 的值复制一遍,然后赋给 b,而是简单地为a所指的值(也就是1)建立一个引用,相当于a和b都是指向包含1这个值的这块内存的指针。所以,c=1 执行的也是一个引用的建立。这三个变量其实是三个引用,指向同一个值。
运算符
Python 中数值的基本运算和 C 语言中的差不多,只是字符串的运算更方便。Python 中的运算符主要包括算术运算符、比较运算符、赋值运算符、位运算符和逻辑运算符,分别如表2.3~表2.7所示。
表2.3 算术运算符
表2.4 比较运算符
续表
表2.5 赋值运算符
表2.6 位运算符
表2.7 逻辑运算符
2.4.3 列表、元组和字符串
列表
列表(List)用来处理一组有序项目的数据结构,列表是可变的数据结构。列表的项目包含在方括号“[]”中。
(1)创建列表。
(2)访问列表中的值。
(3)更新列表。
(4)删除列表元素。
(5)列表运算。
加号“+”用于组合列表,星号“*”用于重复列表。例如:
(6)列表索引、截取。
(7)列表内置函数(如表2.8所示)。
表2.8 列表内置函数
(8)列表常用方法(如表2.9所示)。
表2.9 列表常用方法
元组
元组与列表有很多相似的地方,其最大的不同在于不可变;还有,在对只包含一个元素的元组进行初始化时与列表不一样,必须在元素后加上逗号。另外,当直接用逗号分隔多个元素赋值时,默认它是一个元组,这在函数有多个返回值时很好用。
(1)创建元组。
(2)访问元组。
(3)删除元组。
元组中的元素值是不允许删除的,但可以用 del 语句来删除整个元组。例如:
(4)元组运算。
元组之间可以使用“+”号和“*”号进行运算。“+”号用于元组连接,“*”号用于元组复制。例如:
(5)元组内置函数(如表2.10所示)。
表2.10 元组内置函数
字符串
字符串就是一个由字符组成的数组,所有标准序列操作(索引、切片、乘法、长度、最小值和最大值等)都适用于字符串。但与元组类似,字符串是不可变的,所有的元素赋值和切片赋值都是非法的。
(1)创建字符串。
(2)访问字符串。
(3)字符串更新。
可以截取字符串的一部分,并与其他字段拼接。例如:
(4)转义字符(如表2.11所示)。
表2.11 转义字符
(5)字符串操作(如表2.12所示)。
表2.12 字符串操作
(6)字符串格式化(如表2.13所示)。
表2.13 字符串格式化
(7)字符串内置函数(如表2.14所示)。
表2.14 字符串内置函数
续表
2.4.4 字典和集合
字典
字典是Python中唯一的映射类型。“映射”是一个术语,指两个元素集之间元素相互对应的关系。字典与序列不同:序列讲究顺序;字典讲究映射,不讲究顺序。字典是键-值对(key:value),它的特点是可以快速查找,但需要占用大量的内存。
(1)创建字典。
(2)访问字典里的值。
(3)修改字典。
向字典添加新内容的方法是增加新的键-值对,修改或删除已有的键-值对。例如:
(4)删除字典元素。
(5)字典内置函数和方法(如表2.15所示)。
表2.15 字典内置函数和方法
续表
集合
集合和字典类似,也是一组键(Key)的集合,但不存储值(Value)。由于键不能重复,所以在集合中,没有重复的键。集合与字典的唯一区别在于没有存储对应的值;但是,集合的原理和字典一样,都不可以放入可变对象。集合是一种很有用的数学操作,比如列表去重,或者理清两组数据之间的关系。
(1)创建集合。
(2)添加、删除元素。
通过add(key) 和remove(key) 可以添加或删除元素。例如:
(3)集合运算。
集合之间可以使用“|”号、“&”号和“-”号进行运算。“|”号用于求并集,“&”号用于求交集,“-”号用于求差集。例如:
2.4.5 分支和循环
if语句
Python的条件控制主要是三个关键字:if、elif和else。其中,elif就是else if 的意思。逻辑表达式可以加上括号“()”,也可以不加,但要注意逻辑表达式中的“:”。根据 Python 的缩进规则,如果 if 语句判断是 True,就将缩进的两行print语句予以执行;否则,什么也不做。例如:
【例2-3】
同时,Python也支持:
只要 x 是非零数值、非空字符串、非空列表等,就判断为 True;否则判断为False。
for循环
for循环用于遍历。例如:
while循环
while语句非常灵活,可用于条件为真时反复执行代码块。例如:
2.4.6 函数和类
函数
函数通过关键字 def 定义。“def”后跟函数的标识符名称,然后跟一对圆括号,括号之内可以包含一些变量名,该行以冒号结尾;接下来是一块语句,即函数体。例如:
(1)形参与实参。函数中的参数名称为“形参”,调用函数时传递的值为“实参”。
(2)局部变量。在函数内定义的变量与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是局部的。这称为变量的作用域。
(3)return 语句。return 语句用于从一个函数返回,即跳出函数。可从函数返回一个值。没有返回值的 return 语句等价于“return None”,其中“None”表示没有任何东西的特殊类型。
类
Python 中类的概念和其他语言相比没有什么不同。比较特殊的是 protected类和private类,它们在Python中是没有明确限制的。一个惯例是,用单下画线开头的表示protected类,用双下画线开头的表示private类。例如:
【例2-4】
类的初始化所使用的是__init__(self,),所有成员变量都是 self 变量,所以以“self.”开头。可以看到:单下画线开头的变量是可以直接访问的;而双下画线开头的变量则触发了 Python 中一种叫作 name mangling 的机制,其实就是名字变了一下,仍然可以通过前面加上“_类名”的方式访问。也就是说,Python 中变量的访问权限都是靠自觉的。类定义中紧跟着类名字下一行的字符串叫作docstring,其中可以写一些用于描述类的介绍;如果有定义,则通过“类名__doc__”访问。
Python 中的继承也非常简单,其最基本的继承方式是在定义类时把父类往括号里一放就行了。例如:
【例2-5】
2.4.7 模块
模块就是一个包含了所有定义的函数和变量的文件,模块必须以“.py”为扩展名。模块可以从其他程序中“输入”(import),以便利用它的功能。在Python 程序中导入其他模块使用'import',所导入的模块必须在 sys.path 所列的目录中。
如果导入一个模块或包,可以使用 import module。如果想直接使用其他模块的函数,而不加“'模块名+.'前缀”,可以使用from…import。例如: