Skip to content

Python 值与序列:类型、切片、列表和队列 ​

Python 变量、类型与切片 ​

名称与值 ​

赋值把名称绑定到对象,不是声明一个永远固定类型的盒子。缩进划分代码块;注释从 # 开始。

python
count = 3
name = "Alice"
a, b = 1, 2
message = f"{name}: {count}"
assert message == "Alice: 3"

None 表示没有值;判断是否为 None 用 is None。比较值是否相等用 ==,不要把 is 当作数值或字符串比较。

选择基本类型 ​

类型示例用途与边界
int、float3、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") 等显式转换;无效转换会抛异常。

python
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] 包含起点,不包含终点,步长不能为零。负索引从末尾计算;省略边界时会根据步长方向选取默认边界。

python
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 列表、栈与队列 ​

列表操作 ​

列表适合按顺序保存和修改元素;索引与切片见 变量与类型。

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,无需两种重复做一次。

python
stack = []
stack.append("first")
stack.append("second")
assert stack.pop() == "second"
assert stack.pop() == "first"
assert not stack

队列:先进先出 ​

列表 pop(0) 需要移动后续元素,不适合频繁从头部出队。使用标准库 collections.deque,两端添加和弹出更合适;线程间协作队列另看 queue.Queue。

python
from collections import deque

queue = deque(["first", "second"])
queue.append("third")
assert queue.popleft() == "first"
assert list(queue) == ["second", "third"]

练习与资料 ​

用栈反向输出一组任务,用队列按录入顺序处理任务,并覆盖空容器情况。更多容器操作见 数据结构教程;下一步读 错误与异常。

参考解答 ​

提示:出栈或出队前检查容器,空输入应自然结束。以下局部完整参考会分别得到相反顺序与录入顺序:

python
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 queue

tasks改为空列表时两个结果都为空,不调用空容器的pop;若业务直接调用,则应处理IndexError。参考未执行。

继续阅读