我不知道python中的__iter__,谁能给我一个很好的代码示例

zjm*_*126 6 python iterator

我的代码运行错误

class a(object):
    def __iter(self):
        return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 17

一个.拼写正确:不是

   def __iter(self):
Run Code Online (Sandbox Code Playgroud)

但:

   def __iter__(self):
Run Code Online (Sandbox Code Playgroud)

__之前之后iter.

湾 使身体正确:不是

return 33
Run Code Online (Sandbox Code Playgroud)

但:

yield 33
Run Code Online (Sandbox Code Playgroud)

或归还([33])

如果你return是一个值__iter__,则返回一个迭代器(一个可迭代的,如同return [33],几乎同样好但不完全......); 或者,yield1 +值,__iter__生成一个生成器函数(因此它本质上返回一个生成器迭代器).

C.称之为正确:不是

a().itervalues()
Run Code Online (Sandbox Code Playgroud)

但是,例如:

for x in a(): print x
Run Code Online (Sandbox Code Playgroud)

要么

print list(a())
Run Code Online (Sandbox Code Playgroud)

itervalues是一种dict的方法,与之无关__iter__.

如果你修复了所有三个(!)错误,代码效果会更好;-).


Vla*_*ala 5

关于代码的一些事情:

  1. __iter 应该 __iter__
  2. 你在__iter__函数中返回'33' .你应该实际上返回一个迭代器对象.迭代器是一个在next()调用函数时保持返回不同值的对象(可能是[0,1,2,3 etc]之类的值序列).

这是一个迭代器的工作示例:

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

c=a()

for x in c:
    print x
Run Code Online (Sandbox Code Playgroud)

类的任何对象a都是迭代器对象.调用__iter__函数应该返回迭代器,所以它返回自己 - 正如你所看到的,a类有一个next()函数,所以这是一个迭代器对象.

当调用下一个函数时,它会保持返回连续值,直到它达到零,然后它发送StopIteration异常,(适当地)停止迭代.

如果这看起来有点朦胧,我建议尝试使用代码,然后在这里查看文档:http://docs.python.org/library/stdtypes.html