Estructuras de repetición

Autor: Pablo Cerrillo Ruiz.
Última modificación: 26 de junio de 2019.

Índice

0. ¿Qué es y cómo funciona Jupyter Notebooks?

Jupyter Notebook es un entorno de trabajo interactivo que permite desarrollar código de manera dinámica. Ahora mismo nos encontramos en el cuaderno UD Estructuras de repetición, cuya finalidad es enseñar al alumno las diferentes estructuras de repetición en Python y la utilidad que éstas tienen en el mundo de la programación.

Recuerde que para ejecutar el contenido de una celda basta con pulsar el botón Run del panel de control. También puede pulsar al mismo tiempo las teclas Mayúsculas+Enter

1. Introducción.

Vamos a comenzar esta sección realizan un pequeño ejercicio. Vamos a escribir un programa que muestre por pantalla por pantalla la palabra "Hello World!" cinco veces.

In [ ]:
# Ejecuta el siguiente código, para ello pulsa el botón Run del panel superior

print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')

Tarea sencilla ¿verdad?. Ahora vamos a realizar el mismo ejercicio pero imprimiendo la palabra "Hello World!" 10 veces.

In [ ]:
# Ejecuta el siguiente código, para ello pulsa el botón del panel superior Run

print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')
print('Hello World!')

Esto no supone un gran reto pero puede volverse bastante tedioso. ¿Eres capaz de imaginar como resolver este problema pero imprimiendo la palabra "Hello World!" 100 veces? Evidentemente una de las opciones sería copiar y pegar la sentencia print('Hello World!') 100 veces, pero no es un trabajo nada práctico. Para resolver ésto, se utilizan lo que se denominan estructuras de repetición.

Las estructuras de repetición, comúnmente conocidas como bucles, son un recurso que permiten al programador indicar que sentencias se van a repetir mientras se cumple una determinada condición. En Python encontramos dos sentencias para implementar estructuras de repetición: for y while.

2. Bucle For.

La sentencia for permite la ejecución de un código mientras la condición que evalúa sea verdadera. Generalmente, usamos esta sentencia para realizar bucles en la que la condición se ejecutará un número determinado de veces. A continuación mostraremos una imagen que representa el flujo de un programa que utiliza un bucle for.


Como podemos observar en la imagen anterior, una vez que la condición sea evaluada como falsa, el bloque de código del bucle no se ejecutará. Esto implica que puede que un bucle no se ejecuté nunca si su condición desde el primer momento es evaluada como falsa. A continuación especificaremos la sintaxis en Python para la sentencia for:

Donde:

  • for es palabra reservada que indica que comienza la declaración del bucle
  • x es una variable cuyo valor será actualizado en cada iteración del bucle. Podemos asignarle el nombre que queramos a dicha variable.
  • in es una palabra reservada que indica que en cada iteración variable actualizará su valor a un elemento del elemento_iterable.
  • elemento_iterable es cualquier tipo de dato que puede ser susceptible de ser recorrido como listas, cadenas de texto, tuplas, conjuntos o diccionarios.
  • cuerpo_bucle es el conjunto de instrucciones que queremos que se repitan.

Ejemplo 1: Vamos a resolver el problema inicial, imprimiremos 10 veces la cadena de texto "Hello World!" con el uso de la sentencia iterativa for.

In [ ]:
# Mediante la función range, definimos una lista de números inmutables.
for x in range(10):   # x es el elemento que irá actualizándose hasta recorrer la lista inmutable proporcionada por range
  print('Hello World!')

Como podemos observar, hemos resuelto un problema que nos ocupaba mas 10 líneas de código en 2. De esta forma, el programador puede ahorrar muchas líneas de código. Imagina lo sencillo que sería imprimir ahora la cadena "Hello World!" 100 veces. Si observamos el elemento iterable utilizado en el ejemplo 1, hemos utilizado la función range, la cual nos devuelve una lista inmutable de números desde el 0 hasta n-1, incrementando el valor en 1.

Ejemplo 2: Imprimir los número del 0 al 10.

In [ ]:
# Mediante la función range, definimos una lista de números inmutables.
for x in range(11):   # x es el elemento que irá actualizándose hasta recorrer la lista inmutable proporcionada por range
  print(x)

