Buscar..


Introducción

Las expresiones condicionales, que incluyen palabras clave como if, elif y else, proporcionan a los programas de Python la capacidad de realizar diferentes acciones dependiendo de una condición booleana: Verdadero o Falso. Esta sección cubre el uso de condicionales de Python, lógica booleana y sentencias ternarias.

Sintaxis

  • <expression> if <conditional> else <expression> # Operador ternario

si, elif, y si no

En Python puedes definir una serie de condicionales usando if para el primero, elif para el resto, hasta el final (opcional) else para cualquier cosa que no sea capturada por los otros condicionales.

number = 5

if number > 2:
    print("Number is bigger than 2.")
elif number < 2:  # Optional clause (you can have multiple elifs)
    print("Number is smaller than 2.")
else:  # Optional clause (you can only have one else)
    print("Number is 2.")

El Number is bigger than 2 salidas Number is bigger than 2

El uso de else if lugar de elif activará un error de sintaxis y no está permitido.

Expresión condicional (o "El operador ternario")

El operador ternario se utiliza para expresiones condicionales en línea. Se utiliza mejor en operaciones simples y concisas que se leen fácilmente.

  • El orden de los argumentos es diferente de muchos otros lenguajes (como C, Ruby, Java, etc.), lo que puede provocar errores cuando las personas que no están familiarizadas con el comportamiento "sorprendente" de Python lo usan (pueden invertir el orden).
  • Algunos lo consideran "poco manejable", ya que va en contra del flujo normal de pensamiento (pensando primero en la condición y luego en los efectos).
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'

El resultado de esta expresión será tal como se lee en inglés; si la expresión condicional es Verdadero, se evaluará la expresión en el lado izquierdo, de lo contrario, el lado derecho.

Las operaciones de tenencia también se pueden anidar, como aquí:

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

También proporcionan un método para incluir condicionales en las funciones lambda .

Si declaración

if condition:
    body

Las declaraciones if comprueban la condición. Si se evalúa como True , ejecuta el cuerpo de la sentencia if . Si se evalúa como False , se salta el cuerpo.

if True:
    print "It is true!"
>> It is true!

if False:
    print "This won't get printed.."

La condición puede ser cualquier expresión válida:

if 2 + 2 == 4:
    print "I know math!"
>> I know math!

Otra declaración

if condition:
    body
else:
    body

La sentencia else ejecutará su cuerpo solo si las sentencias condicionales anteriores se evalúan como Falso.

if True:
    print "It is true!"
else:
    print "This won't get printed.."

# Output: It is true!

if False:
    print "This won't get printed.."
else:
    print "It is false!"

# Output: It is false!

Expresiones lógicas booleanas

Las expresiones lógicas booleanas, además de evaluar a True o False , devuelven el valor que se interpretó como True o False . Es una forma en Pythonic de representar la lógica que, de lo contrario, podría requerir una prueba if-else.


Y operador

El operador and evalúa todas las expresiones y devuelve la última expresión si todas las expresiones se evalúan como True . De lo contrario, devuelve el primer valor que se evalúa como False :

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"
"Hello World"

>>> "" and "Pancakes"
""

O operador

