Python语句Python的语法实际上是由语句和表达式组成的(语句使用关键字来组成,只执行某种操作,可以没有返回值;而表达式没有关键字,是使用数学运算符构成的算数表达式,是一个单纯的运算求值过程,总是返回值。表达式本身可以作为表达式语句,也能作为赋值语句的右值或if语句的条件等,所以表达式可以作为语句的组成部分,但不是必须成分)。表达式处理对象并嵌套在语句中,语句编码操作实现程序的逻辑关系。语句还是对象生成的地方。 简单语句简单语句由一个逻辑行构成,在由分号分隔的单个物理行上可能存在几个简单语句。常见的简单语句有赋值语句、表达式语句、assert 语句、del 语句、break 语句、continue 语句等。这里我们只简单的介绍表达式语句、赋值语句和del 语句,其他语句会在后续对应的章节详细介绍。 一、赋值语句赋值语句用于(重新)将对象绑定到变量,以及修改可变对象的属性或项目。 Python赋值语句会把对象的引用存储在变量名或数据结构的元素内。赋值语句总是建立对象的引用值,而不是复制对象。因此,Python的变量更像是指针(引用),而不是数据存储区域。 Python会在首次将值(即对象的引用)赋值给变量时创建其变量名。有些(并非全部)数据结构元素也会在赋值时创建。一旦赋值了,每当这个变量名出现在表达式中,就会被其所引用的值取代。变量名在引用前必须先赋值,使用尚未进行赋值的变量名是一种错误。 本节中,我们关心的是 1、基本形式(将对象赋值到单个目标)目标是变量名:如果变量名没有出现在当前代码块的 global 或 nonlocal 语句中:变量名绑定到当前局部命名空间中的对象。否则:变量名绑定到当前全局命名空间的对象或由 nonlocal 决定的外部命名空间。 如果名称已绑定,则名称将使用新的对象重新被绑定。这可能导致先前绑定到名称的对象的引用计数达到零,导致对象被释放,并且它的析构函数(如果它有一个)被调用。目标是属性引用(对象):引用中的主表达式是计算。它产生的对象应该具有一个可以赋值的属性;如果情况不是这样,则抛出 TypeError 异常。然后要求该对象将被赋值的对象赋值给给定的属性;如果不能做此操作,它会抛出一个异常(通常是AttributeError,但不一定)。2、多目标赋值Python赋值对象的引用值(最右边的对象)给左边的所有目标。3、序列赋值在Python中 = 左侧可以接收编写在元组或列表中的变量, = 右侧可以接受使任何类型的序列,只要和左侧序列元素长度相等即可,不然会产生错误。Python会按照位置把右侧序列中的元素和左侧序列中的变量从左至右相匹配,然后每一次赋值一个值。扩展的序列赋值序列赋值通常要求左侧变量数目与右侧主体的项数完全一致。如果长度不同的话,将会得到一个错误。但是一个带有星号的变量,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配 —— 将一个列表赋值给了带星号的名称,该列表收集了序列中没有赋值给其他变量的所有项。注意: 如果有多个带星号的名称,或者如果值少与没有带星号的名称,以及带星号的名称自身没有编写到一个列表或元祖中,都将引发错误。 4、增强赋值语句增强赋值是在单个语句中组合运算符的赋值语句:在Python中,每个二元表达式运算符都有对应的增强赋值形式: 增强赋值语句有三个优点:1、程序员输入减少。2、左侧只需计算一次,因此增强赋值语句通常执行的更快(在完整形式 X = X + Y 中,X出现两次,必须执行两次)。与正常赋值不同,增强的赋值在计算右侧之前计算左侧。例如,a[i] += f(x)首先查找a [i ],然后求值f(x)并执行加法,最后,将结果写回到a[i]。3、优化技术会自动选择。对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。 就增强赋值运算而言,在原处的运算可作为一种优化而应用在可变对象上。合并对于共享对象引用产生的副作用可能会更少,但是,通常会比对等的原处修改形式运行的更慢。合并操作必须创建一个新的对象,把左侧的赋值到列表中,然后再把右侧的赋值到列表中。想必而言,原处方法调用直接在一个内存块末尾添加项。二、表达式语句表达式语句用于计算和写入一个值,或者(通常)用来调用函数或方法。 三、del 语句删除是递归的,删除目标列表将递归删除列表中的每个对象,从左到右。 删除一个变量将从局部或全局命名空间中删除该变量的绑定,取决于变量是否出现在相同代码块的global 语句中。如果变量没有绑定,将抛出一个NameError 异常。 属性引用、下标和切片的删除将传递给原始的对象;切片的删除在一般情况下等同于赋予一个右边类型的空切片(但即使这点也是由切片的对象决定)。
|
|