while en Python
En ocasiones, tenemos que repetir varias veces una determinada tarea hasta conseguir nuestro objetivo. En Python esto se realiza con el comando while. A modo de ejemplo while en Python se usa así:
>>> vuelta=1
>>> while vuelta<10:
>>> print("Vuelta "+str(vuelta))
>>> vuelta=vuelta+1
Vuelta 1
Vuelta 2
Vuelta 3
Vuelta 4
Vuelta 5
Vuelta 6
Vuelta 7
Vuelta 8
Vuelta 9
Con los while, hay que tener la precaución de no realizar un «bucle infinito», que consiste en un bucle que nunca termina por un error en la programación. Een el caso anterior, esto ocurriría si no hubiéramos puesto la línea vuelta=vuelta+1.
for en Python
En ocasiones, tenemos que repetir varias veces una determinada tarea hasta conseguir nuestro objetivo. En Python esto se realiza con el comando for. A modo de ejemplo for en Python se usa así:
>>> for vuelta in range(1,10):
>>> print("Vuelta "+str(vuelta))
Vuelta 1
Vuelta 2
Vuelta 3
Vuelta 4
Vuelta 5
Vuelta 6
Vuelta 7
Vuelta 8
Vuelta 9
En el caso del for, no es posible realizar un bucle infinito.
Como se puede ver en el anterior ejemplo, range genera una secuencia de números desde 1 hasta 10.
for se puede utilizar con cualquier objeto con el que se pueda iterar (ir saltando de elemento en elemento), como verás en este ejemplo con una lista:
>>> coches = (‘Ferrari’, ‘Tesla’, ‘BMW’, ‘Audi’)
>>> for coche in coches:
>>> print(coche)
Ferrari
Tesla
BMW
Audi
Si lo combinas con la función enumerate, además irá dándole un número a cada elemento:
>>> coches = ('Ferrari', 'Tesla', 'BMW', 'Audi')
>>> for i, coche in enumerate(coches):
>>> print(str(i) + " - "+ coche)
0 - Ferrari
1 - Tesla
2 - BMW
3 - Audi
jose luis dice
en este ejemplo podríamos decir que genera 9 vueltas o ciclos?
jaime dice
Hola José Luis,
Efectivamente se dan 9 vueltas.
Quimbo dice
Si! O también llamadas Iteraciones.
carlos dice
for i in range(3-1,-1,-1):
print(I)
tengo una duda que hacen exactamente esos -1 despues de la coma
gracias
jaime dice
Hola Carlos,
El primer término es la resta de 3-1, por lo que equivale a:
range(2,-1,-1)
El segundo término es hasta donde tiene que contar, en este caso hasta -1.
El tercer término es el paso (de cuanto en cuanto queremos ir).
Juntando todo, queremos una lista de números que vaya desde 2 hasta -1, dando «pasitos» de -1.
range(2,-1,-1) devuelve:
[2, 1, 0]
Pablo Castillo dice
Pregunta rápida, la única forma de usar el comando for es con range(X,Y) o hay distintas formas de utilizar ese comando.
Gracias de antemano. ^^
jaime dice
Hola Pablo,
for admite cualquier elemento que sea «iterable», como por ejemplo una lista:
coches = (‘Ferrari’, ‘Tesla’, ‘BMW’, ‘Audi’)
for coche in coches:
print(coche)
Otra función que puede usarse y me parece mágica es la de ennumerate, que genera dos variables, una con el índice y otra con el valor de la lista:
for i, coche in enumerate(coches):
print(str(i) + » – «+ coche)
Voy a incluirlo en el artículo por si alguien más tiene la misma duda.
Pablo Castillo dice
Muchas gracias por tu respuesta, me parece genial que aún después de tanto tiempo sigas tomándote el tiempo de responder todas las dudas que puedan tener las personas que leyeron tu post.
jaime dice
Muchas gracias Pablo por tus palabras.
Desde que conocí Python (hace ya unos cuantos años), me ha parecido un lenguaje «mágico».
Creo que es un excelente lenguaje para aprender a programar, y me encanta ayudar a que otras personas también lo conozcan y descubran su potencial.
Francisco dice
Buenas,
Lo que no entiendo yo es en qué momento python sabe que coche son los elementos de la lista coches… no sé si me explico.
Muchas gracias por este magnífico tutorial, Jaime!
jaime dice
Hola Francisco,
coche es simplemente como quieres que python llame a cada elemento de la lista. Python realmente no sabe lo que es, podrías llamarla por ejemplo «gallina» y funcionaría igual:
for gallina in coches:
print(gallinad)
Gustavo Alejandro García dice
Como se podria generar una tupla de n elementos con un ciclo for, en el cual permita al usuario ir cargando los elementos??
barito dice
porque en el ejemplo no se imprime el numero 10?
que hacer para que también imprima el numero 10?
jaime dice
Hola barito,
en el ejemplo no se imprime el número 10 porque en el comando while hemos indicado que vaya sumando 1 siempre que el número sea menor que 10.
Si quieres imprimir el 10, bastaría por cambiar el while por cualquiera de estos dos:
1.- >>> while vuelta <= 10: 2.- >>> while vuelta < 11:
Jefferson dice
¿se pueden sumar los resultados de las vueltas o sea 1+2+3+..+9?
jaime dice
Hola Jefferson,
se puede sin más que incluir una variable que vaya llevando la cuenta:
>>> cnt=0
>>> for vuelta in range(1,10):
>>> ····print("Vuelta "+str(vuelta))
>>> ····cnt=cnt+vuelta
>>> print(cnt)
Vuelta 1
Vuelta 2
Vuelta 3
Vuelta 4
Vuelta 5
Vuelta 6
Vuelta 7
Vuelta 8
Vuelta 9
45
Nicolas dice
Hola, no se puede poner cnt +=vuelta???
jaime dice
Hola Nicolas,
efectivamente, también se puede hacer como propones.
Rebeca C dice
Hola
Me encantó como explicas todo!! se entiende muy bien.
Qué página recomiendas para ejercitar ciclo for, ciclo while, ruteo y listas?
Saludos
jaime dice
Muchas gracias Rebeca.
Si ya has instalado python, personalmente probaría a ejercitar directamente en jupyter.
Astrid Rodriguez dice
Necesito ayuda con un programa: Escribir un programa para contar el número de pares e impares presentes en una lista de números. Ejemplo
numeros= [1, 2, 3, 4, 5, 6, 7, 8, 9]
Salida:
Pares: 5
Impares : 4
Llevo rato dandole vuelta y no consigo hacerlo:(
jaime dice
Hola Astrid,
¿no estaremos resolviendo los ejercicios de programación de la Escuela Superior Politécnica del Litoral? Para aprender a programar es indispensable que cada uno internamente encuentre la solución.
Como pista, para saber si es par o impar puedes comprobar el resto que se obtiene al dividir cada número entre dos. Para contarlos tienes que crear dos variables distintas que vas incrementando cada vez que encuentres un número par o impar.
Melissa dice
buenas tardes.
estoy haciendo un programa que me dira si la contraseña es de menor de 6 o mayor de 12 sera incorrecta. el caso que es si entiendo o tengo la idea de como lo voy a plantear pero me gustaria preguntarte ¿como puedo utilizar mi variable (si es alfanumerica) para decir que hay menos o mas caracteres?.
contraseña = » usuario261743″
if contraseña < 12 : (segun yo aqui esta el error)
print ("la contraseña debe contener menos de 12 caracteres")
jaime dice
Hola Melissa,
para saber la longitud de un texto, tienes que usar el comando len.
if len(contrasena) > 12:
····print("la contraseña debe contener menos de 12 caracteres")
HilMa dice
como se haria entonces si quiero validar en la misma linea si es menos a 6 y mayor a 12?
jaime dice
Hola HilMa,
tienes que juntar ambas condiciones:
if len(contrasena)<6 and len(contrasena)>12:
····print "La contraseña debe contener entre 6 y 12 caracteres"
Aunque en la práctica nunca se va a dar el caso, ya que ningún número es a la vez menor de 6 y mayor de 12, por lo que supongo que te refieres a que sea mayor de 6 y menor de 12.
Nicolas dice
Hola, me podrias decir como se interpreta cuando antes de la palabra for, hay una palabra, es decir la instruccion del for inicia con una palabra antes, pero no se como interpretarlo, si esa palabra es una variable o que es
jaime dice
Hola Nicolás,
¿podrías escribir un ejemplo de a qué te refieres?
raul dice
hola tengo una consulta me sale este tipo de error cuando quiero imprimir :
>>> ss=0
>>> while ss >> … File «», line 2
print(«ss «+str(ss))
^
IndentationError: expected an indented block
>>> File «», line 1
ss = ss + 1
^
IndentationError: unexpected indent
jaime dice
Hola Raul,
como sabes python es muy crítico con los tabuladores (o espacios) para ordenar el código. En tu caso no estás respetando los tabuladores o espacios que estás introduciendo en el programa y por eso te da ese error.
Bryan dice
Por ejemplo, en el libro de Robert McCloskey Make Way for Ducklings (Dejad paso a los patitos), los nombres de los patitos son Jack, Kack, Lack, Mack, Nack, Ouack, Pack, y Quack. Este bucle saca esos nombres en orden:
prefijos = «JKLMNOPQ»
sufijo = «ack»
for letra in prefijos: print letra + sufijo
La salida del programa es:
Jack
Kack
Lack
Mack
Nack
Oack
Pack
Qack
Por supuesto, esto no es del todo correcto, porque “Ouack” y “Quack” no estan correctamente escritos.
Como ejercicio, modifique el programa para corregir este error.
Este es un ejercicio del libro que no pude resolver. Queria saber si podias ayudarme.
jaime dice
Hola Bryan,
el programa que has puesto funcionaría perfectamente. ¿Qué problema tienes con él?
Bryan dice
Corregir «O» en «Ou» para que tenga el nombre Ouack, y no «Oack» lo mismo en la letra «Q»
jaime dice
Podrías hacerlo definiendo una lista con los inicios que quieras:
prefijos = ['J','K','L', 'M', 'N', 'Ou', 'P', 'Qu']
Otra posibilidad es poner un if dentro del bucle para que te cambie el valor:
if (letra=='O') or (letra=='Q'): letra = letra + 'u'
Bryan dice
Muchas gracias… Aunque el primer consejo toma tambien en cuenta los «Tab» y las » , «.. Quiero decir que lo toma tambien en cuenta como una «Letra» como si hubieran mas.. por ej:
ack
,ack
El segundo consejo es mas completo.. Muchas gracias por tu ayuda..
jaime dice
Hola Bryan,
Es posible que haya un poco de confusión con el tipo de comillas y por eso no te funcionara el primer método.
Puedes echarle un vistazo aquí. (Tienes que darle a run cuando se abra la ventana).
Bryan dice
Ya lo hice! Gracias por ayudarme a resolverlo!. Feliz Noche.
Adrián dice
Hola quiero realizar un programa que realice con un excel hacer un separador es decir tengo lo siguiente en el excel:
267468;555|01;98|89;66
me gustaría hacer un bucle que se recorra 10 veces la primera parte porque son 10 valores de 6 dígitos y 5 la segunda porque son 5 valores de dos dígitos.
jaime dice
Hola Adrián,
al ser valores separados por punto y coma (;), lo suyo es partir la cadena (split()) con los punto y coma.
También puedes usar la biblioteca csv que es específica para importar este tipo de archivos.
Victor Hernandez dice
Hola, he creado mi primer Script o programa en Phtyon , es un generador de contraseñas, y me gustaria hacer que una vez se ejecute y te genere las contraseñas vuelva al principio del códgio. Dejo el código
#!/bin/python3
«Programa en Phyton generador de contraseñas»
«Hacemos que el programa selecione un caracter alatorio mediante el moidulo radom»
import random
print(»’ Generador de Contraseñas»’)
chars =’abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_!@£$%^&*().,?0123456789′
«Vamos a pedir al usuario que intorduzca el numero de Contaseñas»
number = input (‘Nú1mero de contraseñas?’)
number = int(number)
«Lo hacemos con la variable numero»
«Vamos a pedir que intorduzca una longitud de Contaseña, lo guarda en la variable lenght»
length = input(‘longitud de contraseña?’)
lenght = int(length)
«Ahora hacemos que el caracter selecionado lo gaurde en una variable llamda password»
password =»
for c in range(lenght):
password += random.choice(chars)
«Con la linea anterior nos va a mostrar una contraseña la logintud introducida por el usuario»
«Con el comando print lo imprime en pantalla»
print (»’ Su contraseña es»’)
print(password)
jaime dice
Hola Victor,
la manera de hacerlo es poner un «while True:» al principio del script.
De este modo se repite todo el rato el script.
rodolfo dice
Hola al hacer este ejemplo:
coches = (‘Ferrari’, ‘Tesla’, ‘BMW’, ‘Audi’)
for coche in coches:
print(coche)
en Jupyter 3.7 me sale este error:
File «», line 1
coches = (‘Ferrari’, ‘Tesla’, ‘BMW’, ‘Audi’)
^
SyntaxError: invalid character in identifier
que podra ser? Gracias de antemano
jaime dice
Hola Rodolfo,
el problema es que estás usando un acento en vez de una comilla. A veces pasa que Word, e incluso en páginas web se le dan formato a las comillas para que queden más «bonitas», pero no son compatibles con los lenguajes de programación.
Si cambias las comillas que estás usando por comilla recta (‘) o doble («), debería funcionarte.
Carlos Alberto dice
Hola Jaime, un placer leer tus clases y comentarios.
Mi consulta es la siguiente.
Estoy haciendo un monitoreo de red y necesito scanear 2 rangos de IP,
de 10.10.0.30 al 10.10.0.40 y del 10.10.0.230 al 10.10.0.240
e intente esto
for n in range (31, 41):#rango de switches
sw_ip=»10.10.0.{0}».format(n) # IP de switches sobre el que iteratua «n»
y aca el codigo que corresponde
Sin embargo necesito scanear el otro rango SIN usar otro for, intente
for n in range (30, 40) and (230, 240):
pero SOLo toma el segundo rango
si hago
for n in range (30, 40) or (230, 240):
toma solo el primer rango
es posible hacer que solo ejecute el codigo EN los dos rangos= sin pasar desde 41 hasta 240?
porque obviamente asi for n in range (30, 240) si funciona pero pierde intentos (estoy haciendo PING importando socket y os)
Gracias por tu tiempo y ayuda.
jaime dice
Hola Carlos,
es una pregunta muy interesante.
Hay varias formas de hacerlo. Una podría ser convertir los rangos en listas y luego juntarlos:
for n in (list(range(30, 41)) + list(range(230, 241))):
sw_ip="10.10.0.{0}".format(n)
Aunque otra más elegante sería aprovechar que los dos rangos tienen la misma longitud para generar las dos ips:
for n in range(30, 41):
sw_ip_1="10.10.0.{0}".format(n)
sw_ip_2="10.10.0.{0}".format(n+200)
Carlos Alberto dice
ahhhh, increible, estaba tan pasado que no podia verlo.
Te agradezco enormemnte la ayuda, lo estaba pensando del modo equivocado.
Esto me abre la cabeza para ampliar aun mas el mini proyecto de monitoreo,
Enorme abrazo!
Gracias
Daniel dice
Hola. Para iniciar un juego arroja un dado cada uno de los dos jugadores e inicia el que saque el numero mayor. El punto es cuando los dos sacan el mismo, deben volver a tirarlos hasta que uno sea mayor. No logro hacer ese bendito bucle (seguro es muy simple..). Desde ya agradecido.
J1 = input(«Jugador 1: «)
J2 = input(«Jugador 2: «)
print(«\nAmbos jugadores van a tirar el dado para ver quien empieza primero»)
sleep(2)
dad1 = randint(1, 6)
dad2 = randint(1, 6)
print(«\n», J1, «saco: «, dad1)
sleep(2)
print(«\n», J2, «saco: «, dad2)
sleep(2)
if dad1 > dad2:
print(«\n¡», J1, «comienza comienza el juego!»)
elif dad1 < dad2:
print("\n¡", J2, "comienza comienza el juego!")
else:
print("\nVuelvan a tirar los dados porque les salio el mismo numero")
jaime dice
Hola Daniel,
puedes usar dos aproximaciones:
– Hacer un bucle while permanente (while true ) que puedes romper con el comando break cuando los dos números no sean iguales.
– Hacer que dad1 y dad2 tengan el mismo valor, y luego poner un while dad1 == dad2. En el momento que dejen de ser iguales, el while no se repetirá.
Felipe Figueroa dice
Deseo hacer juegos en Python usando las li brerias de Pygame pero, de principio no logro que Python 9 logre vincular a Pygame. ¿Cuál sería la forma apropiarda para lograrlo? Gracias por la respuesta cuando me envies.
jaime dice
Hola Felipe,
lo primero sería instalar Pygame con pip o anaconda y luego importarlo en el script