Python 值与序列:类型、切片、列表和队列
Python 变量、类型与切片
名称与值
赋值把名称绑定到对象,不是声明一个永远固定类型的盒子。缩进划分代码块;注释从 # 开始。
count = 3
name = "Alice"
a, b = 1, 2
message = f"{name}: {count}"
assert message == "Alice: 3"None 表示没有值;判断是否为 None 用 is None。比较值是否相等用 ==,不要把 is 当作数值或字符串比较。
选择基本类型
| 类型 | 示例 | 用途与边界 |
|---|---|---|
int、float | 3、3.5 | 整数与浮点数;二进制浮点计算可能有舍入误差 |
str、bool | "hello"、True | 文本与布尔值 |
list | [1, 2] | 有顺序、可修改的序列 |
tuple | (1, 2) | 不可修改元素引用的序列;内部引用的列表仍可变 |
set | {1, 2} | 去重与成员检查;空集合写 set() |
dict | {"name": "Alice"} | 键值映射;键需可哈希,按插入顺序迭代 |
type(value) 查看类型,isinstance(value, str) 检查类型关系。用 int("12") 等显式转换;无效转换会抛异常。
items = [1, 2]
alias = items
alias.append(3)
assert items == [1, 2, 3] # 两个名称指向同一列表
copy = items[:]
copy.append(4)
assert items == [1, 2, 3] # 浅拷贝只复制外层切片
sequence[start:stop:step] 包含起点,不包含终点,步长不能为零。负索引从末尾计算;省略边界时会根据步长方向选取默认边界。
values = [0, 1, 2, 3, 4, 5]
assert values[1:4] == [1, 2, 3]
assert values[::2] == [0, 2, 4]
assert values[::-1] == [5, 4, 3, 2, 1, 0]
assert values[4:1:-1] == [4, 3, 2]
assert "hello world"[:5] == "hello"负步长保持为负数,表示向左走;不是交换边界后把步长改成正数。切片越界会截到有效范围,单个索引越界会抛 IndexError。
练习与资料
取出偶数位置的元素并倒序,比较 values[1:4] 与 values[4:1] 的结果。内置类型文档提供精确定义;下一步读 条件与循环。
参考解答
这里“偶数位置”按从0开始的索引0、2、4理解:values[::2][::-1] 为 [4, 2, 0]。若按日常从1计数的第2、4、6项,答案则是 values[1::2][::-1],即 [5, 3, 1],实现前需先约定计数方式。values[1:4] 为 [1, 2, 3],values[4:1] 的默认步长为正,起点大于终点,因此为空列表;要向左走写 values[4:1:-1]。以上为静态推导。
Python 列表、栈与队列
列表操作
列表适合按顺序保存和修改元素;索引与切片见 变量与类型。
items = [3, 1]
items.append(2) # 添加一个元素
items.extend([4, 5]) # 逐项追加
items.remove(4) # 删除首个相等元素;不存在时 ValueError
last = items.pop() # 删除并返回末尾;空列表时 IndexError
assert last == 5
assert sorted(items) == [1, 2, 3] # 返回新列表
assert items == [3, 1, 2]
items.sort() # 原地排序,返回 None
assert items == [1, 2, 3]append、extend、sort 是列表方法,不是同名内置函数。copy() 与切片都只做浅拷贝;嵌套列表仍共享内部对象。
栈:后进先出
用列表尾部的 append 和 pop 即可。空栈的处理由业务决定,可以先检查,也可以捕获 IndexError,无需两种重复做一次。
stack = []
stack.append("first")
stack.append("second")
assert stack.pop() == "second"
assert stack.pop() == "first"
assert not stack队列:先进先出
列表 pop(0) 需要移动后续元素,不适合频繁从头部出队。使用标准库 collections.deque,两端添加和弹出更合适;线程间协作队列另看 queue.Queue。
from collections import deque
queue = deque(["first", "second"])
queue.append("third")
assert queue.popleft() == "first"
assert list(queue) == ["second", "third"]练习与资料
用栈反向输出一组任务,用队列按录入顺序处理任务,并覆盖空容器情况。更多容器操作见 数据结构教程;下一步读 错误与异常。
参考解答
提示:出栈或出队前检查容器,空输入应自然结束。以下局部完整参考会分别得到相反顺序与录入顺序:
from collections import deque
tasks = ["first", "second"]
stack = tasks.copy()
reversed_tasks = []
while stack:
reversed_tasks.append(stack.pop())
assert reversed_tasks == ["second", "first"]
queue = deque(tasks)
ordered_tasks = []
while queue:
ordered_tasks.append(queue.popleft())
assert ordered_tasks == tasks
assert not stack and not queuetasks改为空列表时两个结果都为空,不调用空容器的pop;若业务直接调用,则应处理IndexError。参考未执行。
继续阅读
- 开发实践
- 排错
- 开发实践