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

    • 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 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

元组

元组(tuple)与列表非常相似,都是有序序列,支持索引和切片。但元组有一个根本区别:它是不可变的。创建后不能添加、删除或修改任何元素。

创建元组

# 圆括号表示
point = (3, 4)

# 空元组
empty = ()

# 单元素元组:必须加逗号!
single = (5,)       # 逗号不能省略
not_tuple = (5)     # 这只是整数 5,不是元组

print type(single)       # <type 'tuple'>
print type(not_tuple)   # <type 'int'>

# 不带括号也可以(元组打包)
t = 1, 2, 3
print type(t)       # <type 'tuple'>

单元素元组的逗号是最常见的陷阱。(5) 中的圆括号被解释为数学优先级符号,而非元组构造符。只有 (5,) 才是元组。

索引与切片

元组支持所有序列操作:

t = (10, 20, 30, 40, 50)

print t[0]          # 10
print t[-1]         # 50
print t[1:4]        # (20, 30, 40)
print t[::-1]       # (50, 40, 30, 20, 10)

不可变的含义

"不可变"意味着不能修改元组本身,但如果元组包含可变对象(如列表),这些对象的内容仍然可以修改:

# 元组元素不能重新赋值
t = (1, 2, 3)
t[0] = 100          # TypeError: 'tuple' object does not support item assignment

# 但可变对象的内容可以修改
t = ([1, 2], [3, 4])
t[0].append(3)      # 合法!修改的是列表,不是元组
print t             # ([1, 2, 3], [3, 4])

t[0] = [5, 6]       # TypeError!不能替换整个列表

这种"浅不可变"特性让元组可以安全地作为字典键(要求元素可哈希),同时内部又能容纳动态数据。

元组拆包

元组最实用的特性是拆包(unpacking)——把元组的元素一次性赋给多个变量:

point = (3, 4)
x, y = point
print x     # 3
print y     # 4

# 交换变量(无需临时变量)
a, b = 10, 20
a, b = b, a
print a, b  # 20 10

# 右边先打包成元组,再拆包给左边

拆包时变量数必须与元素数匹配:

t = (1, 2, 3)
a, b = t        # ValueError: too many values to unpack
a, b, c, d = t  # ValueError: need more than 3 values to unpack

扩展拆包(Python 2 不支持)

Python 3 支持 a, *rest = seq 的扩展拆包,Python 2 不支持。在 Python 2 中需要切片:

# Python 2
nums = [1, 2, 3, 4, 5]
first = nums[0]
rest = nums[1:]

# Python 3 可以写:first, *rest = nums

元组作为字典键

因为元组不可变且可哈希,可以作为字典的键:

# 用坐标作为键
locations = {
    (0, 0): "origin",
    (1, 0): "east",
    (0, 1): "north",
}

print locations[(1, 0)]     # "east"

列表不能作为字典键,因为它是可变的:

d = {}
d[[1, 2]] = "A"     # TypeError: unhashable type: 'list'

元组 vs 列表的选择

场景推荐
数据不需要修改元组
需要作为字典键元组
需要保证数据不被意外修改元组
需要频繁添加/删除元素列表
需要排序列表
# 用元组表示固定结构
def get_user():
    return ("Alice", 25, "Engineer")  # 姓名、年龄、职业

name, age, job = get_user()

# 用列表表示动态集合
scores = [85, 90, 78]
scores.append(92)

元组的不可变性是一种语义信号:它告诉读者"这组数据是固定的,不要修改"。在团队协作中,这种信号能减少意外修改带来的 bug。

上一页
列表推导式
下一页
字典基础