Como podemos observar en el ejemplo anterior, la variable x ha ido tomando los diferentes valores de cada uno de los elementos de la lista. El bucle for acaba cuando la variable x toma el último valor de la lista.

Ésta no es la única forma de llamar a la función range. La función range admite tambien llamadas con dos y tres argumentos

  • 2 argumentos range(inicio,final): Devuelve una lista inmutable desde inicio hasta final-1, incrementando inicio de uno en uno.
  • 3 argumentos range(inicio,final,incremento): Devuelve una lista inmutable desde inicio hasta final-1, incrementando inicio en incremento.

Ejemplo 3: Diferentes usos de la función range.

In [ ]:
''' En este primer trozo de código, vamos a devolver los números del 1 al 7 incluido '''
for x in range(1,8):   # x es el elemento que irá actualizándose hasta recorrer la lista inmutable proporcionada por range
  print(x)

print("\n")

'''En este segundo trozo de código vamos a imprimir los números impares del 1 al 10 incluido'''
for x in range(1,11,2): # x es el elemento que irá actualizándose hasta recorrer la lista inmutable proporcionada por range
  print(x)

¡PRUEBA TÚ!

Vamos a realizar un pequeño ejercicio, de manera que se imprimirán tu nombre y apellidos junto con el valor de los números pares del 0 al 10 incluido. Para ello completa el código con las instrucciones que te se proporcionan.

In [ ]:
''' Completa el código y pulsa sobre el botón run una vez hayas terminado. Observa la salida. '''

nombre = ''   # inserta tu nombre entre las comillas.
apellidos = ''  # inserta tus apellidos entre las comillas.

for x in range():   # indica los argumentos de la función range para que aparezcan los número pares
  print(x, nombre, apellidos) # imprimimos el valor de la variable junto con el nombre y apellidos.

Otra vez hemos vuelto a utilizar la función range, debido a que permite crear facilmente un elemento iterable, pero no es la única opción disponible. Podemos encontrarnos elementos iterables de diferentes tipos de datos. A continuación enumeraremos los diferentes elementos iterables y mostraremos acerca de como se recorre cada uno de ellos.

2.1 Recorriendo los diferentes elementos iterables.

A continuación vamos a recorrer los diferentes elementos iterables para ver las diferencias entre ambos. Entre los elementos iterables más comunes encontramos: listas, tuplas, conjuntos, diccionarios y cadenas de texto.

2.1.1 Recorriendo listas.

Vamos a realizar un ejemplo en el que se definen dos listas y, mediante un bucle for, se recorre cada una de los elementos.

Ejemplo 4: Recorriendo listas con la sentencia de repetición for.

In [ ]:
''' En este ejemplo vamos a definir listas para ver como se recorren mediante un bucle for'''

frutas = ["manzana", "melón", "plátano", "fresas"]     # lista con elementos de un mismo tipo de dato
pichichi = ["CR7", 15, "Messi", 15, "Luis Suárez", 13] # lista con elementos de diferentes tipos de dato

for fruta in frutas: # Declaramos sentencia for, fruta será el elemento que obtenga el valor en cada iteración de un elemento de la lista
    print(fruta)

print("\n")  # Imprimimos un salto de línea para visualizar de mejor forma la salida de ambos bucles

for x in pichichi: # Declaramos sentencia for, x será el elemento que obtenga el valor en cada iteración de un elemento de la lista
    print(x)

Como podemos observar, cuando recorremos los elementos de una lista mediante un bucle for, los elementos se recorren en el orden en el que aparecen dentro de la lista. Respecto al cuerpo del bucle, puede contener un número indeterminado de líneas de código.

¡PRUEBA TÚ!

Define una lista con los nombres de tus mejores amigos/as e imprime el nombre de cada uno de ellos utilizando la sentencia de repetición for.

In [ ]:
''' Escribe aquí el código del ejercicio '''

# Define una lista


# Define el bucle para recorrer cada elemento de la lista e imprímelo por pantalla

2.1.2 Recorriendo tuplas.

Vamos a realizar un ejemplo en el que se definen dos tuplas y, mediante un bucle for, se recorre cada una de los elementos. Recuerde que para crear tuplas, utilizamos los paréntesis.

Ejemplo 4: Recorriendo listas con la sentencia de repetición for.

