# 运算符和表达式
你编写的大多数语句(逻辑行)都包含**表达式**。表达式的一个简单例子是`2+3`。一个表达式可分解成运算符和操作对象。
**运算符**的功能是做一些事,通过符号(如`+`)或特定的关键字表示。运算符需要一些数据来操作,这些数据被你作**操作数**(操作对象)。在这个例子中`2`和`3`是操作数。
## 运算符
我们将简单地看一下运算符和它的用法:
注意,您可以使用交互式解释器计算例子中给出的表达式。例如,为了测试表达式`2 + 3`,使用交互式Python解释器提示符:
```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
- `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.
- `and` (逻辑与)
- 如果x是`False`, `x and y` 返回 `False`,否则它返回y的值。
- `x = False; y = True; x and y` 返回 `False`,因为 x 为假。在这种情况下,Python将不计算y,因为它知道`and`左边表达式是 `False` ,这意味着整个表达式将为 `False` ,而不论其它值为什么。这叫做计算捷径。
- `or` (逻辑或)
- 如果 x 为 `True`, 它返回真,否则它返回y的值。
- `x = True; y = False; x or y` 返回 `True`。计算捷径这也适用。
## 复合赋值运算符
我们经常会对一个变量进行数学运算,然后将操作的结果返回给最初的变量。这样的表达式可以使用一个更加简化的**复合赋值运算符**:
```python
a = 2
a = a * 3
```
可以写成:
```python
a = 2
a *= 3
```
注意:将 `var = var operation expression` 写成 `var operation= expression`。
## 运算顺序
如果你有一个表达式如 `2 + 3 * 4`, 是先做加法还是先做乘法呢?我们的高中数学告诉我们,应该先做乘法。这意味着乘法运算符比加法运算符具有更高的优先级。
下表对 Python 中运算符的优先顺序进行了总结,从最低优先级(最后绑定)到最高优先级(最先绑定)。 意思是说,在给定的表达式中,Python将按照自下而上的顺序,首先计算表格下方的表达式。
下表取自[Python参考手册](https://docs.python.org/zh-cn/3/reference/expressions.html#evaluation-order),放在这里是为了提供一个完整的文档。为了显式地指定优先级,更好的做法是使用圆括号组织运算符和操作数。这可使程序更加易读。详见下一节-改变运算顺序。
- `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):
```python
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程序员的生活更轻松的例子之一。
### 小结
我们已经看到了如何使用运算符,操作对象和表达式——这是任何程序的基石。接下来,我们将看到在我们的程序中,如何在语句中使用它们。
- 开始学习
- 搭建Python开发环境
- 简明Python教程
- 致敬
- 前言
- 关于Python
- 安装
- 第一步
- 基础
- 运算符和表达式
- 控制流
- 函数
- 模块
- 数据结构
- 实战案例
- 面向对象编程
- 输入与输出
- 异常处理
- 标准库
- 更多
- 继续学习
- 附录:免费/自由和开放源码软件
- 附录: 关于
- 附录: 版本历史
- 附录: 翻译
- 附录: 参与翻译工作
- 反馈
- Django Step Sy Step
- 第一讲 从简单到复杂
- 第二讲 做加法的例子
- 第三讲 使用Template
- 第四讲 生成csv格式文件
- 第五讲 session示例
- 第六讲 wiki的例子
- 第七讲 通讯录的例子
- 第八讲 文件导入和导出
- 第九讲 通讯录的美化
- 第十讲 扩展django的模板
- 第十一讲 用户管理
- 第十二讲 搜索和部署
- 第十三讲 Ajax的实现(一)
- 第十四讲 Ajax的实现(二)
- 第十五讲 i18n的一个简单实现
- 第十六讲 自定义Calendar Tag
- 第十七讲 View,Template和Tag
- Django开发实战
- Python开发规范
- Django项目的gitignore
- 怎样配置开发环境的settings
- 如何使用Django和Vue.js构建项目
- 使用WebSocket开发网页聊天室
- 怎样使Django Admin显示中文
- 怎样使Model在Admin界面中显示中文
- 使用Django Admin怎样上传并显示图片
- 解决Django模板和Vue指令花括号冲突的问题
- 使用Django和Vue开发微信公众号
- 使用Django和Vue调用微信JSSDK开发微信支付