23

django.templateに次のコードがあります。

class Template(object):
    def __init__(self, template_string, origin=None, name='<Unknown Template>'):
        try:
            template_string = smart_unicode(template_string)
        except UnicodeDecodeError:
            raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
        if settings.TEMPLATE_DEBUG and origin is None:
            origin = StringOrigin(template_string)
        self.nodelist = compile_string(template_string, origin)
        self.name = name

    def __iter__(self):
        for node in self.nodelist:
            for subnode in node:
                yield subnode

    def render(self, context):
        "Display stage -- can be called many times"
        return self.nodelist.render(context)

私が混乱している部分は以下のとおりです。この__iter__方法はどのように機能しますか?対応する方法が見つかりませんnext

def __iter__(self):
        for node in self.nodelist:
            for subnode in node:
                yield subnode

これは私が実装する方法を知っている唯一の方法です__iter__

class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
            self.x-=1
            return self.x
        else:
            raise StopIteration
 ainst = a()
 for item in aisnt:
     print item

私の英語はあまり上手ではないので、あなたの答えでは、テキストではなくコード例を使用するようにしてください。

4

2 に答える 2

40

ドキュメントから:

コンテナオブジェクトのメソッドがジェネレータとして実装されている場合、メソッドとメソッド__iter__() を提供するイテレータオブジェクト(技術的にはジェネレータオブジェクト)が自動的に返されます 。__iter__()__next__()

ジェネレーターを使用して提供された例を次に示します。

class A():
    def __init__(self, x=10):
        self.x = x
    def __iter__(self):
        for i in reversed(range(self.x)):
            yield i

a = A()
for item in a:
    print(item)
于 2009-12-25T02:47:23.890 に答える
16

この__iter__メソッドは、キーワードを使用するため、Pythonジェネレーターを返します(ドキュメントを参照)。yieldジェネレータはnext()メソッドを自動的に提供します。ドキュメントの引用:

ジェネレーターを非常にコンパクトにするのは、__ iter __()メソッドとnext()メソッドが自動的に作成されることです。

編集:

ジェネレーターは本当に便利です。それらに精通していない場合は、それらを読んで、いくつかのテストコードを試してみることをお勧めします。

StackOverflowのイテレーターとジェネレーターに関する詳細情報は次のとおりです。

于 2009-12-25T02:44:12.740 に答える