Pythonic方法调用类函数如果我有一个实例列表

时间:2012-04-17 20:27:04

标签: class python

所以我有一个列表,其中包含一些类的实例。

随着时间的推移,我希望在每一步都能调用该类的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()

4 个答案:

答案 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)。但是,关键在于(并且仍然是)您可以使用mapmultiprocessing.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。