2011-06-05 10 views
14

¿Qué está pasando aquí?Python lambda function

reduce(lambda x,y: x+y, [x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0]) 

entiendo como x se iteración a través de todos los números del 1 al 999 y sacando los que son divisibles por 3 o 5, pero el 'lambda x, y: x + y' parte me está haciendo campaña .

Respuesta

15

Esto es malo Python para

sum(x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0) 

Simplemente resume todos los números en el rango 1..999 divisible por 3 o 5.

reduce() aplica la función dada a los dos primeros puntos de la iterable, luego al resultado y al siguiente ítem del iterable, y así sucesivamente. En este ejemplo, la función

lambda x, y: x + y 

simplemente agrega sus operandos.

4

A lambda designa una función anónima. La sintaxis lambda x,y: x+y puede afirmar en Inglés como "declarar una función sin nombre, teniendo dos parámetros con nombre x y y. Realizar la operación x+y. El valor de retorno de esta función sin nombre va por el resultado de esta operación"

reduce aplica alguna función secuencialmente a los primeros dos elementos de una lista suministrada, luego al resultado de esa función y al tercer elemento, y así sucesivamente. Por lo tanto, la lambda en el código suministrado se utiliza por reducir añadir juntos los elementos de la lista suministrada, que contendrá todos los múltiplos de 3 y 5 a menos de 1000.

6

diciendo

f = lambda x, y : x + y 

es casi lo mismo que decir

def f(x, y): 
    return x + y 

en otras palabras lambda devuelve una función que dados los parámetros a la izquierda del signo : devolverá el valor de la expresión a la derecha de la misma. sin embargo

Con respecto a una función es bastante limitado, por ejemplo permite sólo una expresión y no se permiten declaraciones. Sin embargo, este no es un problema grave porque en Python puede definir una función completa incluso en el medio de otra función y pasarla en su lugar.

El uso que muestra es bastante malo porque una lambda no tiene sentido ... Python permitiría calcular esa suma directamente en lugar de usar reduce.

También, dicho sea de paso, para el resultado de ese cálculo hay una solución fácil de forma cerrada que no requiere ninguna iteración ... (sugerencia: la suma de todos los números del 1 al n es n*(n+1)/2 y la suma de todos los múltiplos de 5 desde 5 a n es 5 * (suma de todos los números de 1 a N/5) ... por lo tanto ...)

+0

la solución de forma cerrada es en realidad un poco más complicado que sugirió. Tendría que agregar todos los múltiplos de 3 y todos los múltiplos de 5, y luego restar todos los múltiplos de 15 ya que se agregaron dos veces. –

+0

Sí, esta es exactamente la fórmula, pero no me parece realmente compleja ... – 6502

Cuestiones relacionadas