2015-07-12 102 views
0

我在python设计定制迭代器:蟒蛇设计定制迭代器

class Iterator(): 

    def __init__(self): 

     return 

    def fit(self, n): 
     self.n = n 
     return self 

    def __iter__(self): 
     for i in range(self.n): 
      yield i 

     return 




it = Iterator().fit(10) 

for i in it: 
    print(i) 

it.fit(20) 
for i in it: 
    print(i) 

它工作正常,但我想知道是否有可能在此之前,前一个结束导致新fit被称为这个班的奇怪行为。

如果是的话我应该如何设计它才能使它更健壮? 从fit方法中传递一些参数很重要。

编辑:我将介绍一个例子,它类似于我原来的问题

iterator类被设计成由User类使用。当调用evaluate方法时,打印所有数字直到n/k都很重要。没有任何例外。

也许使用iterator.fit(n)方法解决了这个问题? 类迭代器():

def __init__(self, k): 
     self.k = k 
     return 

    def fit(self, n): 

     for i in range(int(n/self.k)): 
      yield i 
     return 



class User(): 

    def __init__(self, iterator): 

     self.iterator = iterator 
     return 

    def evaluate(self, n): 

     for i in self.iterator.fit(n): 
      print(i) 

     return 



it = Iterator(2) 
u = User(it) 

u.evaluate(10) # I want to be sure that all the numbers until 9 are printed 
u.evaluate(20) # I want to be sure that all the numbers until 20 are printed 
+0

你看起来像是在试图编写协同例程。看[这个问题](http://stackoverflow.com/questions/19302530/python-generator-send-function-purpose)。 –

回答

1

因为每次调用range创建一个新的迭代器,不会有冲突,如果你多次调用fit

你的班级有点奇怪。您可以删除__init__,因为它什么也不做,或者将fit方法放在那里。

it = Iterator() 
it1 = iter(it.fit(10)) 
it2= iter(it.fit(5)) 
print it1.next() 
print it1.next() 
print it2.next() 
print it1.next() 
>>0 
    1 
    0 
    2 
+0

但是是否有可能仅在第一个'fit'调用之后的前5个值进行迭代,然后再次调用'fit'? – Donbeo

+0

是的。事实上,使用'iter'函数很容易测试。我添加了一个例子。 – Gecko

+0

我想避免这种情况。我想确定如果迭代开始,它会在调用一个新的'fit'之前完成。有没有办法做到这一点? – Donbeo

0

您还没有实际写入的iterator - 你写一个普通的类可以返回一个iterator。您要返回的iteratorgenerator

这是什么意思是在迭代过程中调用fit()将不起作用 - 至少,直到你再次遍历你的对象。例如:

>>> it = Iterator() 
>>> for x in it.fit(7): 
... it.fit(3) 
... print(x) 
... 
0 
1 
2 
3 
4 
5 
6 
>>> for x in it: 
... print(x) 
... 
0 
1 
2