Python迭代器.在__init__或__iter__中初始化状态变量?

Stu*_*art 5 python iterator

我是Python的新手,只是看一些定义迭代器对象的例子.

我看的例子是:

class fibit:  # iterate through fibonacci sequence from 0,1...n<=max
    def __init__(self, max):       
        self.max = max

   def __iter__(self):
        self.a = 0
        self.b = 1
        return self

   def next(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
Run Code Online (Sandbox Code Playgroud)

但是,如果我将self.a和self.b的初始化从iter移动init,似乎(我的简单理解)以完全相同的方式工作.

class fibit:  # iterate through fibonacci sequence from 0,1...n<=max
    def __init__(self, max):
        self.a = 0
        self.b = 1        
        self.max = max

   def __iter__(self):
        return self

   def next(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
Run Code Online (Sandbox Code Playgroud)

那么推荐哪种方法呢?

谢谢.:)

Amb*_*ber 7

初始化应该在__init__.这就是为什么它在那里.

Python中的迭代器对象是规范地"使用一次" - 一旦你迭代了迭代器,就不会期望你能够再次迭代它.

因此,如果您尝试再次迭代对象,则重新初始化值是没有意义的.为了说明这一点,我已经扩展了你的代码:

class fibit_iter:  # iterate through fibonacci sequence from 0,1...n<=max
    def __init__(self, max):
        self.max = max

    def __iter__(self):
        self.a = 0
        self.b = 1
        return self

    def next(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

class fibit_init:  # iterate through fibonacci sequence from 0,1...n<=max
    def __init__(self, max):
        self.a = 0
        self.b = 1
        self.max = max

    def __iter__(self):
        return self

    def next(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

iter_iter = fibit_iter(10)
iter_init = fibit_init(10)

print "iter_iter"

for item in iter_iter:
    print item
    break

for item in iter_iter:
    print item
    break

print "iter_init"

for item in iter_init:
    print item
    break

for item in iter_init:
    print item
    break
Run Code Online (Sandbox Code Playgroud)

基本上,我从init版本创建一个对象,从iter版本创建一个对象.然后我尝试两次迭代两次.注意你是如何得到不同的结果:

iter_iter
0
0
iter_init
0
1
Run Code Online (Sandbox Code Playgroud)