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!

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top