gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:51:09 25 4
gpt4 key购买 nike

我是 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

但是,如果我将 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

那么推荐使用哪种方法呢?

谢谢。 :)

最佳答案

初始化应该在__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

本质上,我从您的 init 版本创建一个对象,并从您的 iter 版本创建一个对象。然后我尝试对它们进行两次部分迭代。请注意您如何获得不同的结果:

iter_iter
0
0
iter_init
0
1

关于Python 迭代器。在 __init__ 或 __iter__ 中初始化状态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com