In [ ]:
''' En este ejemplo vamos a definir una tupla para ver como se recorren mediante un bucle for '''

frutas = ("manzana", "melón", "plátano", "fresas")     # tupla con elementos de un mismo tipo de dato
pichichi = ("CR7", 15, "Messi", 15, "Luis Suárez", 13) # tupla con elementos de diferentes tipos de dato

for fruta in frutas: # Declaramos sentencia for, fruta será el elemento que obtenga el valor en cada iteración de un elemento de la lista
    print(fruta)

print("\n")  # Imprimimos un salto de línea para visualizar de mejor forma la salida de ambos bucles

for x in pichichi: # Declaramos sentencia for, x será el elemento que obtenga el valor en cada iteración de un elemento de la lista
    print(x)

Al igual que las listas, cuando recorremos los elementos de una lista mediante un bucle for, los elementos se recorren en el orden en el que aparecen dentro de la lista.

¡PRUEBA TÚ!

Define una tupla que contenga el día de la semana y a continuación la temperatura de ese día. Después imprime cada uno de ellos utilizando la sentencia de repetición for.

In [ ]:
''' Escribe aquí el código del ejercicio '''

# Define una tupla


# Define el bucle para recorrer cada elemento de la tupla e imprímelo por pantalla

2.1.3 Recorriendo conjuntos.

En esta ocasión vamos a trabajar con conjuntos. Como recordatorio, decir que podemos crear conjuntos de elementos de diversos tipos de datos insertándolos entre las llaves {}.

In [ ]:
''' En este ejemplo vamos a definir dos conjuntos para ver como se recorren mediante un bucle for '''

asignaturas = {"Matemáticas", "Lengua", "Historia", "Informática", "Gimnasia", "Filosofía"}    # conjunto con elementos de un mismo tipo de dato
cajon = ("cargador", 5, True, 7.9, 8 , "hello world!") # conjunto con elementos de diferentes tipos de dato

for asig in asignaturas: # Declaramos sentencia for, asig será el elemento que obtenga el valor en cada iteración de un elemento del conjunto
    print(asig)

print("\n")  # Imprimimos un salto de línea para visualizar de mejor forma la salida de ambos bucles

for cosa in cajon: # Declaramos sentencia for, cosa será el elemento que obtenga el valor en cada iteración de un elemento del conjunto
    print(cosa)

Como podemos observar, no hay ningún orden en los conjuntos.

¡PRUEBA TÚ!

Define un conjunto que contenga el nombre de las diferentes redes sociales que conozcas. Después imprime cada uno de ellos utilizando la sentencia de repetición for.

In [ ]:
''' Escribe aquí el código del ejercicio '''

# Define un conjunto


# Define el bucle para recorrer cada elemento del conjunto e imprímelo por pantalla

2.1.4 Recorriendo diccionarios.

Una de las estrucutras de datos más utilizadas son los diccionarios .Vamos a realizar un ejemplo en el que se define un diccionario y se va a utilizar como elemento iterable.

In [ ]:
''' En este ejemplo vamos a definir un diccionario para ver como se recorren mediante un bucle for '''

# Vamos a definir los números de los coches de F1 junto sus pilotos
piloto = { '14': 'Fernando Alonso', '5': 'Sebastian Vettel', '44': 'Lewis Hamilton', '55': 'Carlos Sainz Jr.' }     # diccionario que contine clave valor

for x in piloto: # Declaramos sentencia for, x será el elemento que obtenga el valor de la clave del diccionario
    print(x)

Como vemos en el ejemplo anterior, unicamente se imprimen las claves del diccionario, además sin un orden aparente. Si queremos imprimir tambíen el valor, entonces deberíamos acceder mediante los corchetes y la clave.

In [ ]:
''' En este ejemplo vamos a definir un diccionario para ver como se recorren mediante un bucle for '''

# Vamos a definir los números de los coches de F1 junto sus pilotos
piloto = { '14': 'Fernando Alonso', '5': 'Sebastian Vettel', '44': 'Lewis Hamilton', '55': 'Carlos Sainz Jr.' }     # diccionario que contine clave valor

for x in piloto: # Declaramos sentencia for, x será el elemento que obtenga el valor de la clave del diccionario
    print(x, piloto[x])  # con la sentencia piloto[x] podemos imprimir el valor. 

