我不知道为什么iter(不是__iter__)函数在这个地方使用,这个代码中iter的意思是什么

时间:2009-12-24 08:12:15

标签: python iterator

我不知道下一段代码中的“self._iterator = iter(self._container)”。

在django.http:

class HttpResponse(object):
    def __iter__(self):
        self._iterator = iter(self._container)
        return self

    def next(self):
        chunk = self._iterator.next()
        if isinstance(chunk, unicode):
            chunk = chunk.encode(self._charset)
        return str(chunk)

我读了api:

  

返回一个迭代器对象。首先   论证被解释得非常   取决于存在的不同   第二个论点。没有   第二个论点,o必须是a   支持的集合对象   迭代协议(__iter__()   方法),或者它必须支持   序列协议(__getitem__()   整数参数开始的方法   在0)。如果它也不支持   那些协议,TypeError是   提高。如果是第二个参数,   哨兵,给予,然后o必须是   可调用的对象。迭代器已创建   在这种情况下,将调用o而不是   每次调用next()的参数   方法;如果返回的值相等   哨兵,StopIteration将   提出,否则价值将是   回。一个有用的应用程序   iter()的第二种形式是阅读   直到某一行的文件行   到达了。以下示例   读取文件直到达到“STOP”:

但我也不知道它的功能是什么。

i know the __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

请尝试使用代码,而不是文字,因为我的英语不是很好,谢谢

2 个答案:

答案 0 :(得分:1)

迭代器可以迭代:

for item in mylist:
    print item

for key,item in enumerate(mylist):
    print key,":",item

for i in range(0,50):
    print i

要使用for item in XX必须可迭代

您可以通过添加next(self)等来使您的类可迭代,就像您的示例一样。所以用

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

答案 1 :(得分:0)

HttpResponse是一个可以存储字符串数据的类。数据存储在名为_container的成员变量中。

假设hrHttpResponse的实例,其中包含数据。当你调用iter(hr)时,你应该回到迭代器。此迭代器将从_container成员变量返回数据。

此类“包装”_container成员,以便它始终返回非Unicode文本。因为此类具有__iter__()方法函数,所以当您调用iter()时,您实际上正在调用特殊的__iter__()方法函数。此方法函数实际上会在iter()成员变量上调用_container来获取其内容的迭代器。但是它会将此迭代器保存在_iterator成员变量中,并返回self。现在可以迭代了。

定义了next()方法函数。如果_container变量的类型是Unicode,则调用encode()以某种编码对Unicode进行编码并返回非Unicode。它使用另一个成员变量_charset来知道要用于编码的字符集。如果container变量的类型不是Unicode,则它必须是普通的字符串类型,并且数据只是保持不变。

通过这种方式,可以迭代此类中的“包装”对象,并始终返回非Unicode文本。

我对迭代器协议的这种实现感到惊讶。当它向你返回一个迭代器时,它只是返回self,所以如果你两次调用iter(),你实际上并没有得到两个可用的迭代器。这似乎很危险。我猜Django代码从来没有做过这样的事情。