表达式是处理数字的最基本工具,表达式的定义是:数字(或其他对象)与运算符相结合,并被Python在执行时计算为一个值。在Python中你可以使用一般的数学记号与运算符号来编写表达式。例如,让两个数字X和Y相加就可以写成X+Y
下面列举我所知Python中所有的运算符表达式
这个是表5-1
运算符 描述
yield x 生成器函数send协议
lambda args:expression 创建匿名函数
x if y else z 三元选择表达式
x or y 逻辑或
x and y 逻辑与
not x 逻辑非
x in y,x not in y 成员关系
x is y,x is not y 对象同一性测试
x<y,x<=y,x>y,x>=y 大小比较,集合的子集和超集
x == y,x != y 值等价性运算符
x|y 按位或,集合合并
x^y 按位异或,集合对称差集
x&y 按位与,集合交换
x<<y,x>>y 将x左移或右移y位
x + y 加法,拼接
x - y 减法,集合差集
x*y 乘法,重复
x%y 求余数,格式化
x / y,x//y 真除法,向下取整除法
-x,+x 取负,取正
~x 按位非(取反码)
x ** y 幂运算(指数)
x[i] 索引(映射,序列等)
x[i:j:k] 分片,切片
x(...) 调用(函数,类,方法,其他可调用对象)
x.attr 属性引用
(....) 元组,表达式,生成器表达式
[...] 列表,列表推导
{...} 字典,集合,集合与字典推导
Python3.X中x <> y的格式被移除了。
Python3.X中,X/Y表达式会执行真除法(保留了商的小数部分)
[...]语法同时用于列表字面量,列表推导表达式。列表推导表达式会执行隐式的循环并把表达式的结果收集到一个新列表中。
(...)语法用于元组和表达式分组,以及生成器表达式。生成器是一种能够按照需求产出结果的列表推导,而不是一次性创建完整的结果列表。
{...}语法用于字典字面量,并且在Python3.X和2.X可以表示集合字面量以及字典和集合推导。
yield和三元if/else选择表达式在Python2.5以及之后的版本可用。yeild会在生成器中返回send(...)参数;三元if/esle选择表达式是一个多行if语句的简化形式。如果yield不是单独位于第一条赋值语句的邮编,需要用圆括号
比较运算符可用链式使用:x<y<z的结果与x<y and y<x相同。
分片表达式X[I:J:K等同于用一个分片对象进行索引
在Python3.X中,比较非数字的混合类型的相对大小是不允许的。
在Python3.X中,字典的相对大小比较也不再支持(尽管支持等价性测试):比较sorted(aDict.items())是一种可能的替代
混合运算遵循运算符优先级
对于复杂的表达式,例如 A *B + C * D 。Python是怎么知道先进行哪个操作呢?这个问题的答案就在于对运算符优先级。当编写含有一个运算符以上的表达式时,Python将按照所谓的优先级法则对表达式进行分组,这个分组决定了表达式中各部分的计算顺序,
在表5-1中,运算符从上到下优先级逐渐增高,也就是说越下面的表达式‘绑定的越紧’
表5-2中位于同一行的表达式在分组的时候通常按照从左到右组合(除了幂运算,它是从右向左组合的,还有比较运算,是从左到右连接的)
如计算X + Y * Z 。Python首先计算乘法Y * Z,然后键结果与X相加
括号分组子表达式
如果用圆括号将表达式各部分进行分组,就可以不必记忆优先级的事情了,当你但子表达式括在圆括号中时,就会超越Python的优先级规则。Python总会先计算圆括号中的表达式么然后将结果用于整个表达式中。
例如,表达式X +Y * Z 写成下边两个表达式中的任意一种,从而强制Python按照你想要的顺序计算表达式:
(X + Y) * Z X + (Y * Z)
在第一种情况下,“+”首先用作与X和Y。在第二种情况下,首先使用“*”(即使这里没有括号也会这样)。一般来说,在一个大型表达式中添加括号是个很好的做法,因为它不仅能够按照你想要的循序进行计算,也增加了程序的可读性。
混合类型向上转换
除了在表达式中混个运算符外,你也可以混合数值类型。例如把一个整数和浮点数相加:
40 + 3.14
但这将会引发一个问题,混合后的结果是什么类型?
在混合类型的表达式中,Python实现将被操作的对象转换为最复杂的操作数的类型,然后在对相同类型的操作数进行数学运算。
Python是这样划分数值类型的复杂度的:整数比浮点数简单,浮点数比复数简单。因此当一个整数与浮点数混合时,整数会先升级为浮点数的值,之后通过浮点数的有运算法则得到浮点数的结果。
同理,任意混合类型的表达式,其中一个操作数是更为复杂的数字,就会导致其他的凑整数升级为一个复制的数字,使表达式获得一个复杂的结果。
你可以通过手动调用内置函数来强制转换类型

然而,你通常不需要这样做,因为Python在表达式中会自动升级为更复杂的类型,其结果往往就是你想要的。
再者,要记住所有这些混合类型的转换仅适用于数值类型。一般来说,Python不会在其他的类型之间进行转换。例如,一个字符串和一个整数相加就会产生错误。