2012-10-05 26 views
7

Este es mi código:¿Por qué lambda pregunta por 2 argumentos a pesar de que se le han dado 2 argumentos?

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

me sale el error:

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

Entonces me trataron:

foo=lambda n,r:not n%r

que funcionaba bien. Así que pensé que esto funcionará:

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

pero de nuevo:

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

Algo similar sucede para el mapa también. Pero reducir funciona bien. ¿Qué estoy haciendo mal? ¿Me estoy perdiendo algo crucial que es necesario para usar el filtro o el mapa?

+1

'filter()' pasa un solo argumento a su lambda, cuando espera dos. Usar una variable no te permitirá evitarlo. – NullUserException

Respuesta

5

¿Por qué usa 2 argumentos? filter() y map() requieren una función con un único argumento, por ejemplo:

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

Para encontrar los factores de un número (se puede sustituir con lambda también):

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, eso tiene sentido. Entonces, ¿cómo hago para escribir este código, que tiene que devolver los factores para un número? Quiero usar filtro o mapa para que lo entienda mejor ... o al menos lambda – ritratt

+1

Consulte la respuesta actualizada. –

+1

Por supuesto, podría optimizar esto para simplemente buscar hasta sqrt (x), y agregar x/ny n a los resultados siempre que 'x% n == 0'. Hará la diferencia cuando los números se agranden. – NullUserException

4

Porque filter en python toma solo un argumento. Por lo tanto, debe definir una función/lambda que tome solo un argumento si desea usarlo en el filtro.

0

Su función lambda toma dos argumentos n y r. filter debe invocarse con una función que toma un argumento y devuelve True cuando se debe conservar el elemento. Quizás quisiste definir r o n fuera de tu función lambda y luego capturarlo en el cierre.

2

Si ejecuta mapa o filtrar en un conjunto clave-valor, entonces añadir corchetes (k, v), como:

.filter(lambda (k,v): k*2 + v) 
Cuestiones relacionadas