Appearance
迭代器
使用for循环遍历一个class
在原来的数据基础上面取下一个
验证一个函数是不是可以迭代, 实际检测的是这一个类里面没有没有
__iter__
这一个方法pythonfrom collections.abc import Iterable from collections.abc import Iterator isinstance(测试的类型, Iterable) # 看是不是可迭代的 isinstance(测试的类型, Iterator) # 看是不是一个迭代器
可以使用
iter
获取一个对象的迭代器, 之后可以使用next
依次获取下一个对象
python
from collections.abc import Iterable
nums = [11, 22, 33, 44, 55]
print(isinstance(nums, Iterable))
# Output: True
iter_obj = iter(nums)
print(isinstance(iter_obj, Iterable))
# Output: True
print(next(iter_obj))
# Output: 11
print(next(iter_obj))
# Output: 22
print(next(iter_obj))
# Output: 33
print(next(iter_obj))
# Output: 44
print(next(iter_obj))
# Output: 55
print(next(iter_obj))
# Output: StopIteration
取数据的时候超出长度的时候会出现一个错误, for循环里面有一个错误处理
自己定义
使用两个方法__iter__
和__next__
__iter__
这一个会返回一个迭代器
__next__
可以返回下一个元素的位置
python
class MyList(object):
def __init__(self) -> None:
self.items = []
def add(self, item):
self.items.append(item)
def __iter__(self):
return MyIterator(self)
class MyIterator(object):
def __init__(self, my_list) -> None:
self.index = 0
self.my_list = my_list
def __next__(self):
if self.index < len(self.my_list.items):
item = self.my_list.items[self.index]
self.index += 1
return item
else:
raise StopIteration
def __iter__(self):
return self
my_list = MyList()
my_list.add(4)
my_list.add(5)
my_list.add(6)
for i in my_list:
print(i)
# Output:
# 4
# 5
# 6
这里使用两个类的时候, 这一个类可以多次被for循环调用
其他使用
不只是for循环可以使用迭代器, list()
之类的函数也可以使用迭代器
python
list2 = list(my_list)
print(list2)
bashPS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" [4, 5, 6]