在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

09-10 02:46