简介
你编写的大多数语句(即逻辑行)都会包含表达式。例如2 + 3。
一个表达式可以被分解为运算符和运算数。运算符用来完成某些操作,并以特殊的关键字形式表示之,
如符号+,同时运算符还需要操纵某些数据,这些数据被称为运算数,在2 + 3中,2和3就是两个操作数。
运算符
我们先简短的浏览一下运算符即其用法:
注意,你可以通过python解释器交互式的计算示例中的表达示,例如测试表达示2 + 3
>>> 2 + 3
5
>>> 3 * 5
15
>>>
(注: 后面的x和y分别代表第一操作数和第二操作数,单目运算符则只有x)
运算符 | 名称 | 说明 | 示例 |
+ | 加法 | 两个操作数相加 | 3 + 5得8。‘a’ + ‘b’等于ab。 |
- | 减法 | 两个操作数相减或取负 | -5.2取负。50 – 24得26。 |
* | 乘法 | 两个操作数相乘或重复字符串 | 2 * 3得6。 ‘la’ * 3等于’lalala’。 |
** | 幂运算 | 返回x的y次方 | 3 ** 4得81(即3 * 3 * 3 * 3)。 |
/ | 除法 | x除y | 4 / 3得1.3333333333333333。 |
// | 取整除 | 只返回商的整数部分 | 4 // 3等于1。 |
% | 取模 | 只返回除法的余数 | 8 % 3得2。 -25.5 % 2.25得1.5。 |
<< | 左移 | 将x的二进制位左移第2个操作数次 (每个数在内存中都以二进制数0和1的组合表示之) | 2 << 2得8。 2的二进制表示为10,左移2位 后等于1000,1000等于十进制数8。 |
>> | 右移 | 将x的二进制右移y次 | 11 > 1得5。 1的二进制表示为1011,右移1位 后等于101,正好是十进制数5。 |
& | 按位与 | x与y | 5 & 3等于1。 |
| | 按位或 | x或y | 5 | 3等于7。 |
^ | 按位异或 | x异或y | 5 ^ 3等于6。 |
~ | 按位取反 | 按位取反x,等于-(x + 1) | ~5等于-6。 |
< | 小于 | 判断x是否小于y。 所有比较运算符都回返回True(真)或False(假)。 注意它们首字母是大写的 | 5 < 3等于False而3 < 5等于True。 比较运算符可以被随意连接起来: 3 < 5 < 7得True。 |
> | 大于 | 判断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是否等于y | x = 2; y = 2; x == y返回True。 x = ‘str’; y = ‘stR’; x == y返回False。 x = ‘str’; y = ‘str’; x == 返回True。 |
!= | 不等于 | 判断x是否不等于y | x = 2; y = 3; x != y; 返回True。 |
not | 布尔非 | 如果x为True则返回False, 如果x为False则返回True | x = True; not x返回False。 |
and | 布尔与 | 如果x为False则返回False,否则返回y的值 | x = False; y = True; x and y返回False。 x为False时python不会继续求y, 因为and的左操作数为假则结果必定为False, 这叫做”短路求值”。 |
or | 布尔或 | 如果x为True则返回True,否则返回y的值 | x = True; y = False; x or y返回True,布尔或同样应用 短路求值。 |
(注: 作者在这里的描述不够严谨,严格的讲python的and和or返回的是操作数,
x and y如果x为False则返回x否则返回y, x or y如果x为True则返回x否则y)
组合算数运算与赋值运算
对一个变量执行算数运算后在再把结果存回这个变量是很常见的,所以python提供了一种更简便的方式完成这类操作:
a = 2; a = a * 3
相当于
a = 2; a *= 3
注意这里 变量 = 变量 的形式变成了 变量 操作符= 表达式。
求值顺序
对于表达式2 + 3 * 4,是先求加法呢还是先算乘法?
我们的中学数学知识告诉我们应该先算乘法(注:中学才乘法=.=),
也就是说乘法拥有比加法更高的运算优先级。
下面的表给出了python运算符的优先级,顺序从低(最后集合)到高(最先集合),这意味着在一个表达式中,
python会先计算表中较靠上的运算符然后再计算较靠下的运算符。
下表来自于python官方参考手册(http://docs.python.org/dev/3.0/reference/expressions.html#evaluation-order)
所以其内容是完备的。
(注:原已地址已out, 看我发的这个http://docs.python.org/py3k/reference/expressions.html#evaluation-order).
另外适当的运用小括号将运算符和运算数分组以便更加明确的指出运算优先级对程序的可读性大有好处。详见后面改变求值顺序一节。
操作符 | 描述 |
lambda | Lambda表达式 |
or | 布尔或 |
and | 布尔与 |
not x | 布尔非 |
in,not in | 从属关系测试 |
is,is not | 同一性测试(注: 比较两个变量是否引用相同对象) |
<,<=,>,>=,!=,== | 比较 |
| | 按位或 |
^ | 按位异或 |
& | 按位与 |
<<,>> | 移位 |
+,- | 加和减 |
+x,-x | 正负号 |
~x | 按位非 |
** | 求幂 |
x.attribute | 属性引用 |
x[index] | 下标操作 |
x[index1:index2] | 分片操作 |
f(arguments…) | 函数调用 |
(expressions, …) | 绑定或元组显示 |
[expressions, …] | 列表显示 |
{key:datum, …} | 字典显示 |
以上有些运算符我们还没有接触到,在后面的章节会有解释。
相同优先级的运算符被列在了同一列,比如+和-拥有同等的运算级。
改变运算符求值顺序
为了增强表达式可读性,我们可以使用小括号。
例如2 + (3 * 4)明显比2 + 3 * 4更容易理解,而后者需要有运算符优先级的知识.
不过凡事都不能过度,适当的使用小括号增强可读性很好,但是类似这样的表达式2 + (3 + 4)就是滥用了。
另外使用小括号还有另一个好处,它可以帮助我们改变求值顺序。
比如你想在一个表达式中先求加法而后求乘法,可以这样写(2 + 3) * 4.
(注: 鄙人窃以为小括号的发明和主要用途就是改变求值顺序,作者有点颠倒…)
结合性
大多数情况下运算符从左到右结合,即拥有相同运算级的运算符从左到右求值,例如
2 + 3 + 4相当与(2 + 3) + 4。
但有一些运算符,比如赋值运算符从右向左结合,a = b = c相当与a = (b = c)
表达式
举个例子:
#!/usr/bin/python
# Filename: 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
如何工作的:
矩形的长和宽被分别存入变量length和breadth,并利用表达式分别求出面积和周长。
表达式length * breadth的结果被存入area, 之后利用print函数进行打印。
但在第二个print调用中我们直接利用表达式2 * (length + breadth)的结果。
另外注意python是如何”漂亮的”进行输出的,尽管我们没有在”Area is”和变量area
之间指定空格,python却为我们代劳了。因此我们得到一个清爽的输出并且可读性变
的更强(因为我们无需劳心被输出字符串间的空格问题)。这也是python如何让程序员
的生活变得更轻松的例子之一。
小结
我们已经学到如何使用操作符,操作数和表达式 – 它们都是任何程序的基础。
接下来我们将会看到如何在语句中利用它们。