La función if else en Python (en español: “en caso (contrario) de”) es una función co­n­di­cio­nal y, por lo tanto, una es­tru­c­tu­ra de control fu­n­da­me­n­tal. El uso de un co­n­di­cio­na­n­te permite di­fe­re­n­tes opciones en función de la situación que se encuentre en el momento de ejecución del código. Te ex­pli­ca­mos cómo funciona y cómo se utiliza la función if else en Python.

Ce­r­ti­fi­ca­do SSL
Protégete y compra un ce­r­ti­fi­ca­do SSL

Evita aparecer en la barra del navegador como "página no segura" y consigue la confianza de tus clientes con una página web con en­cri­p­ta­ción SSL.

¿Qué es una sentencia if else?

La sentencia if else es una función co­n­di­cio­nal. Puedes ima­gi­nár­te­la como una especie de in­te­rru­p­tor: de­pe­n­die­n­do de la condición que se cumpla, se activa (solamente) una parte del código. Python es un lenguaje in­te­r­pre­ta­do; el in­té­r­pre­te lee las líneas del código fuente de arriba a abajo. En el caso más simple da lugar a un flujo es­tri­c­ta­me­n­te lineal del programa: todas las líneas se leen, in­te­r­pre­tan y ejecutan una tras otra.

Sin embargo, siguiendo este sencillo modelo no se pueden de­sa­rro­llar programas complejos. Solo con es­tru­c­tu­ras de control se puede conseguir la ve­r­sa­ti­li­dad que requiere el código en su apli­ca­ción práctica. Al cumplirse una condición, esta permite ejecutar una parte concreta del código. Otras es­tru­c­tu­ras de control comunes son los bucles de Python y los bucles while de Python; ambos permiten ejecutar partes de código re­pe­ti­da­me­n­te.

Consejo

Aprende a escribir en Python con nuestro tutorial de Python.

¿Cómo funciona la función if else en Python?

En general, la sentencia if else en Python se comporta de forma similar a como lo hace en otros lenguajes. Sin embargo, Python tiene algunas pe­cu­lia­ri­da­des es­pe­cí­fi­cas. A co­n­ti­nua­ción, se explica cómo funciona la sentencia if else en Python con detalle y cómo se comporta en co­m­pa­ra­ción con otros lenguajes.

Sintaxis general de la sentencia if else en Python

La sintaxis general de la función if else en Python se puede expresar di­re­c­ta­me­n­te en el propio código de Python. Se define una condición y en el cuerpo de la sentencia if se concreta una llamada a una función como ruta de código a seguir si la condición se hace cierta. Además, en el cuerpo else, se define una ruta de código a seguir en caso contrario:

if condition:
    if_body()
else:
    else_body()

La condición definida puede bien ser verdadera (True) o falsa (False). Es posible mostrar el modelo in­tro­du­cie­n­do di­re­c­ta­me­n­te el valor True o False como condición. El resultado es un programa de flujo estático en el que se garantiza que solo uno de los dos caminos se pueda seguir:

if False:
    # este código nunca se ejecutará
    if_body()
else:
    else_body()
if True:
    if_body()
else:
    # este código nunca se ejecutará
    else_body()

Por supuesto, este código no es práctico, pero sirve a modo de ejemplo. En lugar de un valor estático verdadero/falso, se utiliza una expresión como condición. La expresión se evalúa en tiempo real durante la ejecución del programa. Se dice que la expresión es “evaluada” y, al evaluar la expresión, se obtiene un valor de veracidad. En función de si el valor obtenido es True o False, el programa deriva en una dirección u otra.

Es im­po­r­ta­n­te entender que el apartado else es opcional. El código dentro del cuerpo else solo se ejecuta si la condición no se cumple. Sin embargo, no es ab­so­lu­ta­me­n­te necesario. Muchas veces basta con una sentencia if in­di­vi­dual:

if condition:
    if_body()

