《Learning Python》中生成器表达式与map的对比及用法选型疑问
Python 生成器表达式与map用法疑问解答
问题1:实际开发中生成器表达式和map的选择规则
两种写法的选择核心看操作是否需要自定义逻辑,分两种场景判断:
- 当你要对元素执行的操作是现成的内置函数/已经定义好的函数时,比如示例里的
abs调用:
这种场景优先选list(map(abs, (-1,-2,3,4))) list(abs(x) for x in (-1,-2,3,4))map写法,一方面代码更简洁,不需要重复写函数名加参数的结构;另一方面map是Python底层C实现的内置工具,比Python层面迭代的生成器表达式运行开销更低,性能更好。 - 当你需要自定义操作、必须写
lambda才能适配map的入参要求时,比如示例里的元素乘2逻辑:
这种场景优先选生成器表达式,不需要写冗余的list(map(lambda x: x*2, (1,2,3,4))) list(x*2 for x in (1,2,3,4))lambda x:前缀,可读性更高,同时还能避免lambda函数调用的额外开销,性能和map相当甚至更优。
问题2:语句含义解释
书中说的「当要执行的操作不是函数调用时,generator expressions的代码会更易读」,指的是:如果你的逻辑不是直接调用一个已经存在的函数,而是要做表达式计算、条件过滤、多元素组合这类非函数调用的操作时,生成器表达式的写法更直白,不需要嵌套多层map+filter+lambda的结构。
举个简单的例子:如果你要对列表里的偶数做乘3的处理,生成器表达式的写法是:
(x*3 for x in num_list if x % 2 == 0)
如果用map实现同样的逻辑,你需要嵌套filter和两层lambda:
map(lambda x: x*3, filter(lambda x: x%2 ==0, num_list))
对比很明显,非函数调用的场景下,生成器表达式没有多余的嵌套和lambda声明,可读性高很多。反过来如果你的操作就是单纯调用现成函数(比如str.strip、int转型这类),直接把函数名传给map的写法会更简洁。
内容的提问来源于stack exchange,提问作者Anurag Gupta
相关产品推荐
相关产品推荐

