Python基础手册6——操作符
当编写含有一个操作符以上的表达式时,Python将按照所谓的优先级法则对其进行分组,这个分组决定了表达式各部分的计算顺序。表中的操作符越靠后的优先级越高,位于同一行的表达式在组合的时候通常从左到右组合(除了幂运算,它是从右向左组合的,还有比较运算,是从左到右连接的)。
当使用括号划分子表达式的时候,就会超越Python的优先级规则。Python总会先执行计算括号中的表达式,然后再将结果用在整个表达式中。
所有的Python操作符可以通过Python的类或C扩展类型被重载(即实现),让它也能工作于你所创建的对象中。Python自身自动重载了某些操作符,能够根据所处理的内置对象的类型而执行不同的操作。这种特性通常称作多态。
下面介绍常用的操作符,其中一些常用于某些类型的操作符,会在后续的介绍对应类型的章节中详细介绍。
一、赋值运算符
1、 赋值运算符(=)
Python 语言中, 等号( = )是主要的赋值运算符,其他的是增量赋值运算符。
赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应该如此。在 Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量(具体原理下面会有详细介绍)。
同样的, 如果你比较熟悉 C, 你会知道赋值语句被当成一个表达式(可以返回值)。不过这条并不适合于 Python,Python 的赋值语句不会返回值。
类似下面的语句在 Python 中是非法的:
链式赋值没问题:
2、 增量赋值
等号可以和一个算术运算符组合在一起, 将计算结果重新赋值给左边的变量,这被称为增量赋值。 增量赋值运算符:增量赋值相对普通赋值不仅仅是写法上的改变,最有意义的变化是第一个对象(我们例子中的 x)仅被处理一次。如果值是可变对象会被就地修改(无修拷贝引用), 如果值是不可变对象则和 x = x + 1 的结果一样(x会被分配一个新对象:2)。
注意:Python 不支持 C 语言中的自增 ++和自减 -- 运算符, 这是因为 + 和 - 也是单目运算符,Python 会将 --n 解释为-(-n) 从而得到 n,同样 ++n 的结果也是 n。
3、 多重赋值
在上面的例子中,一个值为 1 的整数对象被创建,该对象的同一个引用被赋值给 x、y 和 z 。也就是将一个对象赋给了多个变量。在 Python 当中,将多个对象赋给多个变量也是可以的。
4、“多元”赋值
另一种将多个变量同时赋值的方法我们称为多元赋值(multuple)。采用这种方式赋值时, 等号两边的对象都是元组。 在上面的例子里, 两个整数对象(值分别为 1 和 2)及一个字符串对象, 被分别赋值给x,y 和 z。通常元组需要用圆括号(小括号)括起来,尽管它们是可选的。我们建议总是加上圆括号以使得你的代码有更高的可读性。 在其它类似 C 的语言中, 如果你要交换两个值, 你会想到使用一个临时变量比如 tmp 来临时保存其中一个值:在上面的 C 代码片段中,变量 x 和变量 y 的值被互相交换。 临时变量 tmp 用于在将 y 赋值给 x 前先保存 x 的值。将 y 的值赋给 x 之后, 才可以将保存在 tmp 变量中的 x 的值赋给 y。Python 的多元赋值方式可以实现无需中间变量交换两个变量的值。
二、算数运算符
加、减、乘、除和取余都是标准运算符。Python 有两种除法运算符,单斜杠用作传统除法(和数学中的除法一样),双斜杠用作地板除(取比商小的最大整数)。还有一个乘方运算符, 双星号(**)。
就象你看到的: + 和 - 优先级最低, *, /, //, %优先级较高, 单目运算符 + 和 - 优先级更高, 乘方的优先级最高。(3 ** 2) 首先求值, 然后是 (-2 * 4), 然后是对两个结果进行求和。建议对于复杂的运算表达式使用小括号()来限制运算顺序,以使代码更清晰,同时避免错误。
下面总结了所有的算术运算符, 从上到下, 计算优先级依次降低:注意: ** 运算符优先级高于单目运算符
X / Y
传统除法(真除法),无论任何类型都会返回包含任何余数的一个浮点结果。
X // Y
Floor除法,这个操作会取传统除法的结果之下的最接近的整数,针对整数操作会返回整数,如果有任何一个操作数是浮点数,则返回一个浮点数。其直接效果就是向下舍入,并不是严格的截断。三、比较运算符
比较运算符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返回布尔值 True 或 False。
实际进行的比较运算因类型而异。换言之,数字类型根据数值的大小和符号比较,字符串按照字符序列值进行比较,等等。
注意: Python 目前支持两种“不等于”比较运算符, != 和 <> , 分别是 C 风格和 ABC/Pascal风格。目前后者慢慢地被淘汰了, 所以我们推荐使用前者 !=。
四、逻辑运算符
逻辑运算符 and 和 or 会判断表达式中两侧对象的布尔值,并返回一个真或者假的操作对象(并非布尔值)。如果单从bool性考虑:and 运算符只有在两侧对象都为真时,表达式才为真,否则只有有一侧对象为假,表达式就为假;or运算符只有在两侧对象都为假时,表达式才为假,否则只要有一侧对象为真,表达式就为真。 当然,我们还可以使用逻辑运算符 and 和 or 将任意表达式连接在一起,并得到一个布尔值:最后表达式返回的是bool值,这是因为比较和相等测试会返回True或False。
在进行and 和 or 的运算时,Python 解释器会从左至右的运算操作对象的bool值,当运算为and时,解释器会返回第一个为假的操作对象(可以得到结果),如果两侧操作数都为真,则返回最右侧的对象。当运算为or是,解释器会返回第一个为真的对象(可以得到结果),如果两侧 操作数都为假,则返回最右侧的对象。 not 运算符拥有最高优先级,只比所有比较运算符低一级。 and 和 or 运算符则相应的再低一级。not会返回对象的bool值的对立bool值。注意: 合理使用括号可以增强代码的可读性, 没用括号的话,可能会使程序得到错误结果,或使代码可读性降低。括号在 Python语言中不是必须存在的, 不过为了可读性, 使用括号总是值得的。
五、位运算符
Python 整数 支持标准位运算:取反(~),按位 与(&), 或(|) 及 异或(^) 及左移(<<)和右移(>>)。
Python 这样处理位运算:
- 负数会被当成正数的 2 进制补码处理。
- 左移和右移 N 位等同于无溢出检查的 2 的 N 次幂运算: 2**N。
- 对长整数来说, 位运算符使用一种经修改的 2 进制补码形式,使得符号位可以无限的
- [图片上传中...(7.png-962a19-1515381258065-0)]
向左扩展。
取反(~)运算的优先级与数字单目运算符相同, 是所有位操作符中优先级最高的一个。 左移和右移运算的优先级次之,但低于加减法运算。与, 或, 异或 运算优先级最低。
所有位运算符按优先级高低列在下图中:《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 —— 包