Un pequeño apunte sobre la no­me­n­cla­tu­ra: hemos utilizado los términos “sentencia” y “expresión” sin ex­pli­car­los. Es im­po­r­ta­n­te entender lo que si­g­ni­fi­can estos términos. Estos dos términos básicos se utilizan en todos los lenguajes de pro­gra­ma­ción. A co­n­ti­nua­ción, un resumen del si­g­ni­fi­ca­do de los términos:

Término Equi­va­le­n­cia en inglés Ex­pli­ca­ción
Sentencia Statement Acción a ejecutar; suele influir en el de­sa­rro­llo del programa
Expresión Ex­pre­s­sion Término que retorna un valor al ser evaluado

Realiza una consulta múltiple de co­n­di­cio­nes ex­clu­ye­n­tes con la sentencia elif en Python

En relación con la conocida función if else, Python también dispone de la función elif. Una sentencia if se puede seguir de varias se­n­te­n­cias elif y op­cio­na­l­me­n­te de una sentencia else. Una sentencia elif solo se ejecuta si ninguna de las otras co­n­di­cio­nes se cumple. Esto garantiza que solamente se pueda seguir una única ruta de código definida:

if condition:
    if_body()
elif other_condition:
    elif_body()
elif another_condition:
    another_elif_body()
else:
    else_body()

Estas son las reglas para crear una sentencia co­n­di­cio­nal en­ca­de­na­da if elif else:

Se­n­te­n­cias co­n­di­cio­na­les Cantidad de co­m­bi­na­cio­nes
if Solamente una
elif Entre ninguna y varias
else Una o ninguna

¿Cómo se utiliza if else en Python?

La función if else es una función básica tanto en Python como en otros lenguajes. Como es natural, tiene una gran variedad de usos. Te vamos a mostrar los ejemplos más comunes, in­clu­ye­n­do buenas prácticas y an­ti­pa­tro­nes.

Uso correcto de la condición if en Python

En primer lugar, hay que ver cómo funciona una sentencia co­n­di­cio­nal. La condición se in­te­r­pre­ta como una expresión booleana que se evalúa como verdadera o falsa. Por lo tanto, no es necesario comprobar de forma explícita si es igual a otro valor booleano:

if expression == True:
    ...

Aunque igualar el valor booleano a True no es un error como tal, el código parece poco pro­fe­sio­nal. En su lugar, los pro­gra­ma­do­res más ex­pe­ri­me­n­ta­dos lo redactan de la siguiente manera:

if expression:
    ...

A co­n­ti­nua­ción, una sentencia equi­va­le­n­te con otro ejemplo. La función is_odd() devuelve el valor True si evalúa un número que resulta ser impar. De lo contrario, la función is_odd devuelve el valor False. Se usa la función dentro del cuerpo de una sentencia if y se emite la frase co­rre­s­po­n­die­n­te:

if is_odd(number) == True:
    print("The number is odd.")

¿Qué ocurriría si el código analiza un número impar? En primer lugar, la sentencia 'is_odd(number) == True' se convierte en 'True == True'. Al cumplirse la igualdad, el código ejecuta el cuerpo de la sentencia if. Tiene más sentido utilizar el valor booleano devuelto por la función is_odd di­re­c­ta­me­n­te como condición:

if is_odd(number):
    print("The number is odd.")

Ejecutar código opcional con la sentencia if en Python

Se presenta la siguiente situación: se cuenta con un bloque de código con una función de­te­r­mi­na­da. Las líneas de código se ejecutan una tras otra. Sin embargo, una parte del código no debe eje­cu­tar­se siempre, sino solamente cuando se cumpla una condición. Para im­ple­me­n­tar esta condición, solo es necesaria una sentencia if. Se presenta un ejemplo de registro de usuarios:

def register_user(user_data, do_newsletter_signup = False):
    # create user account
    user_account = create_account(user_data)
    # sign up for newsletter — only if requested by user
    if do_newsletter_signup:
        signup_newsletter(user_account)
    # send confirmation mail
    send_confirmation_mail(user_account)

