2

これがばかげた質問である場合は申し訳ありませんが、どのように機能するかを決めることができませんでした.

そのような構造を持つイテレータを定義しました (もう少し複雑ですが、モデルが仕事をします):

class MyIterator ():

    def __init__(self):
        print ('nothing happening here')

    def __iter__ (self):
        self.a_list=[x for x in range (10)]
        for y in a_list:
            print(y)


    def __next__ (self):
        self.a_list = [x+1 for x in self.a_list]
        for y in a_list:
            print (y)

しかし、どうすればそれをループできますか? メソッドを常に手動で呼び出す必要がありますか? それとも単に間違ったツールを使用しているのでしょうか?

4

1 に答える 1

7

問題の1つは、2つの概念を混合していることです 。iterableは、イテレータ__iter__()を返すメソッドを定義しますが、メソッドは定義しません。イテレータは、メソッドと、を返す簡単な実装を定義 します。このようなもの:__next__()__next__()__iter__()self

class Iterable(object):
    def __iter__(self):
        return Iterator()

class Iterator(object):
    def __init__(self):
        self.i = 0
    def __iter__(self):
        return self
    def __next__(self):
        result = self.i
        self.i += 1
        return result

__iter__()別の方法は、iterableのメソッドをジェネレーター関数として定義することです。

class Iterable(object):
    def __iter__(self):
        i = 0
        while True:
            yield i
            i += 1
于 2012-06-22T13:41:37.290 に答える