Python Zen - (only) one way to do it
这个问题听起来可能很主观,但正如"禅宗"所说,有(几乎总是)一种方法可以被偏爱,它不应该是主观的。
更好的方法是什么?
1 2 3
| [i.something() for i in l]
map(operator.methodcaller('something'), l)
map(lambda x: x.something(), l) |
(1)非常清楚,但在许多答案中,使用了map()。如果我们这样做,那么(2)和(3)之间的可读性几乎相等(至少在IMO)。
其他许多任务也同样重要,但我选择了这一个,因为它可以代表所有相似的任务。
- 假设.something()不以任何方式修改i是否安全?
- 总是列出理解。
两者都是对[i.something() for i in l]的明确论据。
这假设.something()不会改变i,并且您在python 2上。
- 那么,如果这个函数发生了变化,应该优先选择哪一个呢?
- @福蒂耶:以上都不是。在这种情况下,一个显式的for循环最好:for item in l: item.something()。使用清单理解或map用于副作用是丑陋的。
- 如果您想要一个返回值的列表,那么列表理解比显式for循环更好。推论:方法应该要么改变一个实例,要么返回一些有用的东西,在一个方法中同时使用这两种方法就不那么好了。
- @雷姆科格利希:对,这就是为什么我要做这个假设。但你永远不知道…