Di­s­ti­n­guir dos co­n­di­cio­nes di­fe­re­n­tes con la función if else en Python

Los programas suelen tener que di­s­ti­n­guir entre dos casos mu­tua­me­n­te ex­clu­ye­n­tes. Si es evidente que no puede haber ningún otro caso, tiene sentido utilizar una sentencia if else. Por ejemplo, se comprueba si una persona ha alcanzado una de­te­r­mi­na­da edad y se emite un resultado adecuado para cada caso:

def is_of_age(person, age_limit = 18):
    if person.age >= age_limit:
        print("You're old enough")
    else:
        print("Sorry, wait some more")

Di­s­ti­n­guir varios casos ex­clu­ye­n­tes con se­n­te­n­cias elif en Python

Si hay más de dos casos mu­tua­me­n­te ex­clu­ye­n­tes entre los que queremos di­s­ti­n­guir, podemos utilizar se­n­te­n­cias elif en­ca­de­na­das. Se utiliza una última sentencia else si no se cumple ninguna condición de las es­ta­ble­ci­das pre­via­me­n­te. Es posible asignar nombres de países a sus códigos co­rre­s­po­n­die­n­tes:

def get_country_from_code(country_code):
    if country_code == 'DE':
        country = "Deutschland"
    elif country_code == 'ES':
        country = "España"
    elif country_code == 'FR':
        country = "France"
    elif country_code == 'GB':
        country = "Great Britain"
    elif country_code == 'IT':
        country = "Italia"
    else:
        country = None
    return country

La cadena elif siempre debe estar dentro de una función, aunque a veces es mejor utilizar varias se­n­te­n­cias if in­de­pe­n­die­n­tes. De esta manera es posible ahorrarse el de­sig­nar­la en el cuerpo de elif. Con la sentencia return se sale de la función si se cumple alguna de las co­n­di­cio­nes es­ta­ble­ci­das. En lugar de la sentencia else final, se utiliza una sentencia return que solo se alcanza si ninguna de las co­n­di­cio­nes previas se cumple:

def get_country_from_code(country_code):
    if country_code == 'DE':
        return "Deutschland"
    if country_code == 'ES':
        return "España"
    if country_code == 'FR':
        return "France"
    if country_code == 'GB':
        return "Great Britain"
    if country_code == 'IT':
        return "Italia"
    return None

Las se­n­te­n­cias elif en­ca­de­na­das son un patrón bien conocido de los lenguajes más clásicos. En Python, suele ser más directo utilizar un “Di­c­tio­na­ry lookup”. Se asigna di­re­c­ta­me­n­te cada código a su país co­rre­s­po­n­die­n­te, para luego extraer el nombre del país en función del código evaluado. En lugar del último else se utiliza la función get que, como segundo parámetro, toma un valor por defecto:

def get_country_from_code(country_code):
    countries = {
        'DE': "Deutschland",
        'ES': "España",
        'FR': "France",
        'GB': "Great Britain",
        'IT': "Italia",
    }
    country = countries.get(country_code, None)
    return country

Usar la función if en Python para comprobar si un objeto contiene datos

Python es un lenguaje dinámico y muy ligero. En lugar de variables, los di­fe­re­n­tes tipos de datos están vi­n­cu­la­dos a valores. De­pe­n­die­n­do del uso, pueden pro­du­ci­r­se co­n­ve­r­sio­nes in­vo­lu­n­ta­rias entre los di­fe­re­n­tes tipos de datos. Dentro del contexto de las ex­pre­sio­nes booleanas, también se habla de verdadero y falso como una extensión de los valores “truthy” y “falsy”.

Esto significa que la condición de una sentencia if en Python no tiene que evaluarse de forma explícita como True o False. Más bien, se pueden utilizar otros tipos de datos como co­n­di­cio­nes, los cuales se in­te­r­pre­ta­rán como valores booleanos según ciertas reglas.

Cita

”Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean ope­ra­tio­ns […]

