Questo funzione è necessario utilizzare ridurre () o c'è un modo più divinatorio?
-
27-09-2019 - |
Domanda
Se ho un valore, e un elenco di termini aggiuntivi che voglio moltiplicato per il valore:
n = 10
terms = [1,2,3,4]
E 'possibile utilizzare un elenco di comprensione di fare qualcosa di simile a questo:
n *= (term for term in terms) #not working...
In alternativa è l'unico modo:
n *= reduce(lambda x,y: x*y, terms)
Questo è il Python 2.6.2. Grazie!
Soluzione
Ridurre non è l'unico modo. Si può anche scrivere come un semplice ciclo:
for term in terms:
n *= term
Credo che questo sia molto più chiaro rispetto all'utilizzo reduce
, soprattutto se si considera che molti programmatori Python non hanno mai visto reduce
e il nome fa ben poco per trasmettere a persone che lo vedono per la prima volta quello che realmente fa.
Pythonic non significa tutto scrittura come comprensioni o usare sempre uno stile funzionale, se possibile, . Python è un linguaggio multi-paradigma e la scrittura semplice codice imperativo al momento opportuno è Pythonic.
Guido van Rossum, inoltre, non vuole reduce
in Python:
Ora ridurre (). Questo è in realtà quello che ho sempre odiato la maggior parte, perché, a parte un paio di esempi che coinvolgono + o *, quasi ogni volta che vedo una chiamata di ridurre () con un argomento di funzione non banale, ho bisogno di penna afferrare e carta schema ciò che è effettivamente immessa in tale funzione prima comprendo ciò che il ridurre () dovrebbe fare. Così nella mia mente, l'applicabilità di ridurre () è praticamente limitato a operatori associativi, e in tutti gli altri casi è meglio scrivere il ciclo di accumulazione in modo esplicito.
Non ci sono un sacco di operatori associativi. (Questi sono gli operatori X per il quale (A x B) X c è uguale a una X (b X c).) Penso che sia praticamente limitata a +, *, e, |, ^, e collegamento e / o. Abbiamo già sum (); Sarei felice di commercio riduco () per il prodotto (), in modo tale che si prende cura dei due maggior parte degli usi comuni. [...]
In Python 3 riduca è stato spostato al modulo functools
.
Altri suggerimenti
reduce
è il modo migliore per fare questo IMO, ma non c'è bisogno di utilizzare un lambda; invece, è possibile utilizzare l'operatore *
direttamente:
import operator
n *= reduce(operator.mul, terms)
n
è ora 240. Vedere la documentazione per il operatore modulo per maggiori informazioni.
Un altro modo:
import operator
n = reduce(operator.mul, terms, n)