我是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)
那么推荐哪种方法呢?
谢谢.:)
初始化应该在__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)
| 归档时间: |
|
| 查看次数: |
2703 次 |
| 最近记录: |