quali strumenti funzionali rimangono in Python 3k?
-
08-07-2019 - |
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à?
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]