2012-10-05 15 views
7

Questo è il mio codice:Perché lambda richiede 2 argomenti nonostante vengano assegnati 2 argomenti?

filter(lambda n,r: not n%r,range(10,20))

ottengo l'errore:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

Allora ho provato:

foo=lambda n,r:not n%r

che funzionava bene. Così ho pensato che questo funzionerà:

bar=filter(foo,range(10,20))

ma ancora una volta:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

Qualcosa di simile accade per la mappa pure. Ma ridurre funziona bene. Che cosa sto facendo di sbagliato? Mi manca qualcosa di cruciale per utilizzare filtri o mappe?

+1

'filter()' passa un singolo argomento al tuo lambda, quando si aspetta due. L'utilizzo di una variabile non ti consentirà di aggirarlo. – NullUserException

risposta

5

Perché si utilizzano 2 argomenti? filter() e map() richiedono una funzione con un solo argomento, ad esempio:

filter(lambda x: x >= 2, [1, 2, 3]) 
>>> [2, 3] 

di trovare i fattori di un numero (si può sostituire con lambda pure):

def factors(x): 
    return [n for n in range(1, x + 1) if x % n == 0] 

factors(20) 
>>> [1, 2, 4, 5, 10, 20] 
+0

Ok questo ha senso. Allora, come faccio a scrivere questo codice, che deve restituire i fattori per un numero. Voglio usare il filtro o la mappa per comprenderlo meglio ... o almeno lambda – ritratt

+1

Si prega di consultare la risposta aggiornata. –

+1

Ovviamente è possibile ottimizzare questo per cercare solo in sqrt (x) e aggiungere x/n e n ai risultati ogni volta che 'x% n == 0'. Farà la differenza quando i numeri diventeranno più grandi. – NullUserException

4

Perché filter in python richiede solo un argomento. Quindi è necessario definire una funzione/lambda che richiede un solo argomento se si desidera utilizzarlo nel filtro.

0

La vostra funzione lambda prende due argomenti n e r. filter deve essere chiamato con una funzione che accetta un argomento e restituisce True quando l'elemento deve essere conservato. Forse intendevi definire r o n fuori dalla tua funzione lambda e poi catturarlo nella chiusura.

2

Se si esegue mappa o filtrare su un insieme di valori-chiave, poi aggiungere parentesi attorno (k, v), come:

.filter(lambda (k,v): k*2 + v) 
Problemi correlati