跳到主要内容

迭代

1. 什么是迭代

  • 迭代(Iteration):通过 for 循环遍历 list 或 tuple 等序列,逐个访问元素。
  • Python 用 for ... in 完成迭代;很多语言(如 C)用下标 for (i=0; i<length; i++) 访问 list[i]
  • Python 的 for 抽象程度更高:不仅可用于 list、tuple,还可作用于任何可迭代对象,不依赖下标。

2. 可迭代对象

  • 可迭代对象:能用 for ... in 遍历的对象;有无下标都可以,只要可迭代即可。
  • list、tuple 有下标;dict、字符串等没有下标,但都可被 for 遍历。

3. dict 的迭代

  • 默认for key in d 迭代的是 key;dict 内部无序,迭代顺序可能与插入顺序不一致。
  • 迭代 valuefor value in d.values()
  • 同时迭代 key 和 valuefor k, v in d.items()
d = {'a': 1, 'b': 2, 'c': 3}

for key in d:
print(key) # a, c, b(顺序可能不同)

for value in d.values():
print(value) # 1, 2, 3

for k, v in d.items():
print(k, v) # a 1, b 2, c 3

4. 字符串的迭代

  • 字符串也是可迭代对象,每个元素是字符;可直接 for ch in 'ABC'
for ch in 'ABC':
print(ch) # A B C

5. 判断是否可迭代

  • 使用 collections.abc.Iterableisinstance(obj, Iterable) 为 True 表示可迭代。
from collections.abc import Iterable

isinstance('abc', Iterable) # True
isinstance([1, 2, 3], Iterable) # True
isinstance(123, Iterable) # False

6. 下标循环:enumerate

  • 若要对 list 实现**“索引 + 元素”**的循环(类似 Java 的下标循环),用内置 enumerate:把 list 变成 (索引, 元素) 对。
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
# 0 A
# 1 B
# 2 C
  • 多变量for 可同时解包多个变量,如 for x, y in [(1,1), (2,4), (3,9)]: print(x, y)

小结

要点说明
迭代for ... in 遍历;不依赖下标,作用于可迭代对象即可
dict默认迭代 key;.values() 迭代 value;.items() 迭代 (k,v)
字符串可迭代,按字符遍历
是否可迭代isinstance(obj, Iterable)(需 from collections.abc import Iterable
下标+元素enumerate(list) 得到 (索引, 元素),便于在 for 中同时用下标和值

记忆:能 for x in 某对象 的,就是可迭代对象;要下标用 enumerate

练习:用迭代实现 findMinAndMax(L),返回 list 中最小值和最大值的 tuple;空 list 返回 (None, None)