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

2024-05-23 18:46:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码运行错误

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

请尽量用代码,不要用短信,因为我的英语不是很好,谢谢


Tags: 代码selfreturnobjectdef错误短信class
3条回答

a.正确拼写:

   def __iter(self):

但是:

   def __iter__(self):

__之前和iter之后。

b.使身体正确:

return 33

但是:

yield 33

或者 返回iter([33])

如果从__iter__返回值return,则返回一个迭代器(与return [33]中一样,iterable几乎与return [33]中的一样好,但不完全……);或者,yield1+值,使__iter__成为一个生成器函数(因此它本质上返回一个生成器迭代器)。

c.说对了:

a().itervalues()

但是,例如:

for x in a(): print x

或者

print list(a())

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

如果你把三个都修好了(!)错误,代码工作得更好;-)。

关于代码的一些事情:

  1. __iter应该是__iter__
  2. __iter__函数中返回“33”。实际上,您应该返回一个迭代器对象。迭代器是一个对象,当调用next()函数时,它会不断返回不同的值(可能是一系列值,如[0,1,2,3等])。

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

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

a的任何对象都是迭代器对象。调用__iter__函数应该返回迭代器,因此它返回本身–如您所见,a类有一个next()函数,因此这是一个迭代器对象。

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

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

下面是一个实现xrange内置的代码示例:

class my_xrange(object):
    def __init__(self, start, end, skip=1):
        self.curval = int(start)
        self.lastval = int(end)
        self.skip = int(skip)
        assert(int(skip) != 0)

    def __iter__(self):
        return self

    def next(self):
        if (self.skip > 0) and (self.curval >= self.lastval):
            raise StopIteration()
        elif (self.skip < 0) and (self.curval <= self.lastval):
            raise StopIteration()
        else:
            oldval = self.curval
            self.curval += self.skip
            return oldval

for i in my_xrange(0, 10):
    print i

相关问题 更多 >