Python 语言中的运算符
# Python 语言中的运算符
## 运算符优先级
运算符优先级决定了表达式中多个运算符的执行顺序。优先级高的先执行,优先级低的后执行。不确定时,用圆括号 `()` 明确指定顺序。
| 优先级 | 运算符 | 说明 |
|--------|--------|------|
| 高 | `[]`、`[:]` | 索引、切片 |
| ↑ | `**` | 幂运算 |
| | `~`、`+`、`-` | 按位取反、正号、负号 |
| | `*`、`/`、`%`、`//` | 乘、除、模、整除 |
| | `+`、`-` | 加、减 |
| | `>>`、`<<` | 右移、左移 |
| | `&` | 按位与 |
| | `^`、`\|` | 按位异或、按位或 |
| | `<=`、`<`、`>`、`>=` | 比较运算 |
| | `==`、`!=` | 等于、不等于 |
| | `is`、`is not` | 身份运算符 |
| | `in`、`not in` | 成员运算符 |
| | `not`、`or`、`and` | 逻辑运算符 |
| 低 | `=`、`+=`、`-=` 等 | 赋值运算符 |
## 算术运算符
```python
print(321 + 12) # 加法: 333
print(321 - 12) # 减法: 309
print(321 * 12) # 乘法: 3852
print(321 / 12) # 除法: 26.75
print(321 // 12) # 整除: 26(取整数部分)
print(321 % 12) # 取模: 9(余数)
print(321 ** 12) # 幂运算: 1196906950228928915420617322241
```
**优先级**:幂运算 > 乘除 > 加减,用 `()` 可改变执行顺序:
```python
print(2 + 3 * 5) # 17(先乘后加)
print((2 + 3) * 5) # 25
print(((2 + 3) * 5) ** 2) # 625
```
## 赋值运算符
**基本赋值:**
```python
a = 10
b = 3
a += b # 等价于 a = a + b,结果 a = 13
a *= a + 2 # 等价于 a = a * (a + 2)
```
**海象运算符(Python 3.8+):** 赋值并同时返回值的运算符:
```python
# 普通赋值不能放在 print 中,会报错
# print(a = 10) # SyntaxError
# 海象运算符可以
print(a := 10) # 输出: 10
print(a) # a 已被赋值为 10
```
## 比较运算符
比较运算符返回布尔值 `True` 或 `False`:
```python
print(3 > 2) # True
print(1 == 1) # True(注意是两个等号)
print(1 != 2) # True
```
> **易错点**:`==` 是比较是否相等,`=` 是赋值,两者不要混淆。
## 逻辑运算符
| 运算符 | 说明 | 规则 |
|--------|------|------|
| `and` | 逻辑与 | 两边都为 True 结果才为 True |
| `or` | 逻辑或 | 任意一边为 True 结果就为 True |
| `not` | 逻辑非 | 取反 |
```python
flag1 = 3 > 2 # True
flag2 = 2 < 1 # False
print(flag1 and flag2) # False
print(flag1 or flag2) # True
print(not flag1) # False
# 短路特性
print(True and print('被执行了')) # 左边为 True,右边也会执行
print(False and print('被执行了')) # 左边为 False,右边被跳过
```
> **注意**:`and` 左边为 False 时,右边不执行(短路);`or` 左边为 True 时,右边不执行。
## 应用实例
### 实例1:华氏温度转摄氏温度
公式:`C = (F - 32) / 1.8`
```python
f = float(input('请输入华氏温度: '))
c = (f - 32) / 1.8
print(f'{f:.1f}华氏度 = {c:.1f}摄氏度')
```
### 实例2:计算圆的周长和面积
```python
import math
radius = float(input('请输入圆的半径: '))
perimeter = 2 * math.pi * radius
area = math.pi * radius ** 2
# 方式1:f-string 格式化
print(f'周长: {perimeter:.2f}')
print(f'面积: {area:.2f}')
# 方式2:Python 3.8+ 变量名输出
print(f'{perimeter = :.2f}') # perimeter = 34.56
print(f'{area = :.2f}') # area = 95.03
```
### 实例3:判断闰年
闰年判断规则(格里历):
- 能被 4 整除 **且** 不能被 100 整除 → 闰年
- 能被 400 整除 → 闰年
```python
year = int(input('请输入年份(1582年以后): '))
is_leap = year % 4 == 0 and year % 100 != 0 or year % 400 == 0
print(f'{is_leap = }')
```
## 总结
- 运算符优先级决定表达式求值顺序,不确定时用 `()` 显式指定
- 赋值运算符将右值赋给左变量,海象运算符 `:=` 可同时赋值和返回
- 比较运算符返回布尔值,`==` 不要误写成 `=`
- 逻辑运算符 `and`/`or`/`not` 遵循短路规则
- 字符串格式化推荐使用 f-string: `f'{变量:.2f}'`