专业的编程技术博客社区

网站首页 > 博客文章 正文

30天学会Python编程:4. Python运算符与表达式

baijin 2025-07-03 12:09:41 博客文章 4 ℃ 0 评论

4.1 运算符概述

4.1.1 运算符分类

Python运算符可分为以下几大类:

4.1.2 运算符优先级

表4-1 Python运算符优先级(从高到低)

运算符

描述

示例

**

指数

2**3 → 8

~ + -

按位取反/正负号

~5, +x, -y

* / // %

乘/除/整除/取模

10//3 → 3

+ -

加/减

3+5 → 8

<< >>

位移

4<<1 → 8

&

按位与

5&3 → 1

^

按位异或

5^3 → 6

|

按位或

5|3 → 7

< <= > >=

比较运算

3<5 → True

== !=

等于/不等于

3==3 → True

is, is not

身份运算

x is None

in, not in

成员运算

2 in [1,2,3]

not

逻辑非

not True → False

and

逻辑与

True and False → False

or

逻辑或

True or False → True

4.2 算术运算符

4.2.1 基本算术运算

a, b = 10, 3

print(a + b)   # 加法 13
print(a - b)   # 减法 7
print(a * b)   # 乘法 30
print(a / b)   # 除法 3.333...
print(a // b)  # 整除 3
print(a % b)   # 取模 1
print(a ** b)  # 指数 1000

4.2.2 增强算术运算

x = 5
x += 2  # 等价于 x = x + 2
x **= 3 # 等价于 x = x ** 3
print(x) # 343

4.2.3 特殊算术行为

# 除法总是返回浮点数
print(10 / 2)  # 5.0 

# 整数除法向下取整
print(-7 // 2)  # -4

# 复数运算
c = 3 + 4j
print(c * 2)  # (6+8j)

4.3 比较运算符

4.3.1 基本比较运算

a, b = 5, 7

print(a == b)  # False
print(a != b)  # True
print(a < b)   # True
print(a >= b)  # False

4.3.2 链式比较

x = 5
print(1 < x < 10)  # True (等价于 1 < x and x < 10)

# 支持多个比较
print(1 < x <= 5 < 10)  # True

4.3.3 特殊比较情况

# 浮点数比较
print(0.1 + 0.2 == 0.3)  # False (精度问题)
print(abs((0.1 + 0.2) - 0.3) < 1e-10)  # 正确比较方式

# 不同类型比较
print(10 == 10.0)   # True (值相等)
print(10 is 10.0)   # False (不是同一对象)

4.4 逻辑运算符

4.4.1 基本逻辑运算

x, y = True, False

print(x and y)  # False
print(x or y)   # True
print(not x)    # False

4.4.2 短路求值特性

def check():
    print("check()被调用")
    return True

False and check()  # check()不会被调用
True or check()    # check()不会被调用

4.4.3 实际应用技巧

# 默认值设置
name = user_input or "匿名用户"

# 安全访问字典
value = my_dict.get("key") or default_value

# 条件执行
is_admin and admin_only_function()

4.5 位运算符

4.5.1 基本位运算

a, b = 0b1010, 0b1100  # 10, 12

print(bin(a & b))   # 按位与 0b1000 (8)
print(bin(a | b))   # 按位或 0b1110 (14)
print(bin(a ^ b))   # 按位异或 0b0110 (6)
print(bin(~a))      # 按位取反 -0b1011 (-11)
print(bin(a << 2))  # 左移 0b101000 (40)
print(bin(b >> 1))  # 右移 0b0110 (6)

4.5.2 位运算应用

# 快速乘除2的幂次
print(5 << 1)  # 10 (5*2)
print(20 >> 2) # 5 (20/4)

# 判断奇偶
num = 7
is_odd = num & 1  # 1为奇,0为偶

# 交换两个数
a, b = 3, 4
a ^= b
b ^= a
a ^= b
print(a, b)  # 4, 3

4.6 成员与身份运算符

4.6.1 成员运算符(in)

lst = [1, 2, 3]
dct = {"a": 1, "b": 2}

print(2 in lst)     # True
print(4 not in lst) # True
print("a" in dct)   # True (检查键)
print(1 in dct)     # False

4.6.2 身份运算符(is)

x = [1, 2]
y = [1, 2]
z = x

print(x == y)  # True (值相等)
print(x is y)  # False (不同对象)
print(x is z)  # True (同一对象)

# 小整数缓存
a = 256
b = 256
print(a is b)  # True (Python缓存小整数)

c = 257
d = 257
print(c is d)  # False (大整数不缓存)

4.7 海象运算符(:=)

4.7.1 基本用法

Python 3.8+引入的赋值表达式运算符:

# 传统写法
n = len("hello")
if n > 3:
    print(n)

# 使用海象运算符
if (n := len("hello")) > 3:
    print(n)

4.7.2 实用场景

# 循环中读取并判断
while (line := input()) != "quit":
    print(f"输入: {line}")

# 列表推导式
numbers = [1, 2, 3, 4, 5]
squares = [y for x in numbers if (y := x**2) > 10]

4.8 运算符重载

4.8.1 类中运算符重载

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(2, 3)
v2 = Vector(1, 4)
print(v1 + v2)  # Vector(3, 7)

4.8.2 可重载运算符列表

表4-2 常用运算符重载方法

运算符

方法名

说明

+

__add__

加法

-

__sub__

减法

*

__mul__

乘法

/

__truediv__

真除法

//

__floordiv__

整除

%

__mod__

取模

**

__pow__

幂运算

<<

__lshift__

左移

>>

__rshift__

右移

&

__and__

按位与

|

__or__

按位或

^

__xor__

按位异或

<

__lt__

小于

==

__eq__

等于

4.9 综合应用

案例1:简易计算器

def calculator():
    """支持加减乘除和指数的计算器"""
    while True:
        try:
            expr = input("请输入表达式(或q退出): ").strip()
            if expr.lower() == 'q':
                break
            
            # 使用eval实现简单计算(生产环境应使用更安全的方式)
            result = eval(expr)
            print(f"结果: {result:.2f}" if isinstance(result, float) else f"结果: {result}")
        
        except (SyntaxError, NameError):
            print("错误:无效表达式")
        except ZeroDivisionError:
            print("错误:不能除以零")
        except Exception as e:
            print(f"错误:{e}")

if __name__ == "__main__":
    calculator()

案例2:权限控制系统

# 使用位运算管理权限
READ = 0b0001  # 1
WRITE = 0b0010 # 2
EXECUTE = 0b0100 # 4
ADMIN = 0b1000  # 8

class User:
    def __init__(self, name, permissions=0):
        self.name = name
        self.permissions = permissions
    
    def add_permission(self, perm):
        self.permissions |= perm
    
    def remove_permission(self, perm):
        self.permissions &= ~perm
    
    def has_permission(self, perm):
        return self.permissions & perm == perm
    
    def __str__(self):
        perms = []
        if self.has_permission(READ): perms.append("READ")
        if self.has_permission(WRITE): perms.append("WRITE")
        if self.has_permission(EXECUTE): perms.append("EXECUTE")
        if self.has_permission(ADMIN): perms.append("ADMIN")
        return f"{self.name} 权限: {', '.join(perms) or '无'}"

# 使用示例
user = User("Alice")
user.add_permission(READ | WRITE)
print(user)  # Alice 权限: READ, WRITE

print("有写入权限:", user.has_permission(WRITE))  # True
print("有执行权限:", user.has_permission(EXECUTE))  # False

4.10 学习路线图

4.11 学习总结

  1. 核心要点
  2. 掌握各类运算符的优先级和结合性
  3. 理解逻辑运算符的短路特性
  4. 熟练使用成员和身份运算符
  5. 了解位运算的实际应用场景
  6. 实践建议
  7. 复杂表达式使用括号明确优先级
  8. 使用is比较单例对象(如None)
  9. 避免在复杂表达式中使用海象运算符
  10. 合理重载运算符增强类功能
  11. 进阶方向
  12. 运算符的魔术方法实现
  13. 自定义异常处理运算错误
  14. 使用functools.total_ordering简化比较运算
  15. 元编程中的运算符控制
  16. 常见陷阱
  17. 混淆==is的用途
  18. 忽略浮点数比较的精度问题
  19. 误用可变对象的+=运算
  20. 忘记运算符优先级导致的逻辑错误

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #python# #在头条记录我的2025#


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表