Saltar a contenido

Sentencias condicionales

Hasta ahora, hemos ejecutado las sentencias de un programa en secuencia, una tras otra, pero esa secuencia se puede alterar.

Veamos el primer caso. Vamos a ejecutar una sentencia solo si se da una condición.

Condicional1.py
1
2
3
4
5
6
nombre = input("Introduzca su nombre: ")
n = len(nombre)
if n < 3:
    print(f"{nombre}, ¿no es un nombre demasiado corto?")
else:
    print(f"Bienvenido, {nombre}")

Lo que al ejecutarse muestra algo así como:

Introduzca su nombre: Julián
Bienvenido, Julián

o bien:

Introduzca su nombre: x
x, ¿no es un nombre demasiado corto?

La palabra if significa "si". La palabra else significa "en caso contrario". En el ejemplo, vemos que las líneas 4 y 6 no se ejecutan siempre. Previamente se evalúa una condición y se ejecuta una u otra.

En líneas generales, la sintaxis de una sentencia condicional es:

if condición :
    sentencia a ejecutar si la condición se cumple
    sentencia condicional 2
    sentencia condicional 3
else :
    sentencia 4, a ejecutar si la condición no se cumple
    sentencia 5
    sentencia 6

otras sentencias que deben ejecutarse siempre

A tener en cuenta:

  • Los bloques condicionales pueden estar formados por una o varias sentencias

  • Todo bloque condicional se delimita mediante sangría.

  • El bloque else se ejecuta cuando la condición no se cumple. Es opcional, y se puede omitir:

    if condición :
        sentencias a ejecutar si la condición se cumple
    
    otras sentencias que deben ejecutarse siempre
    
  • No olvidar los dos puntos que delimitan el final de las líneas if y else:

    if condición :
        sentencias
    else :
        sentencias
    

Sangría

La sangría que delimita un bloque puede estar formada por espacios o por caracteres de tabulación, pero dentro de un bloque, no podemos mezclar un estilo con otro. Si en una línea ponemos tabuladores y en otra espacios, obtendremos un mensaje de error:

TabError: inconsistent use of tabs and spaces in indentation

También tenemos que vigilar que la sangría sea consistente para todas las líneas del bloque. Lo siguiente es erróneo, porque las líneas 4 y 5 no están alineadas:

Condicional1.py
1
2
3
4
5
6
7
nombre = input("Introduzca su nombre: ")
n = len(nombre)
if n < 3:
    print(f"{nombre}, ¿no es un nombre demasiado corto?")
      print("adios")    
else:
    print(f"Bienvenido, {nombre}")

Cuestión de estilo

El número de espacios a utilizar para la sangría es una cuestión de estilo personal, al igual que lo es el uso de mayúsculas y minúsculas. Sin embargo, conviene adoptar un estilo ampliamente aceptado por la comunidad de programadores Python. Esto facilita el examen de los programas escritos por otras personas.

La PEP nº 8 es un documento que propone unas reglas de estilo que se recomienda seguir. En cuanto a la sangría, dice que:

Spaces are the preferred indentation method.

Use 4 spaces per indentation level.

Operadores

La condición a evaluar ha de ser una expresión cuyo resultado ha de ser Verdadero o Falso. Al igual que en las expresiones aritméticas tenemos los operadores +, -, * y /, en las expresiones de comparación tenemos los siguientes operadores:

  • Menor que: a < b
  • Menor o igual que: a <= b
  • Mayor que: a > b
  • Mayor o igual que: a >= b
  • Igual a: a == b
  • Distinto de: a != b

Un ejemplo:

Contraseña.py
1
2
3
4
5
texto = input("Introduzca contraseña: ")
if texto == "Hola":
    print("contraseña correcta")
else:
    print("contraseña incorrecta")

En la segunda línea usamos el operador de igualdad ==. ¿Por que es un doble símbolo ==? Para no confundirlo con el operador de asignación. Es decir:

  • x=10 asigna un valor 10 a la variable x
  • x==10 comprueba que valor de la variable x es 10

Los operadores formados por dos símbolos no admiten un espacio entre ellos, porque se convertirían en dos tokens separados. Es decir, no podemos escribir:

a > = b

En su lugar, debemos escribir:

a >= b

La sentencia pass

Hay veces que necesitamos decir si se da una condición, no hacer nada, en caso contrario hacer esto otro.

¿Como se indica que no queremos hacer nada? Con la sentencia pass:

Condicional2.py
1
2
3
4
5
6
7
8
nombre = input("Introduzca su nombre: ")
n = len(nombre)
if n > 2:
    pass
else:
    print(f"{nombre} es demasiado corto")
    exit(1)
print(f"Bienvenido, {nombre}")

Condiciones múltiples

Cuando tenemos que controlar varias situaciones, se utilizan tres bloques, if, elif y else:

Condicional2.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
nombre = input("Introduzca su nombre: ")
n = len(nombre)

if n == 0:
    print("Error: nombre en blanco")

elif n < 3:
    print("Error: nombre muy corto")

elif n > 30:
    print("Error: nombre demasiado largo")

else:
    print(f"Bienvenido, {nombre}")

A tener en cuenta:

  • elif significa else if. Sirve para comprobar otras condiciones cuando lo anterior no se cumple.

  • los bloques elif y else son opcionales. Si se ponen, else debe ser el último bloque.

  • puede haber tantos bloques elif como queramos.

  • tanto las sentencias if como elif deben ir acompañadas de una expresión condicional. La sentencia else nunca lleva expresión condicional, porque significa si todo lo demás falla.

Bloque anidados

Un bloque condicional está formado por sentencias que, a su vez, pueden contener otros bloques condicionales, delimitados por nuevos niveles de sangrado.

Por ejemplo:

Condicional2.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
nombre = input("Introduzca su nombre: ")
n = len(nombre)

if n == 0:
    print("Error: nombre en blanco")

else:
    if n < 3:
        print("Error: nombre muy corto")
    else:
        if n > 30:
            print("Error: nombre demasiado largo")
        else:
            print(f"Bienvenido, {nombre}")

Esta es una alternativa al uso de sentencias elif. ¿Que estilo usar? En líneas generales, el que facilite el examen del programa y lo haga más sencillo de revisar.