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

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

有帮助吗?

解决方案

嗯,Python 3.0和3.1已经发布,所以你可以自己检查一下。最终的结果是地图和过滤器被保留为内置函数,并且还保留了lambda。唯一的变化是reduce被转移到functools模块;你只需要做

from functools import reduce

使用它。

在这方面,未来的3.x版本可望与3.0和3.1保持向后兼容。

其他提示

在Python 3.x中,Python继续拥有丰富的功能性工具集:list comprehensions,生成器表达式,迭代器和生成器,以及 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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top