[...] An object is co­n­si­de­red true unless its class defines either a __bool__() method that returns False or a __len__() method that returns zero [...]” – Fuente: https://docs.python.org/3/library/stdtypes.html#truth-value-testing

Tra­du­c­ción: “Cualquier objeto puede ser evaluado para de­te­r­mi­nar si este es verdadero, para uti­li­zar­lo en una condición if o while o como operador de las ope­ra­cio­nes booleanas [...]

[...] Un objeto se considera verdadero a menos que su clase defina un método __bool__() que retorne un valor False o un método __len__() que retorne un cero [...]” (traducido por IONOS)

Se usa este patrón para comprobar si un objeto contiene datos. Como a co­n­ti­nua­ción el texto está vacío, se emite el mensaje co­rre­s­po­n­die­n­te:

text = ''
if not text:
    print("No text given")

Los si­guie­n­tes objetos se evalúan como False en un contexto booleano y, por tanto, se denominan “falsy”:

Objeto Ex­pli­ca­ción
False, None Co­n­s­ta­n­tes que son falsas según la de­fi­ni­ción
0, 0.0, Decimal(0), Fraction(0, 1), etc. Número que re­pre­se­n­ta el cero
'', (), [], {}, set(), range(0), etc. Secuencia o colección vacía

Otro ejemplo con una lista vacía:

books_in_library = []
if not books_in_library:
    print("Library is empty")

Todos los demás objetos se evalúan como True:

number = 42
if number:
    print("Number exists")

Im­ple­me­n­tar un in­te­rru­p­tor binario if else en Python

Una sentencia if else también se utiliza para alternar entre dos co­n­di­cio­nes mu­tua­me­n­te ex­clu­ye­n­tes. El principio es similar al de un in­te­rru­p­tor de luz, se le llama “toggle” en inglés. Se define una función que conmuta el estado de una bombilla:

def toggle_light(light):
    if light == 'on':
        return 'off'
    else:
        return 'on'

Quizás ya te has dado cuenta de que se puede hacer de manera aún más fácil. Si el estado no se re­pre­se­n­ta como un string, sino como un valor booleano, es buena idea pre­s­ci­n­dir de la sentencia if por completo. En su lugar, uti­li­za­mos el operador lógico NOT para invertir el valor booleano:

def toggle(boolean):
    return not boolean

Utilizar Early Return para resolver se­n­te­n­cias if anidadas en Python

En la práctica, es habitual ejecutar un de­te­r­mi­na­do código cuando varias co­n­di­cio­nes se cumplen al mismo tiempo. Esto lleva a los pro­gra­ma­do­res in­e­x­pe­r­tos a anidar se­n­te­n­cias if. Sin embargo, se trata de un mal método, y se debe a que las se­n­te­n­cias co­n­di­cio­na­les en­tre­la­za­das son difíciles de seguir y de manipular.

Un ejemplo: se escribe una función que retorna una afi­r­ma­ción sobre si una persona tiene derecho a votar. Primero se comprueba si la persona tiene un documento de identidad. A co­n­ti­nua­ción, se comprueba si la persona ya ha alcanzado la mayoría de edad para votar. Una primera im­ple­me­n­ta­ción de la función contiene de­cla­ra­cio­nes if anidadas:

def person_may_vote(person, voting_age = 18):
    if person.has_id():
        if person.get_age() >= voting_age:
            return True

El mayor problema que muestra este sistema es que la parte más im­po­r­ta­n­te de este código es también la parte más integrada. Para sustituir las se­n­te­n­cias if anidadas, lo mejor es utilizar el “Early Return”. Al principio de la función se comprueba si se cumplen las co­n­di­cio­nes co­rre­s­po­n­die­n­tes. Si alguna de las co­n­di­cio­nes no se cumple, se sale de la función mediante la sentencia return.

A co­n­ti­nua­ción se rescribe el código con Early Returns. A menudo, esto obliga a revertir o negar las co­n­di­cio­nes pre­via­me­n­te definidas. En este caso es útil conocer los ope­ra­do­res booleanos en Python. Si no se cumple ninguna de las co­n­di­cio­nes negadas, se ejecuta el código ve­r­da­de­ra­me­n­te de interés:

