scr*_*Dog 9 python iterator loops python-2.6
我正在尝试创建一个继承自python列表的类.我希望列表的每个循环初始化/最终确定列表的元素.我认为这可以通过覆盖__iter__python列表的方法来完成,但我似乎无法让它工作.该__iter__方法似乎只调用一次?(见下文)
class MyList(list):
def __iter__(self):
print 'do something'
return list.__iter__(self)
my_list = MyList(range(10))
print my_list
for item in my_list:
print item
Run Code Online (Sandbox Code Playgroud)
产量
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
do something
0
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
知道如何实现我想做的事吗?
Joh*_*ooy 11
您只需从中返回生成器表达式即可 __iter__()
class MyList(list):
def __iter__(self):
return (self.do_something(x) for x in 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
或者你可以在这里使用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
Run Code Online (Sandbox Code Playgroud)