在Python中,迭代(Iteration)是遍历数据的常用方式,通常通过for ... in
结构实现。它比传统的基于下标的循环(如C语言中的for(i=0; i<n; i++)
)更加灵活和简洁。
1. 迭代可迭代对象
Python中的for
循环不仅可以遍历list
或tuple
,还可以遍历其他所有可迭代对象,比如dict
和字符串。
# 迭代list
for item in [1, 2, 3]:
print(item)
# 迭代字符串
for ch in 'ABC':
print(ch)
# 迭代字典(默认迭代键)
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
"""
Python 的字典对象实现了一个特殊的迭代方法 __iter__(),它默认返回的是 .keys() 的迭代器。
所以这几种写法的效果是一样的(都遍历字典的键):
for key in d:
for key in d.keys():
for key in dict.__iter__(d):
"""
字典默认迭代的是键,如果要迭代值或键值对,可以使用:
d.values()
遍历所有值d.items()
遍历键值对
& 小结(对比表)
语法 | 遍历内容 |
---|---|
for k in d: |
键(默认) |
for v in d.values(): |
值 |
for k, v in d.items(): |
键值对(元组) |
2. 如何判断对象是否可迭代?
可以使用collections.abc
模块的Iterable
类型判断:
from collections.abc import Iterable
print(isinstance('abc', Iterable)) # True,字符串可迭代
print(isinstance([1,2,3], Iterable)) # True,列表可迭代
print(isinstance(123, Iterable)) # False,整数不可迭代
3. 同时获取索引和值 —— enumerate
Python内置函数enumerate
可以同时获得元素的索引和值,非常方便:
for index, value in enumerate(['A', 'B', 'C']):
print(index, value)
"""
输出:
0 A
1 B
2 C
"""
这类似于Java等语言中的带下标遍历,写法更简洁。
4. 多变量解包
在 Python 中,当一个可迭代对象(如列表、元组)的元素是长度固定的元组 / 列表时,可以在循环中直接用对应数量的变量接收元素,这种方式称为 “解包”。例如:
- 若列表元素是 3 元素元组,可写成
for a, b, c in list:
- 本质是简化了 “先获取整个元组,再通过索引取值” 的过程(如
for item in list: x=item[0]; y=item[1]
)。
# for循环中支持同时赋值多个变量,如遍历元组列表:
for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
"""
输出:
1 1
2 4
3 9
"""
总结:Python的迭代机制极大简化了循环操作,for ... in
适用于各种可迭代对象,并支持同时获取索引和值,写法简洁、可读性强,极大提升了开发效率。
5. 使用迭代查找一个list中最小和最大值,并返回一个tuple:
def findMinAndMax(L):
if not L: # 空列表返回 (None, None)
return (None, None)
min = max = L[0] # 初始化最小值和最大值为第一个元素
for x in L:
if x < min:
min = x
elif x > max:
max = x
return (min, max)
# 测试
if findMinAndMax([]) != (None, None):
print('测试失败!')
elif findMinAndMax([7]) != (7, 7):
print('测试失败!')
elif findMinAndMax([7, 1]) != (1, 7):
print('测试失败!')
elif findMinAndMax([7, 1, 3, 9, 5]) != (1, 9):
print('测试失败!')
else:
print('测试成功!')