在每个循环上调用python列表方法?

在每个循环上调用python列表方法?,python,iterator,loops,python-2.6,Python,Iterator,Loops,Python 2.6,我试图创建一个从python列表继承的类。我希望列表的元素在列表的每个循环中都被初始化/最终确定。我认为这可以通过重写python列表的\uuuu iter\uuu方法来实现,但我似乎无法让它工作。\uuu iter\uu方法似乎只调用一次?(见下文) 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] do something 0 1 2 3 4 5 6 7 8 9 知道如何实现我想做的事情吗?\uuuuuu iter\uuuuu返回一个。如果您需要在每次迭代中执行某些操作,

我试图创建一个从python列表继承的类。我希望列表的元素在列表的每个循环中都被初始化/最终确定。我认为这可以通过重写python列表的
\uuuu iter\uuu
方法来实现,但我似乎无法让它工作。
\uuu iter\uu
方法似乎只调用一次?(见下文)

输出

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
do something
0
1
2
3
4
5
6
7
8
9

知道如何实现我想做的事情吗?

\uuuuuu iter\uuuuu
返回一个。如果您需要在每次迭代中执行某些操作,那么您必须实现自己的(它必须实现链接文档中描述的两个方法)。

python类
\uu iter\uu()
方法实际上返回一个迭代器对象。 请参阅以下内容以供参考:


在迭代器对象上,循环的每个步骤都将调用
next()
方法。您可以编写一个自定义迭代器,该迭代器将由自定义列表返回。

我不清楚您到底想做什么,但您已经被告知的是事实
next()
是每次迭代中调用的方法

class MyList(list):
    def next(self):
        print "Do something"
        return list.next(self)
(我没有测试)

我希望列表的元素在列表的每个循环中都被初始化/最终确定

列表对此没有直接控制权。多个循环可以并行访问列表(例如嵌套循环)。每个循环都由一个迭代器控制,
\uuuuuuuuuuuuuuuuuiter()
应该在每次调用它时返回迭代器。您不能始终返回相同的迭代器实例,因为所述并行循环将相互干扰


但在迭代器中,您可以根据需要自由实例化项。从迭代器内部完成它们绝非明智之举,因为一旦返回一个项,您就失去了对它的控制。如果您稍后完成它,仍然依赖于该项的外部代码可能会失败。如果您需要完成项目,请将其作为项目消费者的责任。

您只需从
\uuu iter\uuu()返回生成器表达式即可。

ncoghlan建议使用生成器来代替生成器表达式,这样更容易调试

class MyList(list):

    def __iter__(self):
        for x in list.__iter__(self):
            yield self.do_something(x)

    def do_something(self, x):
        print 'do something', x
        return x

my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
或者,您可以在此处使用imap

from itertools import imap

class MyList(list):
    def __iter__(self):
        return imap(self.do_something, list.__iter__(self))

    def do_something(self, x):
        print 'do something', x
        return x


my_list = MyList(range(10))
print my_list

for item in my_list:
    print item

我本来打算对此投赞成票,但为什么要返回一个生成器表达式而不是只实现一个生成器?@ncoghlan,为什么要在GE可以满足的地方实现一个生成器?当生成器函数出错时(因为它知道自己的名称),您可以获得更好的调试信息。如果您特别需要一个表达式,则GE很有用,但如果您仍要定义一个命名函数,那么最好实际将其作为生成器函数:
def\uu iter\uuuuuu(self):用于列表中的x。\uuu iter\uuuuuuu(self):产生self.do\u something(x)
(哦,用于注释中的垂直空格…@ncoghlan,好吧,我已经把它添加到我的答案中了,这样你就不必为注释中的空白而失眠了(Hanks:)它也可能是在添加GEs之前就已经了解Python的一个假象。在很长一段时间里,如果没有具有正确行为的现有迭代器,编写生成器函数只是编写
\uu iter\uuu
方法的一种方式。请更具体一点,好吗?在列表对象上永远不会调用next。您必须定义一个iter方法,该方法返回一个迭代器对象。将对返回的迭代器对象调用下一个方法。
class MyList(list):

    def __iter__(self):
        for x in list.__iter__(self):
            yield self.do_something(x)

    def do_something(self, x):
        print 'do something', x
        return x

my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
from itertools import imap

class MyList(list):
    def __iter__(self):
        return imap(self.do_something, list.__iter__(self))

    def do_something(self, x):
        print 'do something', x
        return x


my_list = MyList(range(10))
print my_list

for item in my_list:
    print item