在Python类中使用__iter__
函数有什么好处?
在下面的代码中,我只是设置两个简单的类。第一类将一个列表作为参数,并且我可以在不使用__iter__
函数的情况下遍历该列表。代码的第二位使用__iter__
函数遍历列表。
在类中已经存在遍历内容的方法时,使用__iter__
有什么好处?
EG 1: no __iter__
class test_class:
def __init__(self, list):
self.container_list = list
def print (self):
a = self.container_list
return a
test_list = test_class([1,2,3,4,5,6,7])
x = test_class.print(test_list)
for i in x:
print (i)
EG 2: yes __iter__
class list_using_iter:
def __init__(self):
self.list = [1,2,3,4]
self.index = -1
def __iter__(self):
return self
def __next__(self):
self.index += 1
if self.index == len(self.list):
raise StopIteration
return self.list [self.index]
r = list_using_iter()
itr = iter(r)
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr))
print(next(itr)) # Raises the exception!
最佳答案
您的第一个示例是不可迭代的,但包含的属性是。您的第二个示例是可迭代的,但是您只需通过“跟随”另一个可迭代进行迭代。这是一个可迭代的示例,它本身会做更多的工作:
import itertools
class Fibs:
def __init__(self, a, b):
self.a = a
self.b = b
def __iter__(self):
a = self.a
b = self.b
while True:
yield a
a, b = b, a + b
real_fibs = Fibs(0,1)
for i in itertools.islice(real_fibs, 10):
print(i)
Fibs.__iter__
不仅仅是简单地反省从其他值的__iter__
方法获得的值。它正在计算并按需产生新的价值。实际上,前面是一个类的示例,该类知道如何创建自己的迭代器,而不是让每个对象都可迭代。这是一个定义
next
本身的版本。class Fibs:
def __init__(self, a, b):
self.a = a
self.b = b
def __iter__(self):
return self
def __next__(self):
rv = self.a
self.a, self.b = self.b, self.a + self.b
return rv