El operador or evalúa las expresiones de izquierda a derecha y devuelve el primer valor que se evalúa como True o el último valor (si ninguno es True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

Evaluación perezosa

Cuando utilice este enfoque, recuerde que la evaluación es perezosa. Las expresiones que no requieren evaluación para determinar el resultado no se evalúan. Por ejemplo:

>>> def print_me():
        print('I am here!')
>>> 0 and print_me()
0

En el ejemplo anterior, print_me nunca se ejecuta porque Python puede determinar que la expresión completa es False cuando encuentra el 0 ( False ). Tenga esto en cuenta si print_me necesita ejecutarse para servir la lógica de su programa.


Pruebas para condiciones múltiples

Un error común al verificar múltiples condiciones es aplicar la lógica de manera incorrecta.

Este ejemplo está tratando de verificar si dos variables son cada una mayor que 2. La declaración se evalúa como - if (a) and (b > 2) . Esto produce un resultado inesperado porque bool(a) evalúa como True cuando a no es cero.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
...     print('yes')
... else:
...     print('no')
    
yes

Cada variable debe compararse por separado.

>>> if a > 2 and b > 2:
...     print('yes')
... else:
...     print('no')
        
no

Otro error similar se comete al verificar si una variable es uno de varios valores. La declaración en este ejemplo se evalúa como - if (a == 3) or (4) or (6) . Esto produce un resultado inesperado porque bool(4) y bool(6) evalúan como True

>>> a = 1
>>> if a == 3 or 4 or 6:
...     print('yes')
... else:
...     print('no')
       
yes

Nuevamente cada comparación debe hacerse por separado

>>> if a == 3 or a == 4 or a == 6:
...     print('yes')
... else:
...     print('no')
        
no

Usar el operador in es la forma canónica de escribir esto.

>>> if a in (3, 4, 6):
...     print('yes')
... else:
...     print('no')
    
no

Valores de verdad

Los siguientes valores se consideran falsey, ya que se evalúan como False cuando se aplican a un operador booleano.

  • Ninguna
  • Falso
  • 0 , o cualquier valor numérico equivalente a cero, por ejemplo 0L , 0.0 , 0j
  • Secuencias vacías: '' , "" , () , []
  • Asignaciones vacías: {}
  • Tipos definidos por el usuario donde los métodos __bool__ o __len__ devuelven 0 o False

Todos los demás valores en Python se evalúan como True .


Nota: Un error común es simplemente verificar la Falsedad de una operación que devuelve diferentes valores de Falsey donde la diferencia es importante. Por ejemplo, usar if foo() lugar de más explícito if foo() is None

Usando la función cmp para obtener el resultado de comparación de dos objetos

Python 2 incluye una función cmp que le permite determinar si un objeto es menor, igual o mayor que otro objeto. Esta función se puede usar para elegir una opción de una lista basada en una de esas tres opciones.

Supongamos que necesita imprimir 'greater than' si x > y , 'less than' si x < y e 'equal' si x == y .

['equal', 'greater than', 'less than', ][cmp(x,y)]

# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'

cmp(x,y) devuelve los siguientes valores

Comparación Resultado
x <y -1
x == y 0
x> y 1

Esta función se elimina en Python 3. Puede usar la cmp_to_key(func) ayuda cmp_to_key(func) ubicada en functools en Python 3 para convertir las funciones de comparación antiguas en funciones clave.

Evaluación de expresiones condicionales usando listas de comprensión

Python te permite hackear las comprensiones de la lista para evaluar expresiones condicionales.

Por ejemplo,

[value_false, value_true][<conditional-test>]

Ejemplo:

>> n = 16
>> print [10, 20][n <= 15]
10

Aquí n<=15 devuelve False (que equivale a 0 en Python). Entonces, lo que Python está evaluando es:

[10, 20][n <= 15]
==> [10, 20][False] 
==> [10, 20][0]     #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
Python 2.x 2.7

El método __cmp__ incorporado devolvió 3 valores posibles: 0, 1, -1, donde cmp (x, y) devolvió 0: si los dos objetos eran iguales 1: x> y -1: x <y

Esto podría usarse con la lista de comprensión para devolver el primer elemento (es decir, índice 0), segundo (es decir, índice 1) y último (es decir, índice -1) de la lista. Dándonos un condicional de este tipo:

[value_equals, value_greater, value_less][<conditional-test>]

Finalmente, en todos los ejemplos anteriores, Python evalúa ambas ramas antes de elegir una. Para evaluar solo la rama elegida:

[lambda: value_false, lambda: value_true][<test>]()

donde agregar el () al final asegura que las funciones lambda solo se llamen / evalúen al final. Así, solo evaluamos la rama elegida.

Ejemplo:

count = [lambda:0, lambda:N+1][count==N]()

Probar si un objeto es Ninguno y asignarlo

A menudo querrá asignar algo a un objeto si es None , lo que indica que no se ha asignado. Usaremos una aDate .

La forma más sencilla de hacer esto es usar la prueba is None .

if aDate is None:
    aDate=datetime.date.today()

(Tenga en cuenta que es más Pythonic decir is None lugar de == None ).

Pero esto puede optimizarse ligeramente explotando la noción de que not None se evaluará como True en una expresión booleana. El siguiente código es equivalente:

if not aDate:
    aDate=datetime.date.today()

Pero hay una forma más pitónica. El siguiente código también es equivalente:

aDate=aDate or datetime.date.today()

Esto hace una evaluación de corto circuito . Si aDate se inicializa y not None es not None , entonces se asigna a sí mismo sin efecto neto. Si is None , entonces datetime.date.today() se asigna a una aDate .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow