【问题标题】:i don't know why iter(not __iter__) function use in this place,what is the mean of iter in this code我不知道为什么在这个地方使用 iter(not __iter__) 函数,这段代码中 iter 的含义是什么
【发布时间】:2009-12-24 08:12:14
【问题描述】:

我不知道下一个代码中的“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 必须是 支持的集合对象 迭代协议(__iter__() 方法),或者它必须支持 序列协议(__getitem__() 以整数参数开头的方法 在 0)。如果不支持 在这些协议中,TypeError 是 提高。如果是第二个参数, 哨兵,给定,那么 o 必须是 可调用对象。创建的迭代器 在这种情况下将调用 o 没有 每次调用其next() 的参数 方法;如果返回的值相等 到哨兵,StopIteration 将是 提高,否则价值将是 回来。一个有用的应用 iter() 的第二种形式是阅读 文件的行直到某一行 到达了。下面的例子 读取文件直到达到“STOP”:

但我也不知道 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

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

【问题讨论】:

    标签: python iterator


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      假设hrHttpResponse 的一个实例,其中包含数据。当您调用 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 代码从来没有做过这样的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-22
        • 2020-08-23
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 2021-01-05
        相关资源
        最近更新 更多