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

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#


相关文章

学会这个Python编程范式,让你的代码质量提升10倍!

函数式编程作为一种重要的编程范式,强调使用函数来解决问题,避免改变状态和可变数据。在Python这门多范式编程语言中,函数式编程的概念和技术正在被越来越多的开发者所接受和应用。不可变性作为函数式编程的...

Python 基础:如何编写阶乘程序

什么是阶乘,你为什么应该关心?如果你是 Python 新手,你可能已经听说过“阶乘”这个术语。但它是怎么回事,为什么它很重要呢?一个数的阶乘(表示为n!)就是从 1 到n所有正整数的乘积。例如:5!...

用 python 的柏林噪声库(noise)实现随机行走

柏林噪声太神奇了,最近在看一本 processing 的书,里面讲到随机行走,就想着能不能在 pygame 里实现,查了一通,发现案例很少,有个 noise 库,直接 pip install 还报错,...

OpenAI久违发了篇「正经」论文:线性布局实现高效张量计算

机器之心报道编辑:PandaOpenAI 发论文的频率是越来越低了。如果你看到了一份来自 OpenAI 的新 PDF 文件,那多半也是新模型的系统卡或相关增补文件或基准测试,很少有新的研究论文。至于原...

8.Python趣味数学笔记:点积和叉积

向量相乘分为:点积(例如:)和叉积(例如:),对于数来说,这些符号意思都是表示数字相乘,但是对于向量来说,却表示完全不同的操作。点积点积(也叫内积)是对两个向量的运算,返回一个标量。点积适用于二维、三...

零基础Python完全自学教程14:Python中的序列知识详解

欢迎你来到站长学堂,学习站长在线出品的在线课程《零基础Python完全自学教程》今天给大家分享的是第14课《Python中的序列知识详解》。本节课主要内容有:序列索引、序列切片、序列相加、序列相乘、序...