迭代器对象不是Python内置的固定构造,而是根据一定规则构造的对象。这些规则意味着迭代器对象或集合对象将被传递给 iter()。如果这是一个迭代器对象,即在其类中描述了next方法 的对象,该方法定义了发出下一个元素并在这些元素耗尽自身时引发 StopIteration 异常的条件,那么 iter() 函数会执行什么操作就这样传递下去吗?还不清楚 iter() 函数对集合对象执行什么操作。我将举一个 for in 循环的例子,理论上,它首先通过 iter() 函数传递传入它的对象(in 之后),然后通过 next() 函数,并在以下情况下停止元素的迭代:停止迭代被称为:
class A:
def __init__(self, qty):
self.qty = qty
def __iter__(self): #Перегружаем оператор взаимодействия с функцией iter(), чтобы он возвращал сам экземпляр т.к. таковой уже является объектом итератором благодаря методу __next__
return self
def __next__(self):
if self.qty > 0 :
self.qty -= 1
return '*'
else : raise StopIteration
a = A(5)
for i in a
print(i)
#Вывод:
#*
#*
#*
#*
#*
但是,我们可能不会使用下一个方法 :
class A:
def __init__(self, qty):
self.qty = qty
def __iter__(self):
return iter(range(self.qty)) # Здесь мы как бы возвращаем изначальный функционал функции iter(), применяя его к объекту-коллекции
a = A(5)
for i in a:
print(i)
#Вывод:
#0
#1
#2
#3
#4
这是否意味着任何集合对象默认都有一个next方法 ,并且 iter() 函数总是只返回对象本身?但在这种情况下,输出意味着什么:
s = [1,2,3,4,5,6]
c = iter(s)
print(type(c))
#Вывод: <class 'list_iterator'>
iter() 函数实际上对列表做了什么?
这是一个特殊的类
list_iterator
,它的解释器版本的源代码可以在这里CPython
查看。您可以使用它
print(dir(c))
来确保它具有方法__iter__
和__next__
。原则上,这里已经反复讨论了如何正确地实现你自己的
iter()
,Python
如果我没记错的话,在不使用单独的类的情况下,效果不是很好,正是因为你需要保持对 的控制__next__
,这可以是只有通过一个新类才能正确完成,其中将有这个类__next__
。