下面为 Python 所有的操作符表达式(摘自 Mark Lutz 的《Python 学习手册》).
当编写含有一个操作符以上的表达式时,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)]
向左扩展.
取反 (~) 运算的优先级与数字单目运算符相同, 是所有位操作符中优先级最高的一个. 左移和右移运算的优先级次之,但低于加减法运算.与, 或, 异或 运算优先级最低.
所有位运算符按优先级高低列在下图中:
来源: http://www.jianshu.com/p/41dbbdb11bf1