迭代器 导包、获取、异常以及自定义“可迭代对象”
如何判断一个对象是不是迭代器
isinstance(数据, Iterable)
导包
from collections.abc import Iterable, Iterator 导包
- Iterable(可迭代对象):可迭代对象的本质就是可以向我们提供一个这样二点中间’人’,即迭代器帮助我们对其进行迭代遍历使用
- Iterator(迭代器):实现iter和next方法的类 就可以是实例化迭代器f
在对象中获取迭代器或者获取数据
# 迭代器只能获取一次,要重新获取一个迭代器才能重新获取数据
变量名 = iter(数据变量名)
print(next(变量名)) # 第一次获取
print(next(变量名)) # 第二次获取
...
print(next(变量名)) # 第N次获取
StopIteration异常
代码示例:
from collections.abc import Iterator
nums = [11, 22, 33, 44]
nums_iter = iter(nums)
print("nums", isinstance(nums, Iterator))
print("nums_iter", isinstance(nums_iter, Iterator))
num1 = next(nums_iter)
print(num1)
num2 = next(nums_iter)
print(num2)
num3 = next(nums_iter)
print(num3)
num4 = next(nums_iter)
print(num4)
num5 = next(nums_iter) # 这里会产生异常
print(num5)
运行结果:
nums False
nums_iter True
11
22
33
44
Traceback (most recent call last):
File "C:/Iterator.py", line 23, in <module>
num5 = next(nums_iter) # 这里会产生异常
StopIteration
- 如果next输出完数据后,再次获取数据会报错
自定义“可迭代对象”
一个类中有__iter__方法和__next__方法 就是一个迭代器
- __iter__函数:一个具备了__iter__方法的对象,就是一个可迭代对象
- __next__函数:
- 函数获取可迭代对象的数据。
- 当全部数据正常获取完毕 在__next__方法中要使用raise StopIteration抛出异常结束获取
代码示例:
class MyList(object):
def __init__(self):
self.container = []
def add(self, item):
self.container.append(item)
def __iter__(self):
'''
只要一个类 重写了此方法就是一个可迭代对象
返回一个迭代器对象
注意传入的self是MyList对象
:return:
'''
return MyIterator(self)
class MyIterator(object):
'''
自定义一个迭代器
实现 iter 和next方法的类 就可以实例化迭代器了
:param object:
:return:
'''
def __init__(self, mylist):
self.mylist = mylist
# 获取数据用的下标
self.current_indedx = 0
def __iter__(self):
return self
def __next__(self):
if self.current_indedx < len(self.mylist.container):
# 获取当前数据
item = self.mylist.container[self.current_indedx]
# 获取完数据后 下标+1
self.current_indedx += 1
# 数据返回
return item
else:
# 全部数据正常获取完毕 这里要抛出异常
# 把下标设置为0 下次可以继续获取
self.current_indedx = 0
raise StopIteration
mylist = MyList()
# 添加数据
mylist.add(1)
mylist.add(2)
mylist.add(3)
mylist.add(4)
mylist.add(5)
mylist_iter = iter(mylist)
'''
1 找到要遍历的对象的迭代器
2 调用迭代器的next方法获取数据
3 遇到StopIteration异常 停止循环
'''
for num in mylist_iter:
print(num)
print('-----------------------------')
# mylist_iter = iter(mylist)
for num in mylist_iter:
print(num)
运行结果:
C:\python37\pythonw.exe "C:/自定义可迭代器.py"
1
2
3
4
5
-----------------------------
1
2
3
4
5
Process finished with exit code 0