飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

序列解包

序列解包是 Python 中将可迭代对象的元素批量赋值给多个变量的语法特性。

基本解包

当赋值号左侧是逗号分隔的变量列表时,Python 自动将右侧元素依次拆给这些变量:

t = (12345, 54321, 'hello!')
x, y, z = t
print(x)   # 12345

任何序列或可迭代对象都支持解包:

a, b, c = [1, 2, 3]
first, second, third = "abc"
x, y, z = range(3)

左侧变量数与右侧元素数必须严格相等,否则会报错:

a, b = [1, 2, 3]      # ValueError: too many values to unpack

扩展解包:星号 *

Python 3 允许用 *变量 收集"剩余"元素:

first, *rest = [1, 2, 3, 4, 5]    # first=1, rest=[2,3,4,5]
*rest, last = [1, 2, 3, 4, 5]    # rest=[1,2,3,4], last=5
first, *middle, last = [1, 2, 3, 4, 5]  # middle=[2,3,4]

每个解包表达式中只能有一个星号变量,收集结果永远是列表:

a, *b = (1,)       # a=1, b=[]
a, *b, c = (1, 2)  # a=1, b=[], c=2

嵌套解包

解包支持嵌套结构:

data = ("Alice", (25, "Engineer"))
name, (age, job) = data
print(age)   # 25

matrix = [[1, 2], [3, 4]]
(a, b), (c, d) = matrix
print(a, b, c, d)   # 1 2 3 4

解包在赋值中的应用

不借助临时变量交换两个值:

a, b = 1, 2
a, b = b, a
print(a, b)   # 2 1

拆分复合返回值:

def get_min_max(nums):
    return min(nums), max(nums)
minimum, maximum = get_min_max([3, 1, 4, 1, 5])

解包在循环中的应用

for 循环的迭代变量支持解包:

# 遍历字典项
for k, v in {'a': 1, 'b': 2}.items():
    print(k, v)

# 遍历枚举
for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)

# 遍历 zip 结果
for q, a in zip(['name', 'quest'], ['lancelot', 'holy grail']):
    print(q, a)

扩展解包处理长度不定的序列:

records = [('foo', 1, 2), ('bar', 'hello'), ('baz', 3, 4, 5)]
for tag, *args in records:
    print(tag, args)

解包在函数参数中的应用

调用函数时,* 将序列展开为位置参数,** 将字典展开为关键字参数:

def greet(name, dept, salary):
    print(f"{name} from {dept}, salary {salary}")

info = ["Alice", "Engineering", 80000]
greet(*info)   # 等价于 greet("Alice", "Engineering", 80000)

emp = {"name": "Bob", "dept": "Sales", "salary": 70000}
greet(**emp)   # 等价于 greet(name="Bob", dept="Sales", salary=70000)

* 和 ** 可以混合使用,但顺序必须是位置参数在前,关键字参数在后:

def func(a, b, c, d=0, e=0):
    print(a, b, c, d, e)
func(*[1, 2], 3, **{"d": 4, "e": 5})   # 1 2 3 4 5

边界情况

解包空序列时,非星号变量必须能匹配到值:

a, *b = []       # ValueError: not enough values to unpack
*a, = [1, 2, 3]  # ✅ a = [1, 2, 3]

右侧必须支持迭代:

a, b = 10        # TypeError: cannot unpack non-iterable int object
上一页
元组
下一页
集合