Escuela de Educación Técnica N°3117 Especialidad: Informática
“Maestro Daniel Oscar Reyes”
Espacio Curricular:
Adaptación y
Curso: 3° 4° – Ciclo Superior
Complementación de
programas
Ficha de Cátedra
Tema: Ciclos Condicionados e Incondicionados en Python
Estructuras Repetitivas (Ciclos)
Las computadoras están especialmente diseñadas para todas aquellas aplicaciones en
las cuales una operación o un conjunto de ellas deben repetirse muchas veces. Un tipo muy
importante de estructuras es el algoritmo necesario para repetir una o varias veces acciones
un numero determinado de veces. Un programa que lee una lista de números puede repetir la
misma secuencia de mensaje al usuario e instrucciones de lectura hasta que todos los números
se lean.
Las estructuras que repiten una secuencia de instrucciones un número determinado de
veces se denominan bucles y se denomina iteración al hecho de repetir la ejecución de una
secuencia de acciones. Un ejemplo aclarará la cuestión.
Supongamos que se desea suma una lista de números escritor desde el teclado – por
ejemplo, calificaciones de los alumnos de una clase -. El medio conocido hasta ahora es leer los
números y añadir valores a una variable SUMA que contenga las sucesivas sumas parciales. La
variable SUMA se hace igual a cero y a continuación se incrementa en el valor del número cada
vez que uno de ellos se lea. El algoritmo que resuelve este problema es:
#Inicio
suma = 0
x = int (input ("Ingresa una calificación"))
suma = suma + x
x = int (input ("Ingresa una calificación"))
suma = suma + x
x = int (input ("Ingresa una calificación"))
suma = suma + x
#fin
Y así sucesivamente para cada numero de la lista. En otras palabras, el algoritmo se repite
muchas veces las acciones:
x = int (input("Ingresa una calificación"))
suma = suma + x
Tales opciones repetidas se denominan bucles. La acción (o acciones) que se repite en
un bucle se denomina iteración. Las dos preguntas para realizarse en el diseño de un bucle
son:
¿Qué contiene el bucle? (Referido a las acciones o instrucciones a repetir.
¿Cuántas veces se debe repetir?
En programación se trabaja con dos tipos de bucles: Condicionados e Incondicionados. A
continuación, se explica cada uno
Ciclos Incondicionados (For)
A continuación, explicaremos el bucle for y sus particularidades en Python, que,
comparado con otros lenguajes de comparación, tiene ciertas diferencias.
En general, un bucle es una estructura de control que repite un bloque de
instrucciones. Un bucle for es un bucle que repite el bloque de instrucciones un número
predeterminado de veces. El bloque de instrucciones que se repite se suele llamar cuerpo del
bucle y cada repetición se suele llamar iteración.
for variable_iteradora in objeto_iterable (lista, tupla,
diccionario):
bloque_de_instrucciones
No es necesario definir la variable de control antes del bucle, aunque se puede utilizar
como variable de control una variable ya definida en el programa.
El cuerpo del bucle se ejecuta tantas veces como elementos tenga el elemento iterable
(elementos de una lista o de un range (), caracteres de una cadena, etc.). Por ejemplo:
Si la lista está vacía, el bucle no se ejecuta ninguna vez. Por ejemplo:
En el siguiente ejemplo vemos un bucle for que se ejecuta 5 veces, y donde la
incrementa su valor “automáticamente” en 1 en cada iteración.
for i in range(0, 5):
print(i)
# Salida:
# 0
# 1
# 2
# 3
# 4
En Python se puede iterar prácticamente todo, como por ejemplo una cadena. En el
siguiente ejemplo vemos como la i va tomando los valores de cada letra. Mas adelante
explicaremos que es esto de los iterables e iteradores.
for i in "Python":
print(i)
# Salida:
# P
# y
# t
# h
# o
# n
Iterables e Iteradores
Para entender al cien por cien los bucles for, y como Python fue diseñado como
lenguaje de programación, es muy importante entender los conceptos de iterables e
iteradores. Empecemos con un par de definiciones:
Los iterables son aquellos objetos que como su nombre indica pueden ser
iterados, lo que dicho de otra forma es, que puedan ser indexados. Si piensas
en un array (o una listen Python), podemos indexarlo con lista [1] por ejemplo,
por lo que sería un iterable.
Los iteradores son objetos que hacen referencia a un elemento, y que tienen
un método next() que permite hacer referencia al siguiente.
Ambos son conceptos un tanto abstractos y que pueden ser complicados de entender.
Veamos unos ejemplos. Como hemos comentado, los iterables son objetos que pueden ser
iterados o accedidos con un índice. Algunos ejemplos de iterables en Python son las listas,
tuplas, cadenas o diccionarios. Sabiendo esto, lo primero que debemos tener claro es que, en
un for, lo que va después del in deberá ser siempre un iterable.
#for <variable> in <iterable>:
# <Código
Tiene bastante sentido, porque si queremos iterar una variable, esta variable debe ser
iterable, todo muy lógico. Pero llegados a este punto, tal vez de preguntes ¿pero ¿cómo se yo
si algo es iterable o no? Bien fácil, con la siguiente función isinstance () podemos saberlo. No
te preocupes si no entiendes muy bien lo que estamos haciendo, fíjate solo en el resultado,
True significa que es iterable y False que no lo es.
from collections import Iterable
lista = [1, 2, 3, 4]
cadena = "Python"
numero = 10
print(isinstance(lista, Iterable)) #True
print(isinstance(cadena, Iterable)) #True
print(isinstance(numero, Iterable)) #False
Por lo tanto, las listas y las cadenas son iterables, pero número, que es un entero no lo
es. Es por eso por lo que no podemos hacer lo siguiente, ya que daría un error. De hecho, el
error sería TypeError: int' object is not iterable.
numero = 10
#for i in numero:
# print(i)
Una vez entendidos los iterables , veamos los iteradores. Para entender los iteradores,
es importante conocer la función iter()en Python. Dicha función puede ser llamada sobre un
objeto que sea iterable, y nos devolverá un iterador como se ve en el siguiente ejemplo:
lista = [5, 6, 3, 2]
it = iter(lista)
print(it) #<list_iterator object at 0x106243828>
print(type(it)) #<class 'list_iterator'>
Vemos que al imprimir it es un iterador, de la clase list_iterator. Esta variable
iteradora, hace referencia a la lista original y nos permite acceder a sus elementos con la
función next(). Cada vez que llamamos a next()sobre it, nos devuelve el siguiente elemento de
la lista original. Por lo tanto, si queremos acceder al elemento 4, tendremos que llamar 4 veces
a next(). Nótese que el iterador empieza apuntando fuera de la lista, y no hace referencia al
primer elemento hasta que no se llama a next() por primera vez.
lista = [5, 6, 3, 2]
it = iter(lista)
print(next(it))
# [5, 6, 3, 2]
# ^
# |
# it
print(next(it))
# [5, 6, 3, 2]
# ^
# |
# it
print(next(it))
# [5, 6, 3, 2]
# ^
# |
# it
Uso de la clase range() en Python
¿Cómo implementamos y/o simulamos en Python el bucle for basado en una secuencia
numérica? Para estos casos, Python pone a nuestra disposición la clase range (en Python 2 era
una función). El constructor de esta clase, range(max), devuelve un iterable cuyos valores van
desde 0 hasta max - 1.
for i in range(11):
print(i)
0
1
2
3
...
10
El tipo de datos range se puede invocar con uno, dos e incluso tres parámetros:
range(max): Un iterable de números enteros consecutivos que empieza en 0 y acaba
en max - 1
range(min, max): Un iterable de números enteros consecutivos que empieza en min y
acaba en max - 1
range(min, max, paso): Un iterable de números enteros consecutivos que empieza en
min acaba en max - 1 y los valores se van incrementando de step en step. Este último
caso simula el bucle for con variable de control.
for num in range(0, 11, 2):
print(num)
0
2
4
6
8
10
Como te adelantaba en la introducción, range es una clase que genera una secuencia de
números inmutable.
Para crear un objeto de tipo range, se pueden usar dos constructores :
range(fin): Crea una secuencia numérica que va desde 0 hasta fin - 1.
range(inicio, fin, [paso]): Crea una secuencia numérica que va desde inicio hasta fin -
1. Si además se indica el parámetro paso, la secuencia genera los números de paso en
paso.
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(5, 10))
[5, 6, 7, 8, 9]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(5, -5, -2))
[5, 3, 1, -1, -3]
Recorrer una secuencia de números generada por la clase range
En la introducción te adelanté que uno de los principales usos de range() es utilizarlo
en bucles for.
>>> for i in range(1, 11):
... print(i)
...
1
2
3
4
5
6
7
8
9
10
Ciclos Condicionados (While)
Introducción
La sentencia o bucle while en Python es una sentencia de control de flujo que se utiliza
para ejecutar un bloque de instrucciones de forma continuada mientras se cumpla una
condición determinada.
Definición
Como te decía, el uso principal de la sentencia while es ejecutar repetidamente un
bloque de código mientras se cumpla una condición.
La estructura de esta sentencia while es la siguiente:
while condición:
bloque de código
Es decir, mientras condición se evalúe a True, se ejecutarán las instrucciones y
sentencias de bloque de código.
Aquí, condición puede ser un literal, el valor de una variable, el resultado de una
expresión o el valor devuelto por una función.
Veamos un ejemplo: Tabla del 3
numero = 0
print('Tabla del 3')
while numero <= 10:
print(f'{numero * 3}')
numero += 1
print('Fin')
En el script anterior se inicializa una variable número con el valor 0.
Seguidamente se muestra un mensaje y en la línea 3 aparece una sentencia while. En
esta sentencia se comprueba si el valor de la variable número es menor o igual a 10.
Como se evalúa a True, se muestra por pantalla el resultado de multiplicar número por
3 y después se incrementa el valor de numero en 1.
A continuación, se debería ejecutar el código de la línea 6. Sin embargo, como hemos
definido un bucle while, el flujo de ejecución del programa no continúa por la línea 6, sino que
vuelve a la línea 3 y de nuevo se evalúa si la expresión número <= 10 sigue siendo True. En esta
ocasión el valor de número es 1, por lo que la expresión da como resultado True y vuelven a
ejecutarse las líneas de la sentencia while.
Esto será así hasta que numero sea igual a 11. En esa ocasión la expresión de
comparación se evaluará a False y el flujo continuará, ahora sí, por la línea 6.
El resultado del script anterior es el siguiente (la tabla de multiplicar del número 3):
Tabla del 3
0
3
6
9
12
15
18
21
24
27
30
Fin
Contadores
Su funcionalidad consiste en contar de 1 en 1 una sucesión de elementos de la misma
naturaleza. Se inicializa la variable contadora cont en 0 por ser el elemento neutro de la suma.
Esta inicialización se realiza una sola vez antes del ciclo. Posteriormente, en el rango del ciclo,
se incrementa en 1 el valor de la variable (cont = cont + 1).
Es usual que en el rango del ciclo se requiera un componente Alternativa_Si/Sino
(If/Else) o Alternativa_Si (If) para identificar los elementos de la misma naturaleza.
Ejemplo: Introducir 5 números y contar la cantidad de números pares
cont = 0;
for var in range(0,6):
num = int(input("Dime un número:"))
if num % 2 == 0:
cont = cont + 1
print("Has introducido ",cont," números pares.")
Acumuladores
Su funcionalidad consiste en acumular algún valor variable.
Se inicializa la variable acumuladora acu en 0 por ser el elemento neutro de la suma.
Esta inicialización se realiza una sola vez antes del ciclo. Posteriormente, en el rango del ciclo,
se incrementa con el valor de la variable que almacena el dato ingresado (acu=acu + x).
Ejemplo: Introducir 5 números y sumar los números pares
acu = 0;
for var in range(0,6):
x = int(input("Dime un número:"))
if num % 2 == 0:
acu = acu + x
print("La suma de los números pares es ",suma)
Bandera de control
Una bandera de control es un elemento cuya función es tomar un valor inicial bajo
ciertas condiciones y modificar ese valor, inmediatamente tales condiciones dejan de
observarse. Podría decirse que este elemento tiene dos utilidades:
Actúa como registro de algún acontecimiento de interés.
Actúa como variable de control para el ciclo condicionado. Este ciclo ejecuta su
rango si el valor de la bandera hace verdadera la condición del ciclo, es decir, si
pro = verdadero. Cuando se modifica el valor de la bandera de control, resulta
pro = falso y el ciclo deja de ejecutarse, evitando iteraciones no deseadas.
Ejemplo: Introducir 5 números e indicar si se ha introducido algún número par.
bandera = False;
for var in range(1,6):
num = int(input("Dime un número:"))
if num % 2 == 0:
bandera = True
if bandera == True:
print("Has introducido algún número par")
else:
print("No has introducido algún número par")