你应该用
map
和
filter
而不是列表理解。
安
客观的
即使它们不是“蟒蛇”,你也应该喜欢它们的原因是:
它们需要函数/lambdas作为参数,而
引入新范围
.
我不止一次被这个咬过:
for x, y in somePoints:
# (several lines of code here)
squared = [x ** 2 for x in numbers]
# Oops, x was silently overwritten!
但如果我说:
for x, y in somePoints:
# (several lines of code here)
squared = map(lambda x: x ** 2, numbers)
那一切都会好起来的。
你可以说我在同一个范围内使用相同的变量名是愚蠢的。
我没有。代码本来很好——两个
x
S不在同一范围内。
只是在我之后
感动
内部代码块到出现问题的代码的不同部分(读:维护期间的问题,而不是开发期间的问题),我没想到会这样。
对,
如果你从不犯这个错误
然后列表理解更优雅。
但从个人经验(以及看到其他人犯同样的错误)来看,我已经看到它发生了足够多的次数,我认为当这些错误潜入到代码中时,不值得你付出痛苦。
结论:
使用
地图
和
滤波器
. 它们可以防止与范围相关的细微的难以诊断的错误。
边注:
别忘了考虑使用
imap
和
ifilter
中
itertools
)如果他们适合你的情况!