Ahora obtenemos las claves junto con los valores del diccionario. Aunque pueda parecer que están ordenados no lo están. Python devuelve los valores de los diccionarios en orden aleatorio.

¡PRUEBA TÚ!

Define un diccionario cuya clave sea el codigo de barras de un producto y como valor el nombre del producto. Después imprime los valores del diccionario utilizando un bucle for.

In [ ]:
''' Escribe aquí el código del ejercicio '''

# Define un diccionario


# Define el bucle para recorrer cada elemento del diccionario e imprímelo por pantalla

2.1.5 Recorriendo cadenas de texto.

Una cadena de texto es tambien un elemento iterable. Vamos a realizar un ejemplo en el que se define una cadena de texto y se va a utilizar como elemento iterable.

Ejemplo : Recorriendo una cadena de caracteres con un bucle for

In [ ]:
''' En este ejemplo vamos a definir una cadena de texto y la recorreremos con un bucle for '''

cadena = 'Ka-me-ha-me-haaaaaaaa!!!!' # cadena de texto

for x in cadena: # Declaramos sentencia for, x será el elemento que obtenga el valor en cada iteración de un elemento de la cadena
    print(x)

Cuando utilizamos una cadena de texto como un elemento iterable, Python la descomponen en cada uno de los caracteres que forman la cadena. Des este modo, la variable del bucle for va tomando el valor de cada uno de los carácteres en el orden que aparece.

¡PRUEBA TÚ!

Define una cadena de texto con una frase o palabra que conozcas. A continuación, imprimela utilizando el bucle for.

In [ ]:
''' Escribe aquí el código del ejercicio '''

# Define una cadena de texto


# Define el bucle para recorrer cada uno de los caracteres de la cadena de texto

2.2 El cuerpo del bucle.

Hasta ahora, únicamente hemos estado hablando de los elementos iterables más comunes y como recorrerlos, pero ¿Qué ocurre con el cuerpo del bucle? El cuerpo del bucle admite diferente posibilidades, no únicamente la sentencia print. Veamos un par de ejemplos.

Ejemplo: Sumar los elementos de una lista.

In [ ]:
# Declaramos una lista con números
mi_lista = [5,2,6,1,3]

# Declaramos una variable suma que almacenara el resultado de sumar 
suma = 0

# Declaramos el bucle for
for x in mi_lista: 
    suma = suma + x

print("La suma de los números de la lista es: ",suma)

Como podemos observar, hemos realizado operaciones dentro de un bucle. Ahora vamos a ver un ejemplo donde insertaremos dentro del bucle sentencias de decisión.

Ejemplo: Bucle for que recorre los elementos de una lista de palabras e imprime aquellas que empiezan por la letra 'm', En otro caso imprimiremos por pantalla el nombre de la fruta junto con la cadena de texto "no empieza por la letra m"

In [ ]:
# Declaramos un array con diferentes frutas
fruits = ["manzana", "melón", "plátano", "sandía", "melocotón", "uvas", "mango", "fresas", "pera"]

# Declaramos el bucle for
for x in fruits:
    if x[0] == 'm' or x[0] == 'M':  # Si la primera letra de la palabra almacenada en la variable x es m o M
        print(x)
    else:
        print(x + " no empieza por la letra m") 

¡PRUEBA TÚ!

Completa el siguiente código para indicar que números son pares e impares del 0 al 50. Pista: un número es impar si es resto de la división entre 2 es distinto de cero, en otro caso es par.

In [ ]:
# Declaramos el bucle for
for  in range():   # Completa la sentencia for y los parámetros de la funcion range para obtener los números del 0 al 50 inclusive
    if :           # Completa la sentencia de decisión que permitirá saber si un número es impar.
        print(, " es un número impar")  
    else:
        print(, " es un número par") 

Calcula la suma y la media de los elementos de la siguiente lista [1, 3, 9, 10, 12, 17, 7, 13, 5]. Pista: La función len devuelve el número de elementos de una lista.

In [ ]:
''' Escribe aquí el código del ejercicio '''

2.2.1 Anidación de bucles.

Como hemos visto anteriormente, dentro de un bucle hemos insertado operadores y sentencias de decisión, pero ¿Se puede insertar un bucle dentro de otro bucle? La respuesta es sí, veamos como funciona.