def person_may_vote(person, voting_age = 18):
    if not person.has_id():
        return False
    if person.age < voting_age:
        return False
    # if we made it here, the person may vote
    return True

Si­m­pli­fi­car y sustituir las se­n­te­n­cias if de Python con ope­ra­do­res lógicos

Como ya se ha visto, a menudo es necesario que se cumplan varias co­n­di­cio­nes. Suele ser poco óptimo utilizar se­n­te­n­cias if anidadas entre sí para es­ta­ble­cer múltiples co­n­di­cio­nes. A co­n­ti­nua­ción, se presenta un ejemplo de un código poco op­ti­mi­za­do para de­te­r­mi­nar si una persona puede votar:

if has_id(person):
    if is_adult(person):
        print("You may vote")

Las co­n­di­cio­nes en­ca­de­na­das pueden re­pre­se­n­tar­se de forma más atractiva mediante ope­ra­do­res lógicos. Dado que se quiere comprobar si ambas co­n­di­cio­nes se aplican al mismo tiempo, se utiliza el operador lógico AND. De esta forma, solo es necesaria una sentencia if:

if has_id(person) and is_adult(person):
    print("You may vote")

A co­n­ti­nua­ción, se presenta un listado de los ope­ra­do­res lógicos más im­po­r­ta­n­tes en Python:

Operador lógico Si­g­ni­fi­ca­do Sintaxis en Python Otros idiomas    
Y La expresión es verdadera si todos los operandos son ve­r­da­de­ros; retorna el último operando evaluado. and &&    
O La expresión es verdadera si al menos uno de los operandos es verdadero; retorna el último operando evaluado. or      
NO Invierte el valor de la expresión. not !    

Además de vincular los di­fe­re­n­tes operandos en las co­n­di­cio­nes, los ope­ra­do­res lógicos se utilizan para sustituir ciertas se­n­te­n­cias if. Esta es la co­n­fi­gu­ra­ción de los valores por defecto.

Se presenta un ejemplo: un usuario puede es­pe­ci­fi­car una divisa para realizar un cálculo fi­na­n­cie­ro. Por facilidad de uso, la elección debería ser opcional. Si el usuario no se­le­c­cio­na una moneda, se utilizará el euro como valor pre­de­te­r­mi­na­do. Se presenta este ejemplo en el código visto a co­n­ti­nua­ción:

# user made no currency choice
currency = None
...
# further down in the program flow
if not currency:
    # set default if value missing
    currency = 'EUR'

Uti­li­za­n­do el operador lógico OR, se puede pre­s­ci­n­dir de la sentencia if. Re­es­cri­bi­mos el código; cuando se ejecuta, la variable de la divisa contiene el valor 'EUR':

# user made no currency choice
currency = None
...
# further down in the program flow
# set default if value missing
currency = currency or 'EUR'

¿Qué ocurre aquí exac­ta­me­n­te? En la última línea, se asigna un nuevo valor a la variable 'cu­rre­n­c­y'. Para ello, se evalúa en primer lugar la expresión 'currency or 'EUR'' situada a la derecha del signo igual. El operador lógico OR evalúa primero la expresión de la izquierda, en este caso 'cu­rre­n­c­y'. Dado que en el ejemplo contiene 'None' y, por tanto, es “falsy”, se evalúa la expresión correcta 'EUR' y se utiliza como valor de retorno para asignar la divisa.

El operador co­n­di­cio­nal if else en Python

Además de las se­n­te­n­cias co­n­di­cio­na­les, las palabras if else tienen otra utilidad en Python. Se trata del operador co­n­di­cio­nal, también conocido como operador “ternario”. El operador co­n­di­cio­nal se utiliza ha­bi­tua­l­me­n­te a la hora de di­s­ti­n­guir entre dos posibles valores a asignar.

