2009-12-24 21 views
0

我不知道下一个代码中的“self._iterator = iter(self._container)”。我不知道为什么iter(而不是__iter__)函数在这个地方使用,这个代码中iter的意思是什么

在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:

返回一个迭代器对象。根据第二个参数的存在 ,第一个参数 的参数被解释为 。如果没有一个 第二个参数,邻必须是支持 迭代协议(该__iter__() 法) 集合对象,或者它必须支持的 序列协议(该__getitem__() 方法与整数参数从0开始 )。如果它不支持那些协议的 ,TypeError是 引发的。如果给出第二个参数 sentinel,那么o必须是一个可调用对象 。在这种情况下,迭代器创建的 将调用o,而对于每次调用其next() 方法的参数,将不会调用 参数;如果返回的值等于 至标记,则StopIteration将被提升为 ,否则返回值将为 。 iter()的第二种形式的一个有用应用是读取文件的 行,直到达到某一行 。下面的例子 读取文件,直到达到“停止”:

但我也不知道iter函数做了什么。

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 

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

回答

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 
0

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

假设hr是其中包含数据的HttpResponse的实例。当你打电话给iter(hr)时,你应该找回一个迭代器。此迭代器将从_container成员变量中返回数据。

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

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

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

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