Python 教程 04:运算符

“巧妇难为无米之炊。”

有了数据类型,接下来就要学会如何操作这些数据。运算符就是操作数据的工具,就像厨房里的刀、铲、勺,每种工具各有用途。

1. 算术运算符

最基础的运算符,用于数学计算。

基本运算

运算符说明示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/除法5 / 22.5
//整除5 // 22
%取模(余数)5 % 21
**乘方2 ** 38
# 算术运算示例
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. 比较运算符

用于比较两个值,返回TrueFalse

运算符说明示例结果
==等于5 == 5True
!=不等于5 != 3True
>大于5 > 3True
<小于5 < 3False
>=大于等于5 >= 5True
<=小于等于5 <= 3False
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. 逻辑运算符

用于组合多个条件。

运算符说明示例说明
andTrue and False都为真才为真
orTrue or False有一个为真就为真
notnot 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 & 31
|按位或5 | 37
^按位异或5 ^ 36
~按位取反~5-6
<<左移5 << 110
>>右移5 >> 12
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 + yx += 5
-=x = x - yx -= 3
*=x = x * yx *= 2
/=x = x / yx /= 4
//=x = x // yx //= 2
%=x = x % yx %= 3
**=x = x ** yx **= 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. 运算符优先级

当一个表达式中有多个运算符时,按照优先级执行。

优先级从高到低:

  1. **(乘方)
  2. ~, +, -(一元运算符)
  3. *, /, //, %
  4. +, -
  5. <<, >>
  6. &
  7. ^, |
  8. ==, !=, >, <, >=, <=, is, is not, in, not in
  9. not
  10. and
  11. or
# 优先级示例
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
  • 优先级:记不住就用括号

运算符是编程的基本工具,就像厨师的刀具,熟练运用才能做出好菜。


练习题

  1. 计算表达式:10 + 5 * 2 ** 2 - 8 // 3的结果,并说明计算顺序
  2. 写一个程序,判断一个数是否在 10 到 100 之间(包含 10 和 100),使用链式比较
  3. 解释==is的区别,并举例说明

思考题

为什么 Python 的逻辑运算符用andornot,而不是像 Java/C 用&&||!


本文代码示例


相关阅读