我已经阅读了几个关于从未来的python中删除几个功能函数的条目,包括map和reduce。
有关功能扩展的官方政策是什么?
lambda函数会留下来吗?
答案 0 :(得分:10)
嗯,Python 3.0和3.1已经发布,所以你可以自己检查一下。最终的结果是地图和过滤器被保留为内置函数,并且还保留了lambda。唯一的变化是reduce被转移到functools模块;你只需要做
from functools import reduce
使用它。
在这方面,未来的3.x版本可望与3.0和3.1保持向后兼容。
答案 1 :(得分:3)
在Python 3.x中,Python继续拥有丰富的功能性工具集:列表推导,生成器表达式,迭代器和生成器,以及any()
和all()
之类的函数尽可能短路评估。
Python的“仁慈的生活独裁者”提出了删除map()
的想法,因为你可以通过列表理解轻松地重现其效果:
lst2 = map(foo, lst)
lst3 = [foo(x) for x in lst]
lst2 == lst3 # evaluates True
Python的lambda
功能尚未删除或重命名,可能永远不会。但是,它也可能永远不会变得更强大。 Python的lambda
仅限于一个表达式;它不能包含语句,也不能包含多行Python代码。
Python的普通标准def
定义了一个函数对象,它可以像lambda
对象一样轻松传递。如果你真的想这样做,你甚至可以在定义后取消绑定函数的名称。
示例:
# NOT LEGAL PYTHON
lst2 = map(lambda x: if foo(x): x**2; else: x, lst)
# perfectly legal Python
def lambda_function(x):
if foo(x):
return x**2
else:
return x
lst2 = map(lambda_function, lst)
del(lambda_function) # can unbind the name if you wish
请注意,您实际上可以在lambda
中使用“三元运算符”,因此上面的示例有点人为。
lst2 = map(lambda x: x**2 if foo(x) else x, lst)
但是有些多线函数很难强加到lambda
,并且作为简单的普通多线函数处理得更好。
Python 3.x已经失去了它的功能。有一种普遍的感觉,列表推导和生成器表达式可能比map()
更可取;特别是,生成器表达式有时可用于执行等效的map()
但不分配列表然后再次释放它。例如:
total = sum(map(lst, foo))
total2 = sum(foo(x) for x in lst)
assert total == total2 # same result
在Python 2.x中,map()
分配一个新列表,该列表被求和并立即释放。生成器表达式一次获取一个值,并且永远不会占用整个值列表的内存。
在Python 3.x中,map()
是“懒惰的”,因此两者的效率基本相同。但结果是,在Python 3.x中,需要强制三元lambda示例扩展为列表:
lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))
更容易编写列表理解!
lst2 = [x**2 if foo(x) else x for x in lst]