Python基础手册17——简单语句
Python语句
Python的语法实际上是由语句和表达式组成的(语句使用关键字来组成,只执行某种操作,可以没有返回值;而表达式没有关键字,是使用数学运算符构成的算数表达式,是一个单纯的运算求值过程,总是返回值。表达式本身可以作为表达式语句,也能作为赋值语句的右值或if语句的条件等,所以表达式可以作为语句的组成部分,但不是必须成分)。表达式处理对象并嵌套在语句中,语句编码操作实现程序的逻辑关系。语句还是对象生成的地方。
简单语句
简单语句由一个逻辑行构成,在由分号分隔的单个物理行上可能存在几个简单语句。常见的简单语句有赋值语句、表达式语句、assert 语句、del 语句、break 语句、continue 语句等。这里我们只简单的介绍表达式语句、赋值语句和del 语句,其他语句会在后续对应的章节详细介绍。
一、赋值语句
赋值语句用于(重新)将对象绑定到变量,以及修改可变对象的属性或项目。
Python赋值语句会把对象的引用存储在变量名或数据结构的元素内。赋值语句总是建立对象的引用值,而不是复制对象。因此,Python的变量更像是指针(引用),而不是数据存储区域。
Python会在首次将值(即对象的引用)赋值给变量时创建其变量名。有些(并非全部)数据结构元素也会在赋值时创建。一旦赋值了,每当这个变量名出现在表达式中,就会被其所引用的值取代。变量名在引用前必须先赋值,使用尚未进行赋值的变量名是一种错误。
本节中,我们关心的是 =
语句,但是在Python中,赋值语句有一些隐性的操作。例如,模块导入、函数和类的定义、for循环变量以及函数参数全都是隐式赋值运算。因为赋值语句在任何出现的地方的工作原理都相同,所有这些方式都是在运行时把变量名和对象的引用绑定起来而已。
1、基本形式(将对象赋值到单个目标)
目标是变量名:
如果变量名没有出现在当前代码块的 global 或 nonlocal 语句中:变量名绑定到当前局部命名空间中的对象。否则:变量名绑定到当前全局命名空间的对象或由 nonlocal 决定的外部命名空间。
如果名称已绑定,则名称将使用新的对象重新被绑定。这可能导致先前绑定到名称的对象的引用计数达到零,导致对象被释放,并且它的析构函数(如果它有一个)被调用。目标是属性引用(对象):
引用中的主表达式是计算。它产生的对象应该具有一个可以赋值的属性;如果情况不是这样,则抛出 TypeError 异常。然后要求该对象将被赋值的对象赋值给给定的属性;如果不能做此操作,它会抛出一个异常(通常是AttributeError,但不一定)。2、多目标赋值
Python赋值对象的引用值(最右边的对象)给左边的所有目标。3、序列赋值
在Python中 = 左侧可以接收编写在元组或列表中的变量, = 右侧可以接受使任何类型的序列,只要和左侧序列元素长度相等即可,不然会产生错误。Python会按照位置把右侧序列中的元素和左侧序列中的变量从左至右相匹配,然后每一次赋值一个值。 在赋值运算中,在语句执行时,Python会建立临时的元祖,来存储右侧变量原始的值,分解赋值语句也是一种交换变量的值,且不需要自行创建临时变量的方法:右侧的元组会自动记住先前的变量的值。 序列赋值甚至可以赋值嵌套序列,而Python会根据其情况分解其组成部分。在这个过程中,左侧对象的序列嵌套的形状必须符合右侧对象的形状。扩展的序列赋值
序列赋值通常要求左侧变量数目与右侧主体的项数完全一致。如果长度不同的话,将会得到一个错误。但是一个带有星号的变量,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配 —— 将一个列表赋值给了带星号的名称,该列表收集了序列中没有赋值给其他变量的所有项。 带星号的变量可以出现在目标中的任何位置,包含该位置的每个未赋值的对象的一个列表都将赋值给它。当带星号的变量出现在中间,它收集其他列出的变量之间的所有内容。带星号的变量可能只匹配单个的项,但是,总是会向其赋值一个列表。如果没有剩下的内容可以匹配带星号的变量,它会被赋值一个空列表,不管该变量出现在哪里。注意: 如果有多个带星号的名称,或者如果值少与没有带星号的名称,以及带星号的名称自身没有编写到一个列表或元祖中,都将引发错误。
4、增强赋值语句
增强赋值是在单个语句中组合运算符的赋值语句:在Python中,每个二元表达式运算符都有对应的增强赋值形式:
X += Y, X -= Y, X *= Y, X /= Y, X //= Y, X %= Y,
X **= Y,X &= Y,X |= Y, X ^= Y, X <<= Y,X >>= Y
增强赋值语句有三个优点:
1、程序员输入减少。
2、左侧只需计算一次,因此增强赋值语句通常执行的更快(在完整形式 X = X + Y 中,X出现两次,必须执行两次)。
与正常赋值不同,增强的赋值在计算右侧之前计算左侧。例如,a[i] += f(x)首先查找a [i ],然后求值f(x)并执行加法,最后,将结果写回到a[i]。3、优化技术会自动选择。
对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。
就增强赋值运算而言,在原处的运算可作为一种优化而应用在可变对象上。合并对于共享对象引用产生的副作用可能会更少,但是,通常会比对等的原处修改形式运行的更慢。合并操作必须创建一个新的对象,把左侧的赋值到列表中,然后再把右侧的赋值到列表中。想必而言,原处方法调用直接在一个内存块末尾添加项。二、表达式语句
表达式语句用于计算和写入一个值,或者(通常)用来调用函数或方法。
在Python中,你可以只使用表达式作为语句(本身只占一行)。因为表达式结果不会存储,只有当表达式工作并作为附加的效果,这样才有意义。通常只有在交互模式提示符下打印值,或者调用函数或方法时,表达式才单独作为语句。
三、del 语句
删除是递归的,删除目标列表将递归删除列表中的每个对象,从左到右。
删除一个变量将从局部或全局命名空间中删除该变量的绑定,取决于变量是否出现在相同代码块的global 语句中。如果变量没有绑定,将抛出一个NameError 异常。
属性引用、下标和切片的删除将传递给原始的对象;切片的删除在一般情况下等同于赋予一个右边类型的空切片(但即使这点也是由切片的对象决定)。
《Python基础手册》系列:
Python基础手册 1 —— Python语言介绍
Python基础手册 2 —— Python 环境搭建(Linux)
Python基础手册 3 —— Python解释器
Python基础手册 4 —— 文本结构
Python基础手册 5 —— 标识符和关键字
Python基础手册 6 —— 操作符
Python基础手册 7 —— 内建函数
Python基础手册 8 —— Python对象
Python基础手册 9 —— 数字类型
Python基础手册10 —— 序列(字符串)
Python基础手册11 —— 序列(元组&列表)
Python基础手册12 —— 序列(类型操作)
Python基础手册13 —— 映射(字典)
Python基础手册14 —— 集合
Python基础手册15 —— 解析
Python基础手册16 —— 文件
Python基础手册17 —— 简单语句
Python基础手册18 —— 复合语句(流程控制语句)
Python基础手册19 —— 迭代器
Python基础手册20 —— 生成器
Python基础手册21 —— 函数的定义
Python基础手册22 —— 函数的参数
Python基础手册23 —— 函数的调用
Python基础手册24 —— 函数中变量的作用域
Python基础手册25 —— 装饰器
Python基础手册26 —— 错误 & 异常
Python基础手册27 —— 模块
Python基础手册28 —— 模块的高级概念
Python基础手册29 —— 包