En primer lugar, se presenta un ejemplo uti­li­za­n­do la sentencia if else en Python. En función del sistema de medición se­le­c­cio­na­do, el código que se muestra a co­n­ti­nua­ción define la unidad a utilizar (Celsius o Fah­re­nheit) para la medición de la te­m­pe­ra­tu­ra:

if system == 'metric':
    unit = 'C'
else:
    unit = 'F'

Si se utiliza el operador co­n­di­cio­nal, es posible si­m­pli­fi­car el código a una única sentencia:

unit = 'C' if system == 'metric' else 'F'

Como su nombre expresa, el operador ternario requiere tres operandos: los dos valores posibles y una expresión como condición.

Operador Aridad Ex­pli­ca­ción Ejemplo
Unario El operador requiere un operando. not boolean_operand
Binario El operador requiere dos operandos. left_operand + right_operand
Ternario El operador requiere tres operandos. some_value if condition else other_value

Sustituir if else en Python por la sentencia match case

Con el la­n­za­mie­n­to de la versión 3.10 de Python, se introdujo la sentencia match case. A primera vista, esta se parece a la sentencia switch case de otros lenguajes. En ellos se utiliza switch case para sustituir las grandes es­tru­c­tu­ras if elif else.

Conocido por ser propenso a generar errores, switch case jamás ha llegado a existir en Python. Más bien, la función match case en Python realiza el “Stru­c­tu­ral Pattern Matching” basado en lenguajes fu­n­cio­na­les como Haskell. Su utilidad va mucho más allá de la de switch case.

A co­n­ti­nua­ción, se muestra el principio de match case con un ejemplo: podemos imaginar que queremos procesar datos de di­fe­re­n­tes maneras. Una persona se puede re­pre­se­n­tar si­m­ple­me­n­te con su nombre o por un di­c­tio­na­ry que contenga su nombre y, si procede, su edad, o como una tupla con su nombre y apellidos. Además, se quiere co­n­si­de­rar el nombre concreto “Jack” especial:

# the name 'Jack'
person1 = 'Jack'
# just a name
person2 = 'John'
# name and age in a dict
person3 = {'name': 'Jim', 'age': 42}
# name in a dict, but no age
person4 = {'name': 'Walter', 'email': 'walter.white@example.com'}
# tuple of first and last name
person5 = ('Walther', 'White')

Primero, se presenta una función que da la bie­n­ve­ni­da a una persona de una forma concreta. Se recurre a una cadena if elif else y a la función isi­n­s­ta­n­ce para di­s­ti­n­guir entre los di­fe­re­n­tes formatos. Además, se utilizan co­n­di­cio­nes en­ca­de­na­das con el operador AND y una sentencia if else anidada. El resultado final del código no parece es­pe­cia­l­me­n­te limpio:

def greet_person(person):
    if isinstance(person, str):
        if person == 'Jack':
            print('Jack himself has arrived')
        else:
            print(f"Hi there, {person}")
    elif isinstance(person, dict) and 'name' in person and 'age' in person:
        print(f"It's, {person['name']}. Born {person['age']} years ago")
    elif isinstance(person, dict) and 'name' in person:
        print(f"It's {person['name']}")
    elif isinstance(person, tuple) and len(person) == 2:
        first, last = person
        print(f"Hello, {first} {last}")
    else:
        print('Not sure what kind of person this is')

El código se puede es­tru­c­tu­rar de forma más sencilla con la función match case. Se redacta la es­tru­c­tu­ra de los formatos in­di­vi­dua­les de forma directa; los valores in­di­vi­dua­les pueden extraerse como variables. El código es más claro, menos complejo y más fácil de leer:

def match_person(person):
    match person:
        case 'Jack':
            print('Jack himself has arrived')
        case str() as name:
            print(f"Hi there, {name}")
        case {'name': name, 'age': age}:
            print(f"It's, {name}. Born {age} years ago")
        case {'name': name}:
            print(f"It's {name}")
        case (first, last):
            print(f"Hello, {first} {last}")
        case _:
            print('Not sure what kind of person this is')
Ir al menú principal