所以我有一个列表,其中包含一些类的实例。
随着时间的推移,我希望在每一步都能调用该类的run
方法。
到目前为止,我有以下内容。但有没有更好或更多的Pythonic方法来实现for c in objs:
阻止?
谢谢!
#!/usr/bin/python
class the_class:
def __init__(self):
self.num=1
def run(self):
self.num+=1
def main():
objs=[]
objs.append(the_class())
objs.append(the_class())
objs.append(the_class())
for t in range(10):
for c in objs:
c.run()
print objs[0].num
main()
答案 0 :(得分:10)
不,你拥有的是完全合理的和Pythonic。
列表理解语法:
[c.run() for c in objs]
为您保存一行,但使用列表推导法进行副作用通常被视为不良风格。
答案 1 :(得分:6)
不,你所拥有的一切都很好。
在此使用列表推导或地图会使您的代码不那么清晰,难以阅读。我强烈建议强烈建议。
列表理解旨在创建列表。如果要进行循环,请使用循环。
即使您确实需要对此进行优化(并且使用列表补偿或地图也不太可能是有效的优化),然后在证明它是瓶颈时执行此操作。可读性是第一位的,只在您需要的地方进行优化。
答案 2 :(得分:1)
还有map
内置函数,它与列表理解基本相同:
map(lambda x:x.run(),objs)
但大多数人认为列表理解更加“pythonic”。此外,人们对副作用使用列表推导的任何保留也可能适用于map
。我提出它的唯一原因是因为multiprocessing
模块有一个Pool
类,它有一个map方法可以并行执行计算,并且与内置map
基本相同( http://docs.python.org/library/multiprocessing.html)。如果run方法需要一段时间才能完成,并且每个方法都独立于其他方法,那么它可能是值得的。
编辑
如评论中所述,您可以使用操作员模块更快地执行此操作(删除lambda
)。但是,关键在于(并且仍然是)您可以使用map
或multiprocessing.Pool.map
几乎可以互换,并在后者的许多应用程序中获得性能提升。
答案 3 :(得分:0)
对于python 3,你不能简单地使用map,因为你必须处理它是一个生成器。
def exhaust(gen):
for _ in gen: pass
# Using map
exhaust(map(lambda x: x.run(), c))
# Using generator comprehension (better)
exhaust(x.run() for x in c)
或者,您可以创建一个虚拟函数,并使用*
运算符:
def nop(*args): pass
nop(*(x.run() for x in c))
正如其他人所指出的那样,这些都不是很好看。坚持你所拥有的,以便人们可以阅读它。
编辑:改善排气功能,谢谢wim。