Python Language
Condicionales
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 ejemplo0L
,0.0
,0j
- Secuencias vacías:
''
,""
,()
,[]
- Asignaciones vacías:
{}
- Tipos definidos por el usuario donde los métodos
__bool__
o__len__
devuelven 0 oFalse
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
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
.