Domanda

Ho letto diverse voci riguardanti l'eliminazione di diverse funzioni funzionali da Python futuro, tra cui mappa e riduzione.

Qual è la politica ufficiale relativa alle estensioni funzionali?
la funzione lambda rimarrà?

È stato utile?

Soluzione

Bene, Python 3.0 e 3.1 sono già stati rilasciati, quindi puoi verificarlo tu stesso. Il risultato finale è stato che la mappa e il filtro sono stati mantenuti come incorporati e anche lambda. L'unica modifica è stata che il riduttore è stato spostato nel modulo functools; devi solo fare

from functools import reduce

per usarlo.

Si prevede che le future versioni 3.x rimarranno compatibili con le versioni precedenti 3.0 e 3.1 al riguardo.

Altri suggerimenti

In Python 3.x, Python continua ad avere un ricco set di strumenti funzionali integrati: elenchi di comprensione, espressioni di generatori, iteratori e generatori e funzioni come any () e all () che hanno una valutazione di cortocircuito ove possibile.

Python's " Benevolent Dictator For Life " ha abbandonato l'idea di rimuovere map () perché puoi riprodurre banalmente i suoi effetti con una comprensione dell'elenco:

lst2 = map(foo, lst)

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

lst2 == lst3  # evaluates True

La funzione lambda di Python non è stata rimossa o rinominata, e probabilmente non lo sarà mai. Tuttavia, probabilmente non diventerà mai più potente. Il lambda di Python è limitato a una singola espressione; non può includere istruzioni e non può includere più righe di codice Python.

Il def standard di Python definisce un oggetto funzione, che può essere passato con la stessa facilità di un oggetto lambda . Puoi anche separare il nome della funzione dopo averla definita, se vuoi davvero farlo.

Esempio:

# 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

Tieni presente che puoi effettivamente utilizzare l'operatore "ternario" in un lambda , quindi l'esempio sopra è un po 'inventato.

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

Ma alcune funzioni multilinea sono difficili da forzare in un lambda e sono gestite meglio come semplici funzioni multilinea ordinarie.

Python 3.x non ha perso nulla del suo potere funzionale. Vi è una certa sensazione generale che la comprensione dell'elenco e le espressioni del generatore siano probabilmente preferibili a map () ; in particolare, a volte le espressioni del generatore possono essere usate per fare l'equivalente di una map () ma senza allocare un elenco e poi liberarlo di nuovo. Ad esempio:

total = sum(map(lst, foo))

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

assert total == total2  # same result

In Python 2.x, la map () alloca un nuovo elenco, che viene sommato e immediatamente liberato. L'espressione del generatore ottiene i valori uno alla volta e non lega mai la memoria di un intero elenco di valori.

In Python 3.x, map () è " pigro " quindi entrambi sono ugualmente efficienti. Ma di conseguenza, in Python 3.x l'esempio lambda ternario deve essere costretto ad espandersi in un elenco:

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

Più facile scrivere semplicemente la comprensione dell'elenco!

lst2 = [x**2 if foo(x) else x for x in lst]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top