Python 3k中还有哪些功能工具?

时间:2009-11-30 03:55:59

标签: python functional-programming python-3.x

我已经阅读了几个关于从未来的python中删除几个功能函数的条目,包括map和reduce。

有关功能扩展的官方政策是什么?
lambda函数会留下来吗?

2 个答案:

答案 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]