python设计自定义迭代器

时间:2015-07-12 11:50:11

标签: python iterator

我在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)方法解决了这个问题?     class Iterator():

    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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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