In [ ]:
for x in range(2):
    print("Hola")
    for y in range(4):
        print(" Mundo!!")

Si observamos con detenimiento, la cadena "Mundo!!" se ha ejecutado un total de 8 veces. Esto se debe a que al ser un bucle interno, se repetirá tantas veces la ejecución como indique el bucle externo. En el siguiente ejemplo vamos a imprimir la tabla de multiplicar de los números 2 y 3

Ejemplo 6: Imprimir la tabla de multiplicar del número 2 y 3.

In [ ]:
for x in range(2,4):
    print("La tabla de multiplicar del número", x, "\n")
    for y in range(11):
        print(x, "x", y, "=", x*y)
    print("")

Como podemos observar, para cada número del bucle externo, se ha ido ejecutando al completo el bucle interno. Es por ello que se han imprimido los números del 1 al 10 en las dos ocasiones.

¡PRUEBA TÚ!

¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.</p>

In [ ]:
'''
for x in range(2):
    print("Es ")
    for y in range(4):
        print(" Gol!!")

'''

3. Bucle While.

La sentencia While permite la ejecución de un código mientras la condición se evalúe como verdadera. A diferencia del bucle for, nosotros somos los encargados de actualizar la variable o el conjunto de variables utilizadas en la sentencia de decisión. A continuación mostraremos una imagen que representa el flujo de un programa que utiliza un bucle while:

Cabe destacar, que si la condición de inicio se evaluase como falsa, el programa no entraría en el bloque de código del bucle. De este modo, no se ejecutaría ninguna instrucción del bucle y la ejecución del programa continuaría por la instrucción que viene justo después del bucle. A continuación especificaremos la sintaxis en Python para la sentencia while:

Donde:

  • while palabra reservada que indica que comienza la declaración del bucle.
  • condición conjunto de operaciones lógicas que devolverá como salida un booleano.
  • cuerpo_bucle conjunto de instrucciones a repetir.

Ejemplo 1: Vamos a resolver el problema inicial, imprimiremos 10 veces la cadena de texto "Hello World!" usando la sentencia iterativa while.

In [ ]:
# Definimos una variable que nos sirva de contador
x = 0
while x < 10:
    print('Hello World!')  # Imprimimos la cadena Hello World!
    x += 1                 # Incrementamos la variable

Como podemos observar en el ejemplo anterior, se ejecuta el código hasta que la condición se evalúe como falsa. Vamos a imprimir el valor de la variable x y a mostrar la salida de evaluar la condicion x < 10.

In [ ]:
print(x)
print(x < 10)
In [ ]:
x = 0
while( x < 10):
    print(x)
    x += 1

Tenemos que prestar atención a la condición del bucle, asi como la actualización de las diferentes variables que permiten la detención del bucle en el momento que estimemos oportuno. Si no prestamos atención, podríamos hacer un bucle infinito. En el siguiente ejemplo vamos a utilizar la sentencia break, la cuál permite parar detener la ejecución de un bucle o sentencia de decisión.

Ejemplo: Sentencia while que ejecuta un bucle infinito.Para detener su ejecución, utilizaremos la sentencia break.

In [ ]:
# Definimos una variable que nos sirva de contador
x = 0
while x >= 0: # Entra en el bucle, ya que cumple la condición en la primera iteración
    print(x, " " ,end="")# Imprimimos el valor de la variable sin hacer salto de línea
    x += 1    # actualizamos la variable erróneamente
    if x > 400:
        break

Como hemos podido observar, la ejecución del programa se ha detenido gracias a la sentencia break. El bucle no se ha parado por su condición porque se ha producido un bucle infinito, ya que la variable x nunca será menor que cero, simplemente por el hecho de que estamos actualizando la variable erróneamente y siempre estamos incrementando el valor de la variable, en vez de decrementarlo.

Otra de las cosas en las que tenemos que fijarnos a la hora de utilizar bucles son las condiciones de ejecución y el valor antes de entrar por primera vez al bucle. Como se mencionó anteriormente, si la condición de entrada se evalúa como falsa antes de entrar al bucle, no se ejecutará ninguna instrucción ubicada dentro del bucle.

Ejemplo: Sentencia while que no se ejecuta debido a que no cumple la condición.

