2009-07-22 16 views
5

Solo estoy usando herramientas para mi propio entretenimiento, y quiero usar una lambda, porque me da la gana. ¿Puedo reemplazar esta función con una lambda?Evaluación booleana en una lambda

def isodd(number): 
    if (number%2 == 0): 
     return False 
    else: 
     return True 

Elemental, sí. Pero me interesa saber ...

Respuesta

12

Y si usted realmente no necesita una función que puede reemplazarlo incluso sin una lambda. :)

(number % 2 != 0) 

por sí solo es una expresión que se evalúa como verdadera o falsa. O aún más claro,

bool(number % 2) 

que se puede simplificar así:

if number % 2: 
    print "Odd!" 
else: 
    print "Even!" 

Pero si eso es legible o no es, probablemente, en el ojo del espectador.

+0

Mira, este fue el meollo del asunto. Tenía la impresión de que tanto 0 como 1 son True en Python, ya que ambos son ints. – SilentW

+3

http://docs.python.org/library/stdtypes.html - "Los siguientes valores se consideran falsos: ... cero de cualquier tipo numérico, por ejemplo, 0" – Ken

+0

Aún así me quedaría en una función . Con módulo 2, siempre necesito uno o dos segundos para descubrir si se evalúa verdadero para par o impar. if isodd (número) es más claro. Pequeños detalles como este tienden a sumarse para hacer una diferencia real. –

7
lambda num: num % 2 != 0 
4
isodd = lambda number: number %2 != 0 
7

Sí se puede:

isodd = lambda x: x % 2 != 0 
5

Otros ya le dieron respuestas que cubren su caso particular. En general, sin embargo, cuando realmente necesita una declaración if, puede usar la expresión condicional. Por ejemplo, si usted tendría que devolver cadenas "False" y "True" en lugar de valores booleanos, usted puede hacer esto:

lambda num: "False" if num%2==0 else "True" 

El definition de esta expresión en la referencia del lenguaje Python es el siguiente:

La expresión x if C else y primero evalúa C (no x); si C es verdadero, se evalúa x y se devuelve su valor; de lo contrario, se evalúa y y se devuelve su valor.

3

Además, no olvide que puede emular oraciones condicional complejas con lógica de cortocircuito simple, aprovechando que "y" y "o" devuelven algunos de sus elementos (el último evaluado) ... por ejemplo, en este caso, suponiendo que te gustaría devolver algo diferente de Verdadero o Falso

lambda x: x%2 and "Odd" or "Even" 
1

isodd = lambda number: (False, True)[number & 1]

0

Cada vez que se ve a sí mismo escribiendo:

if (some condition): 
    return True 
else: 
    return False 

debe sustituirla por una sola línea:

return (some condition) 

Su función se convierte en:

def isodd(number): 
    return number % 2 != 0 

Usted debe ser capaz de ver cómo llegar desde allí a la solución lambda que otros han proporcionado .

+2

Cada vez que se vea escribiendo 'if (alguna condición):' o 'return (alguna condición)', pierda los paréntesis. –

+1

Sí, lo sé. Pero pensé que el ejemplo era mejor, dado que 'some condition' no es una sintaxis válida. Tal vez debería haber usado corchetes. –

+0

Prueba 'some_condition' –

Cuestiones relacionadas