2015-07-12 97 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