目录
1. 迭代器
当类中定义了__iter__和 __next__两个方法
- __iter__: 返回对象本身,即self
- __next__: 返回下一个数据,如果没有数据,则抛出StopIteration异常
# 创建迭代器
class IT(object):
def __init__(self):
self.num = 100
def __iter__(self):
return self
def __next__(self):
self.num -= 1
if self.num == -1:
raise StopIteration()
return self.num
2.迭代器对象
通过迭代器类实例化创建的迭代器对象
- 可以通过 obj.__next__() 或 python内置函数next(obj) 来获取下一个数据
- 还支持对迭代器对象进行for循环【注意:for循环在内部执行时,先执行__iter__()方法,获取一个迭代器对象,然后不断执行__next__取值】
# 实例化迭代器对象
it = IT()
# 使用 __next__() 来获取下一个数据
print(it.__next__()) # 9
print(it.__next__()) # 8
# 使用 next(obj) 来获取下一个数据
print(next(it)) # 7
print(next(it)) # 6
# 使用 for 循环来遍历数据
for item in it:
print(item, end=" ") # 5 4 3 2 1 0
3. 可迭代对象
如果一个类中有__iter__方法并且返回一个迭代器对象,则称以这个类创建的对象叫可迭代对象。
- 可迭代对象是可以用for来进行循环:与上述对迭代器对象的for循环步骤相同,先在循环内部先执行__iter__方法,获取迭代器对象,然后再执行迭代器对象的__next__函数,逐步取值。
- List,tuple, dict和set都是可迭代对象
class IT2(object):
def __iter__(self):
return IT() # 返回迭代器对象
it2 = IT2() # 生成可迭代对象
for item in IT2():
print(item, end=" ") # 9 8 7 6 5 4 3 2 1 0
4. range函数
在编程中常见的 range()函数,如 v1=range(100) 返回的是一个可迭代对象v1,因此
- v2 = v1.__iter__获取的是迭代器对象,每执行一次 next(v2) 就会进行逐步取值
- 或者用for循环进行遍历取值
v1 = range(5)
print(isinstance(v1, Iterable)) # True,返回的是可迭代对象
# 1. 使用for循环遍历
for v in v1:
print(v, end=" ") # 0 1 2 3 4 0
# 2. 先通过__iter__()获取迭代器对象,然后使用next获取到对应的值
v1_iterator = v1.__iter__()
print(next(v1_iterator)) # 0
print(next(v1_iterator)) # 1
print(next(v1_iterator)) # 2
print(next(v1_iterator)) # 3