Pregunta

He leído varias entradas relacionadas con la eliminación de varias funciones funcionales de Python futuro, incluyendo map y reduce.

¿Cuál es la política oficial con respecto a las extensiones funcionales?
¿se va a quedar la función lambda?

¿Fue útil?

Solución

Bueno, Python 3.0 y 3.1 ya están disponibles, por lo que puede comprobarlo usted mismo. El resultado final fue que el mapa y el filtro se mantuvieron como incorporados, y también se guardó lambda. El único cambio fue que reducir se movió al módulo functools; solo necesitas hacer

from functools import reduce

para usarlo.

Se puede esperar que las futuras versiones 3.x sigan siendo compatibles con versiones anteriores con 3.0 y 3.1 a este respecto.

Otros consejos

En Python 3.x, Python sigue teniendo un rico conjunto de herramientas funcionales: ish, comprensiones, expresiones de generador, iteradores y generadores, y funciones como any () y all () que tienen evaluación de cortocircuito siempre que sea posible.

Python " Dictador benévolo para la vida " planteó la idea de eliminar map () porque puede reproducir trivialmente sus efectos con una comprensión de lista:

lst2 = map(foo, lst)

lst3 = [foo(x) for x in lst]

lst2 == lst3  # evaluates True

La función lambda de Python no se ha eliminado o renombrado, y probablemente nunca lo será. Sin embargo, probablemente nunca se volverá más poderoso tampoco. lambda de Python está restringido a una sola expresión; no puede incluir declaraciones y no puede incluir varias líneas de código Python.

Python, el simple y antiguo estándar def define un objeto de función, que se puede pasar tan fácilmente como un objeto lambda . Incluso puede desvincular el nombre de la función después de definirla, si realmente desea hacerlo.

Ejemplo:

# 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

Tenga en cuenta que en realidad podría usar el "operador ternario" en un lambda por lo que el ejemplo anterior es un poco artificial.

lst2 = map(lambda x: x**2 if foo(x) else x, lst)

Pero algunas funciones multilínea son difíciles de forzar en una lambda y se manejan mejor como simples funciones multilínea ordinarias.

Python 3.x no ha perdido nada de su poder funcional. Existe una sensación general de que las comprensiones de listas y las expresiones generadoras probablemente sean preferibles a map () ; en particular, las expresiones generadoras a veces se pueden usar para hacer el equivalente de un map () pero sin asignar una lista y luego liberarla nuevamente. Por ejemplo:

total = sum(map(lst, foo))

total2 = sum(foo(x) for x in lst)

assert total == total2  # same result

En Python 2.x, el map () asigna una nueva lista, que se suma y se libera inmediatamente. La expresión del generador obtiene los valores de uno en uno y nunca ata la memoria de una lista completa de valores.

En Python 3.x, map () es "perezoso" entonces ambos son casi igualmente eficientes. Pero como resultado, en Python 3.x, el ejemplo lambda ternario debe ser forzado a expandirse en una lista:

lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))

¡Es más fácil escribir la lista de comprensión!

lst2 = [x**2 if foo(x) else x for x in lst]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top