可迭代对象
- 用途:给
for...in...
遍历的对象。 - 数据类型:
list
、dict
、tuple
、set
、str
以及生成器等。 - 满足条件:需要实现一个
__iter__
方法,且该方法要返回一个迭代器对象。
迭代器
- 用途:用来返回数据。每次循环时,就会调用迭代器的
next
或者__next__
方法,通过该方法来获取数据。 - 满足条件:
- 在
Python2
中:要实现两个方法,分别是__iter__
和next
方法。 - 在
Python3
中:要实现两个方法,分别是__iter__
和__next__
方法。
- 在
iter函数
用来获取一个可迭代对象的迭代器,iter(可迭代对象)
。
自定义for...in...
遍历的事例:(类似于range(1,10))
class MyRangeIterator(object):
"""
MyRangeIterator是自定义迭代器
"""
def __init__(self, start, end):
self.index = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.index < self.end:
temp = self.index
self.index += 1
return temp
else:
raise StopIteration()
class MyRange(object):
"""
MyRange是自定义可迭代对象
"""
def __init__(self, start, end):
self.start = start
self.end = end
def __iter__(self):
# 这个方法返回一个迭代器对象
return MyRangeIterator(self, start, end)
ret = MyRange(1, 10)
for x in ret:
print(x)
for...in...
原理:
ret_iterator = iter(ret)
while True:
try:
x = ret_iterator.__next__()
print(x)
except StopIteration:
break
若将迭代器和可迭代对象两者都放在同一个对象中,则可迭代对象就只能遍历一次:(在第一次初始化一个对象时,MyRange的__iter__
方法返回了一个迭代器对象,就会调用__next__
方法,直至最后self.index < self.end不满足,停止迭代。当再次用初始化好的对象遍历时,此时的self.index < self.end不满足,便停止迭代。即只遍历一次)
class MyRange(object):
def __init__(self, start, end):
self.start = start
self.end = end
self.index = start
def __iter__(self):
return self
def __next__(self):
if self.index < self.end:
temp = self.index
self.index += 1
return temp
else:
raise StopIteration()
my_range = MyRange(1, 10)
for x in my_range:
print(x)
print('='*10)
for y in my_range:
print(y)