Python 教程 04:运算符
“巧妇难为无米之炊。”
有了数据类型,接下来就要学会如何操作这些数据。运算符就是操作数据的工具,就像厨房里的刀、铲、勺,每种工具各有用途。
1. 算术运算符
最基础的运算符,用于数学计算。
基本运算
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法 | 5 / 2 | 2.5 |
// | 整除 | 5 // 2 | 2 |
% | 取模(余数) | 5 % 2 | 1 |
** | 乘方 | 2 ** 3 | 8 |
# 算术运算示例
a = 10
b = 3
print(f"{a} + {b} = {a + b}") # 13
print(f"{a} - {b} = {a - b}") # 7
print(f"{a} * {b} = {a * b}") # 30
print(f"{a} / {b} = {a / b}") # 3.333...
print(f"{a} // {b} = {a // b}") # 3
print(f"{a} % {b} = {a % b}") # 1
print(f"{a} ** {b} = {a ** b}") # 1000
有趣的细节
除法的"历史遗留问题"
在 Python 2 中,5 / 2会得到2(整除),但 Python 3 改成了真除法,结果是2.5。这让很多老 Python 程序员一开始很不习惯,就像你习惯了用筷子,突然让你用叉子。
负数的取模
print(10 % 3) # 1(正常)
print(10 % -3) # -2(注意符号)
print(-10 % 3) # 2(注意符号)
print(-10 % -3) # -1
Python 的取模规则:结果的符号与除数相同。这和其他语言可能不一样,需要注意。
2. 比较运算符
用于比较两个值,返回True或False。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
== | 等于 | 5 == 5 | True |
!= | 不等于 | 5 != 3 | True |
> | 大于 | 5 > 3 | True |
< | 小于 | 5 < 3 | False |
>= | 大于等于 | 5 >= 5 | True |
<= | 小于等于 | 5 <= 3 | False |
x = 10
y = 20
print(x == y) # False
print(x != y) # True
print(x > y) # False
print(x < y) # True
print(x >= 10) # True
print(y <= 20) # True
比较链
Python 支持链式比较,这是一个很优雅的特性:
age = 25
# 传统写法
if age >= 18 and age <= 65:
print("工作年龄")
# Python的优雅写法
if 18 <= age <= 65:
print("工作年龄")
就像数学表达式一样自然!在 Go 语言中,你只能用第一种写法。
3. 逻辑运算符
用于组合多个条件。
| 运算符 | 说明 | 示例 | 说明 |
|---|---|---|---|
and | 与 | True and False | 都为真才为真 |
or | 或 | True or False | 有一个为真就为真 |
not | 非 | not True | 取反 |
# 逻辑运算示例
a = True
b = False
print(a and b) # False
print(a or b) # True
print(not a) # False
短路求值
Python 的逻辑运算符有个重要特性:短路求值。
# and:如果第一个为False,不会执行第二个
result = False and print("不会执行") # 不输出
# or:如果第一个为True,不会执行第二个
result = True or print("不会执行") # 不输出
这在实际编程中很有用,可以避免不必要的计算或错误:
# 安全的除法
denominator = 0
if denominator != 0 and 10 / denominator > 1:
print("结果大于1")
# 因为短路,不会执行除法,避免了除零错误
4. 位运算符
直接操作二进制位,通常用于底层编程或性能优化。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
& | 按位与 | 5 & 3 | 1 |
| | 按位或 | 5 | 3 | 7 |
^ | 按位异或 | 5 ^ 3 | 6 |
~ | 按位取反 | ~5 | -6 |
<< | 左移 | 5 << 1 | 10 |
>> | 右移 | 5 >> 1 | 2 |
a = 5 # 二进制: 0101
b = 3 # 二进制: 0011
print(f"{a} & {b} = {a & b}") # 1 (0001)
print(f"{a} | {b} = {a | b}") # 7 (0111)
print(f"{a} ^ {b} = {a ^ b}") # 6 (0110)
print(f"~{a} = {~a}") # -6
print(f"{a} << 1 = {a << 1}") # 10 (左移1位等于乘以2)
print(f"{a} >> 1 = {a >> 1}") # 2 (右移1位等于除以2)
Tips:左移 n 位相当于乘以 2^n,右移 n 位相当于除以 2^n。这在某些性能敏感的场景下很有用,虽然现代编译器会自动优化。
5. 赋值运算符
除了基本的=,Python 还提供了复合赋值运算符。
| 运算符 | 等价于 | 示例 |
|---|---|---|
+= | x = x + y | x += 5 |
-= | x = x - y | x -= 3 |
*= | x = x * y | x *= 2 |
/= | x = x / y | x /= 4 |
//= | x = x // y | x //= 2 |
%= | x = x % y | x %= 3 |
**= | x = x ** y | x **= 2 |
count = 10
count += 5 # count = count + 5
print(count) # 15
count *= 2 # count = count * 2
print(count) # 30
6. 成员运算符
检查元素是否在序列中。
| 运算符 | 说明 | 示例 |
|---|---|---|
in | 在序列中 | 'a' in 'abc' → True |
not in | 不在序列中 | 'd' not in 'abc' → True |
# 字符串
text = "Python is awesome"
print('Python' in text) # True
print('Java' in text) # False
# 列表
numbers = [1, 2, 3, 4, 5]
print(3 in numbers) # True
print(10 not in numbers) # True
# 字典(检查键)
user = {'name': 'Tom', 'age': 20}
print('name' in user) # True
print('Tom' in user) # False(注意:检查的是键,不是值)
7. 身份运算符
比较两个对象的内存地址是否相同。
| 运算符 | 说明 | 示例 |
|---|---|---|
is | 是同一个对象 | x is y |
is not | 不是同一个对象 | x is not y |
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True(值相等)
print(a is b) # False(不是同一个对象)
print(a is c) # True(是同一个对象)
# None的比较应该用is
x = None
print(x is None) # True(推荐)
print(x == None) # True(不推荐)
重要区别:
==比较值是否相等is比较是否是同一个对象(内存地址相同)
8. 运算符优先级
当一个表达式中有多个运算符时,按照优先级执行。
优先级从高到低:
**(乘方)~,+,-(一元运算符)*,/,//,%+,-<<,>>&^,|==,!=,>,<,>=,<=,is,is not,in,not innotandor
# 优先级示例
result = 2 + 3 * 4 # 先乘后加
print(result) # 14
# 使用括号改变优先级
result = (2 + 3) * 4
print(result) # 20
# 复杂表达式
result = 10 + 5 * 2 ** 2 - 8 // 3
# 计算顺序:2**2=4, 5*4=20, 8//3=2, 10+20-2=28
print(result) # 28
最佳实践:当不确定优先级时,用括号明确表达意图,提高代码可读性。
9. 小结
今天我们学习了 Python 的运算符:
- 算术运算符:
+,-,*,/,//,%,** - 比较运算符:
==,!=,>,<,>=,<=,支持链式比较 - 逻辑运算符:
and,or,not,具有短路特性 - 位运算符:
&,|,^,~,<<,>> - 赋值运算符:
=,+=,-=等 - 成员运算符:
in,not in - 身份运算符:
is,is not - 优先级:记不住就用括号
运算符是编程的基本工具,就像厨师的刀具,熟练运用才能做出好菜。
练习题:
- 计算表达式:
10 + 5 * 2 ** 2 - 8 // 3的结果,并说明计算顺序 - 写一个程序,判断一个数是否在 10 到 100 之间(包含 10 和 100),使用链式比较
- 解释
==和is的区别,并举例说明
思考题:
为什么 Python 的逻辑运算符用and、or、not,而不是像 Java/C 用&&、||、!?
本文代码示例: