python中iter()函数和__iter__方法研究_关于python:我不知道为什么在这里使用iter(而不是__iter__)函数,这段代码中iter的含义是什么...

我不知道下一个代码中的" 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:

Return an iterator object. The first

argument is interpreted very

differently depending on the presence

of the second argument. Without a

second argument, o must be a

collection object which supports the

iteration protocol (the __iter__()

method), or it must support the

sequence protocol (the __getitem__()

method with integer arguments starting

at 0). If it does not support either

of those protocols, TypeError is

raised. If the second argument,

sentinel, is given, then o must be a

callable object. The iterator created

in this case will call o with no

arguments for each call to its next()

method; if the value returned is equal

to sentinel, StopIteration will be

raised, otherwise the value will be

returned. One useful application of

the second form of iter() is to read

lines of a file until a certain line

is reached. The following example

reads a file until"STOP" is reached:

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

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

可以迭代一个迭代器:

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 X,X必须是可迭代的。

您可以通过添加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

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代码从没有做过这样的事情。

你可能感兴趣的:(python中iter()函数和__iter__方法研究_关于python:我不知道为什么在这里使用iter(而不是__iter__)函数,这段代码中iter的含义是什么...)