1.2.7 运算符和表达式
你编写的大多数语句(逻辑行)都包含表达式。表达式的一个简单例子是2+3
。一个表达式可分解成运算符和操作对象。
运算符的功能是做一些事,通过符号(如+
)或特定的关键字表示。运算符需要一些数据来操作,这些数据被你作操作数(操作对象)。在这个例子中2
和3
是操作数。
运算符
我们将简单地看一下运算符和它的用法:
注意,您可以使用交互式解释器计算例子中给出的表达式。例如,为了测试表达式2 + 3
,使用交互式Python解释器提示符:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
以下是一些运算符的简介:
+
(加号)- 两个对象相加
3 + 5
得8
,'a' + 'b'
得'ab'
。
-
(减号)- 给出一个数减去另一数的差;如果缺少第一个操作数,它默认为是0。
-5.2
得到一个负数,50 - 24
得26
.
*
(乘法)- 给出两个数的乘积或返回重复多次的字符串。
2 * 3
得6
.'la' * 3
得到'lalala'
.
**
(幂)- 返回x的y次幂
3 ** 4
得81
(也就是3 * 3 * 3 * 3
)
/
(除法)- x除以y
13 / 3
得4.3333333333333333
.
//
(整除)- 返回x除以y所得到的最大的整数商。注意如果其中一个参数是浮点数,那么结果也是浮点数。
13 // 3
得4
-13 // 3
得-5
9//1.81
得4.0
%
(取模)- 返回除法的余数
13 % 3
得1
.-25.5 % 2.25
得1.5
.
<<
(向左移位)- 数字向左移动指定位数。(在内存中每个数字由比特或二进制数表示,例如:0和1)。
2 << 2
得8
.2
用二进制表示为10
。- 左移两位得到
1000
,它表示数字8
。
>>
(向右移位)- 数字向右移动指定位数。
11 >> 1
得5
.11
用二进制表示为1011
,向右移动1位后得到二进制101
,表示数字5
。
&
(按位与)- 数字的按位与
5 & 3
得1
。
|
(按位或)- 数字的按位或
5 | 3
得7
。
^
(按位异或)- 数字的按位异或
5 ^ 3
得6
。
~
(按位求反)- x的位求反结果为-(x+1)
~5
得-6
。详见 http://stackoverflow.com/a/11810203
<
(小于)- 返回x是否小于y。所有的比较运算符返回
True
或False
。注意这些名字的大小写。 5 < 3
返回False
而3 < 5
返回True
.- 比较运算符可以任意连接:
3 < 5 < 7
返回True
.
- 返回x是否小于y。所有的比较运算符返回
>
(大于)- 返回x是否大于y
5 > 3
返回True
。如果操作对象都是数字,它们首先转换为普通类型,否则,将返回False
。
<=
(小于等于)- 返回x是否小于等于y
x = 3; y = 6; x <= y
返回True
.
>=
(大于等于)- 返回x是否大于等于y
x = 4; y = 3; x >= y
返回True
。
==
(等于)- 比较操作对象是否相等
x = 2; y = 2; x == y
返回True
.x = 'str'; y = 'stR'; x == y
返回False
.x = 'str'; y = 'str'; x == y
返回True
.
!=
(不等于)- 比较操作对象是否不相等
x = 2; y = 3; x != y
返回True
.
not
(逻辑非)- 如果 x 是
True
,它返回False
。如果 x 是False
,它返回True
。 x = True; not x
返回 False.
- 如果 x 是
and
(逻辑与)- 如果x是
False
,x and y
返回False
,否则它返回y的值。 x = False; y = True; x and y
返回False
,因为 x 为假。在这种情况下,Python将不计算y,因为它知道and
左边表达式是False
,这意味着整个表达式将为False
,而不论其它值为什么。这叫做计算捷径。
- 如果x是
or
(逻辑或)- 如果 x 为
True
, 它返回真,否则它返回y的值。 x = True; y = False; x or y
返回True
。计算捷径这也适用。
- 如果 x 为
复合赋值运算符
我们经常会对一个变量进行数学运算,然后将操作的结果返回给最初的变量。这样的表达式可以使用一个更加简化的复合赋值运算符:
a = 2
a = a * 3
可以写成:
a = 2
a *= 3
注意:将 var = var operation expression
写成 var operation= expression
。
运算顺序
如果你有一个表达式如 2 + 3 * 4
, 是先做加法还是先做乘法呢?我们的高中数学告诉我们,应该先做乘法。这意味着乘法运算符比加法运算符具有更高的优先级。
下表对 Python 中运算符的优先顺序进行了总结,从最低优先级(最后绑定)到最高优先级(最先绑定)。 意思是说,在给定的表达式中,Python将按照自下而上的顺序,首先计算表格下方的表达式。
下表取自Python参考手册,放在这里是为了提供一个完整的文档。为了显式地指定优先级,更好的做法是使用圆括号组织运算符和操作数。这可使程序更加易读。详见下一节-改变运算顺序。
lambda
: Lambda表达式if - else
: 条件表达式or
: 逻辑或and
: 逻辑与not x
: 逻辑非in, not in, is, is not, <, <=, >, >=, !=, ==
: 比较、成员检测、相等检测|
: 按位或^
: 按位异或&
: 按位与<<, >>
: 移位+, -
: 加和减*, /, //, %
: 乘法,除法,浮点除和余数+x, -x, ~x
: 正,负,按位非**
: 幂x[index], x[index:index], x(arguments...), x.attribute
: 索引,切片,函数调用,属性引用(expressions...), [expressions...], {key: value...}, {expressions...}
: 显式绑定或元组,显式列表,显式字典,显式集合
我们没有遇到的运算符将在后面的章节解释。
上表中在同一行列出的操作符具有相同的优先级。例如,+
和-
具有相同的优先级。
改变运算顺序
为使表达式更具可读性,我们可以使用圆括号。例如2 + (3 * 4)
肯定比需要知道运算符优先级的 2 + 3 * 4
更容易理解。与其他方面一样,应该合理使用括号不应该冗余(不要过分使用),如(2 + (3 * 4))
。
使用括号有一个额外的优势——它帮助我们更改运算顺序。例如,如果您想要在一个表达式中先计算加法再计算乘法,那么你可以这样写 (2 + 3) * 4
。
结合性
运算符通常从左到右。这意味着具有相同优先级的运算符按照从左到右的方式计算。例如2 + 3 + 4
计算为 (2 + 3) + 4
。
表达式
例子 (保存为expression.py):
length = 5
breadth = 2
area = length * breadth
print('Area is', area)
print('Perimeter is', 2 * (length + breadth))
输出:
C:\> python expression.py
Area is 10
Perimeter is 14
它是如何工作的
矩形的长度和宽度以存储在不同的变量中。我们使用这些变量计算矩形的面积和周长。我们把表达式length * breadth
的结果存储在变量area
中,然后使用print
函数输出结果结果。在第二种情况下,在打印函数中我们直接使用表达式2 * (length + breadth)
的值。
同样要注意,Python完美打印是如何输出的。即使我们没有在'Area is'
和变量area
,之间指定一个空格,Python为我们得到一个干净漂亮的输出,而且这种方式使得程序的可读性更强(因为我们不需要担心输出字符串之间的空格)。这只是让Python程序员的生活更轻松的例子之一。
小结
我们已经看到了如何使用运算符,操作对象和表达式——这是任何程序的基石。接下来,我们将看到在我们的程序中,如何在语句中使用它们。