In [ ]:
# Definimos una variable que nos sirva de contador
x = 0
while x > 10:
    print('Hello World!')  # Imprimimos la cadena Hello World!

print('No se ejecuta ninguna instrucción del bucle')

Esto mismo ocurre con los bucles for, si el elemento iterable no contiene nada, nunca se ejecutará el bloque de código dentro del bucle.

In [ ]:
# Definimos una lista vacía

numeros = []

for x in numeros:
    if x > 10 or x < 0:
        print(x, ' es una calificación incorrecta')
    else:
        print(x, 'es una calificación correcta')

print('No se ejecuta ninguna instrucción del bucle')

4. ¿Qué hemos aprendido?.

Una vez terminado el cuaderno, vamos a realizar un pequeño resumen acerca de lo visto hasta ahora:

  • Las sentencias de decisión permiten repetir la ejecución de un bloque de código.
  • En Python tenemos dos sentencias de repetición: for y while.
  • Los bucles for repiten el bloque de código mientras recorren un elemento iterable. El bucle acabará una vez se haya recorrido por completo cada uno de los elementos que componen el elemento iterable.
  • No todos los elementos iterables (tuplas, listas, diccionarios,...etc.) se recorren de la misma forma. Hay que prestar atención al elemento iterable que utilizamos, ya que podría ser que no obtengamos el resultado deseado.
  • Los bucles while repiten el bloque de código mientras la condición booleana se evalúe como verdadera. El bucle terminará una vez se evalúe como falsa la condición.
  • Hay que prestar atención tanto a las condiciones de los bucles como a la actualización de las variables que componen la expresión booleana. Si no tenemos cuidado, podríamos tener como resultado un bucle infinito.

5. Relación de ejercicios.

A continuación se presentan una relación de ejercicios para que el alumno/a pueda prácticar los conceptos vistos en este cuaderno.

EJERCICIO 1: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.

In [ ]:
## Elimina las comillas para ejercutar el código y comprobar el resultado de salida.
'''
calificaciones = [3,7,4,9,5,6,0]

for x in calificaciones:
    if x < 5:
        print("Has sacado un suspenso",x)
    elif x >= 5 and x < 6:
        print("Has sacado un aprobado",x)
    elif x >= 6 and x < 7:
        print("Has sacado un bien",x)
    elif x >= 7 and x < 9:
        print("Has sacado un notable",x)
    else:
        print("Has sacado un sobresaliente",x)
'''    

EJERCICIO 2: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.

In [ ]:
## Elimina las comillas para ejercutar el código y comprobar el resultado de salida.
'''

i = 0 

while i < 50:
   if i > 20 and i % 5 == 0:
        print(i)
   i = i + 1
   
'''

EJERCICIO 3: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.

In [ ]:
## Elimina las comillas para ejercutar el código y comprobar el resultado de salida.
'''

a = 2
b = 3

for x in range(1,10):
   if a < b:
        a += 1
   else:
        b += 1

print("El valor de a es: ", a)
print("El valor de b es: ", b)

'''

EJERCICIO 4: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.

In [ ]:
## Elimina las comillas para ejercutar el código y comprobar el resultado de salida.
'''

a = 1
b = 1
contador = 0

while contador < 11:
    if a > b:
        b = b * 2
    elif b > a:
        a = a + 2
    else:
        a += 1
    
    contador = contador + 1
    
print("El valor de a es: ", a)
print("El valor de b es: ", b)

'''

EJERCICIO 5: El siguiente código muestra las tablas de multiplicar de los números 2 y 3. Realiza las modificaciones necesarias para que imprima las tablas de multiplicar de los números pares del 2 al 10 inclusive.

In [ ]:
'''
for x in range(2,4):
    print("La tabla de multiplicar del número", x, "\n")
    for y in range(11):
        print(x, "x", y, "=", x*y)
    print("")
    
'''

### COPIA Y PEGA EL CÓDIGO ANTERIOR PARA MODIFICARLO

EJERCICIO 6: Escribe un bucle for que imprima todos aquellos número del 0 al 40 inclusive que sean múltiplos de 3 o de 4. Además, junto al número deberá indicarse si es múltiplo de 3, múltiplo de 4 o múltiplo de ambos.

In [ ]: