你所编写的大多数语句(逻辑行)都包含了表达式(Expressions)。一个表达式的简单例子便是 2+3
。表达式可以拆分成运算符(Operators)与操作数(Operands)。
运算符(Operators)是进行某些操作,并且可以用诸如 +
等符号或特殊关键词加以表达的功能。运算符需要一些数据来进行操作,这些数据就被称作操作数(Operands)。在上面的例子中 2
和 3
就是操作数。
接下来我们将简要了解各类运算符及它们的用法。
要记得你可以随时在解释器中对给出的案例里的表达式进行求值。例如要想测试表达式 2+3
,则可以使用交互式 Python 解释器提示符:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
下面是可用运算符的速览:
+
(加)
3+5
则输出 8
。'a' + 'b'
则输出 'ab'
。-
(减)
-5.2
将输出一个负数,50 - 24
输出 26
。*
(乘)
2 * 3
输出 6
。'la' * 3
输出 'lalala'
。**
(乘方)
3 ** 4
输出 81
(即 3 * 3 * 3 * 3
)。/
(除)
13 / 3
输出 4.333333333333333
。//
(整除)
13 // 3
输出 4
。-13 // 3
输出 -5
。%
(取模)
13 % 3
输出 1
。-25.5 % 2.25
输出 1.5
。<<
(左移)
2 << 2
输出 8
。 2
用二进制数表示为 10
。1000
这一结果,表示十进制中的 8
。>>
(右移)
11 >> 1
输出 5
。11
在二进制中表示为 1011
,右移一位后输出 101
这一结果,表示十进制中的 5
。&
(按位与)
5 & 3
输出 1
。|
(按位或)
5 | 3
输出 7
。^
(按位异或)
5 ^ 3
输出 6
。~
(按位取反)4
~5
输出 -6
。有关本例的更多细节可以参阅:http://stackoverflow.com/a/11810203 。<
(小于)
True
或 False
。请注意这些名称之中的大写字母。5 < 3
输出 False
,3 < 6
输出 True
。3 < 5 < 7
返回 True
。>
(大于)
5 > 3
返回 True
。如果两个操作数均为数字,它们首先将会被转换至一种共同的类型。否则,它将总是返回 False
。<=
(小于等于)
x = 3; y = 6; x<=y
返回 True
。>=
(大于等于)
x = 4; y = 3; x>=3
返回 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
(布尔“非”)5
True
,则返回 False
。如果 x 是 False
,则返回 True
。x = True; not x
返回 False
。and
(布尔“与”)6
False
,则 x and y
返回 False
,否则返回 y 的计算值。False
时,x = False; y = True; x and y
将返回 False
。在这一情境中,Python 将不会计算 y,因为它已经了解 and 表达式的左侧是 False
,这意味着整个表达式都将是 False
而不会是别的值。这种情况被称作短路计算(Short-circuit Evaluation)。or
(布尔“或”)7
True
,则返回 True
,否则它将返回 y 的计算值。x = Ture; y = False; x or y
将返回 Ture
。在这里短路计算同样适用。一种比较常见的操作是对一个变量进行一项数学运算并将运算得出的结果返回给这个变量,因此对于这类运算通常有如下的快捷表达方式:
a = 2
a = a * 3
同样也可写作:
a = 2
a *= 3
要注意到 变量 = 变量 运算 表达式
会演变成 变量 运算 = 表达式
。
如果你有一个诸如 2 + 3 * 4
的表达式,是优先完成加法还是优先完成乘法呢?我们的高中数学知识会告诉我们应该先完成乘法。这意味着乘法运算符的优先级要高于加法运算符。
下面将给出 Python 中从最低优先级(最少绑定)到最高优先级(最多绑定)的优先级表。这意味着,在给定的表达式中,Python 将优先计算表中位列于后的较高优先级的运算符与表达式。
为了保持完整,下表是从 Python 参考手册 中引用而来。你最好使用圆括号操作符来对运算符与操作数进行分组,以更加明确地指定优先级。这也能使得程序更加可读。你可以阅读改变运算顺序来了解更多的细节。
lambda
:Lambda 表达式if - else
:条件表达式or
:布尔“或”and
:布尔“与”not x
:布尔“非”in, not in, is, is not, <, <=, >, >=, !=, ==
:比较,包括成员资格测试(Membership Tests)和身份测试(Identity Tests)。|
:按位或^
:按位异或&
:按位与<<, >>
:移动+, -
:加与减*, /, //, %
:乘、除、整除、取余+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))
输出:
$ python expression.py
Area is 10
Perimeter is 14