Python基础之迭代器
本节将介绍Python中的迭代器以及如何为自己的类添加迭代功能。
我们知道,在Python中有 for...in... 的语法,通过该语法可以方便的遍历某个容器中的所有元素。之所以能够这样操作,是因为这些容器都实现了迭代器功能,例如列表,元组,字符串,字典等。
遍历容器
下面这个例子将介绍通过迭代器遍历列表,元组,字符串和字典。例如:
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)
while True:
try:
print(next(my_iter), end=" ")
except StopIteration as e:
break
print()
my_tuple = [1, 2, 3, 4, 5]
my_iter = iter(my_tuple)
while True:
try:
print(next(my_iter), end=" ")
except StopIteration as e:
break
print()
str = "This is a string."
my_iter = iter(str)
while True:
try:
print(next(my_iter), end=" ")
except StopIteration as e:
break
print()
dic = {'name': 'xiaoming', 'age': 24, 'sex': 'M'}
my_iter = iter(dic)
while True:
try:
print(next(my_iter), end=" ")
except StopIteration as e:
break
运行结果:
D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_10/iterator_01.py
1 2 3 4 5
1 2 3 4 5
T h i s i s a s t r i n g .
name age sex
Process finished with exit code 0
可以看出,如果某个对象是可迭代的,那么我们可以通过调用iter()内置函数获取到该对象的迭代器对象,然后一直调用next()函数来遍历此迭代器。如果抛出StopIteration异常,那么表示原对象遍历完毕。
for循环的本质就是创建了一个迭代器对象,然后一直调用next()函数来完成遍历的。
自定义列表
可以创建一个自定义的列表,使其支持迭代器功能。例如:
class MyList:
def __init__(self, data=[]):
self.__data = data
self.__index = 0
def __iter__(self):
return self
def __next__(self):
if len(self.__data) == 0 or self.__index >= len(self.__data):
raise StopIteration
element = self.__data[self.__index]
self.__index += 1
return element
my_list = MyList("Hello world!")
for i in my_list:
print(i, end=" ")
print()
my_list = MyList([1, 2, 3, 4, 5])
my_iter = iter(my_list)
while True:
try:
print(next(my_iter), end=" ")
except StopIteration as e:
break
运行结果:
D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_10/iterator_02.py
H e l l o w o r l d !
1 2 3 4 5
Process finished with exit code 0
要让自己的某个类是可迭代的,需要实现两个方法,__iter__(self) 和 __next__(self)。前者可以做一些初始化的工作,但必须返回self本身,后者用于实现如何得到下一个元素的逻辑。