1.列表和字典的迭代
程序開發中,對列表和字典進行迭代是非常常見的事情。
字典一般可以選擇對key進行迭代、對value迭代和對key/value一起迭代
>>> d = {'a': 1, 'b': 2, 'c': 3} >>> for key in d: ... print(key) ... a c b
如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()
列表的迭代很簡單,但如果既要得到列表中元素的值,還想得到對應值的index,可以這么做:
>>> for i, value in enumerate(['A', 'B', 'C']): ... print(i, value) ... 0 A 1 B 2 C
for
循環里,同時引用了兩個變量,在Python里是很常見的,比如下面的代碼:
>>> for x, y in [(1, 1), (2, 4), (3, 9)]: ... print(x, y) ... 1 1 2 4 3 9
2.Iterable和Iterator
可以直接作用於for
循環的對象統稱為可迭代對象:Iterable
。
可以使用isinstance()
判斷一個對象是否是Iterable
對象:
>>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
可以被next()
函數調用並不斷返回下一個值的對象稱為迭代器:Iterator
。
可以使用isinstance()
判斷一個對象是否是Iterator
對象:
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函數:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
因此list的for循環也完全等價於下面的迭代方法(java程序員一定會有似曾相識的感覺):
it = iter([1, 2, 3, 4, 5]) # 循環: while True: try: # 獲得下一個值: x = next(it) except StopIteration: # 遇到StopIteration就退出循環 break
本文參考自廖雪峰老師的python教程。