Ficha 08 (2016) - Estructuras Repetitivas - Variantes (Python)
Ficha 08 (2016) - Estructuras Repetitivas - Variantes (Python)
Ficha 8
i = 1
while i <= 5:
n = int(input('Ingrese un número mayor a cero: '))
if n <= 0:
break
suma += n
i += 1
En el ejemplo anterior, el bloque de acciones del ciclo while carga por teclado un número n,
y chequea con un if si ese número es cero o negativo. En caso de serlo, se ejecuta la
instrucción break y su efecto es cancelativo con respecto al ciclo: el ciclo se interrumpe, y el
programa continúa con la ejecución del print() que se encuentra a la salida del ciclo.
Insistimos: se ejecuta el break y el ciclo se interrumpe, sin volver a la cabecera para
chequear la expresión lógica de control del ciclo, por lo que su valor es ignorado en ese caso.
Si el conjunto de números a procesar fuese {2, 4, 5, -2, 7, 1} este script cargaría los tres
primeros y los acumularía sin problemas con el ciclo, pero el ciclo se interrumpiría en el
cuarto (el -2) pues siendo negativo activaría la instrucción break. La salida de este programa
para esa secuencia de números de entrada, sería:
La suma de los números ingresados es: 11
if car == '.':
break
Si la cadena ingresada por teclado fuese ABCDabc34#.ABad este programa mostraría una
salida de la forma:
Ingrese una cadena: ABCDabc34#.ABad
Cantidad de minúsculas: 3
Cantidad de mayúsculas: 4
lo cual está de acuerdo con el objetivo: antes del punto hay cuatro letras mayúsculas y tres
minúsculas. También hay dos números y un caracter numeral, pero tanto los números como
el numeral son ignorados. Luego aparece el punto que da por terminado el ciclo for al
ejecutar la instrucción break. Y todo caracter que viniese después del punto, será ignorado
(sea letra o no) ya que el ciclo de iteración terminó.
De forma similar, pero a la inversa, un ciclo cualquiera puede incluir una instrucción continue
para forzar una repetición del ciclo sin terminar de ejecutar las instrucciones que queden por
debajo de la invocación a continue [1]. El siguiente ejemplo es una variante del que
mostramos antes para cargar números positivos con un while, pero haciendo ahora que el
ciclo fuerce la siguiente vuelta si el valor cargado fue cero o negativo (pero observe que
entonces en este caso, el script siempre pedirá los cinco números positivos, incluso si en el
medio se cargó alguno negativo o cero):
suma = 0
i = 1
while i <= 5:
n = int(input('Ingrese un número mayor a cero: '))
if n <= 0 :
continue
suma += n
i += 1
A diferencia de otros lenguajes, en Python un ciclo (for o while) puede llevar opcionalmente
una cláusula else en forma similar a una instrucción condicional, aunque el efecto de este
else en un ciclo es bastante diferente a lo que ocurre con una condición común:
El siguiente programa es una variante del que mostramos antes para contar letras. Muestra
el mismo ciclo for anterior, pero ahora con un else. Los resultados del conteo de letras se
mostrarán sólo si el ciclo logró procesar toda la cadena (lo cuál ocurrirá si la misma no tenía
un punto): esas visualizaciones ahora están en el bloque else del for, por lo que sólo se
ejecutarán si el ciclo cortó sin recurrir al break:
__author__ = 'Catedra de AED'
if car == '.':
break
else:
print('Resultados (la cadena no contenía un punto):')
print('Cantidad de minúsculas:', minusculas)
print('Cantidad de mayúsculas:', mayusculas)
print('Proceso terminado')
Por último, veamos que en ocasiones el programador necesita dejar vacío el bloque de
acciones de un ciclo o una rama de una condición y para casos así Python prevé el uso de la
instrucción pass. Esa instrucción sirve para indicar al intérprete que simplemente considere
vacío el bloque que la contiene:
# un ciclo que hace 10000 repeticiones sin bloque de acciones...
for i in range(10000):
pass
En el ejemplo anterior, el ciclo for efectivamente hace 10000 repeticiones, pero no ejecuta
ninguna acción adicional en cada una de ellas. El programa insumirá cierto tiempo en
terminar de ejecutar este ciclo, y luego continuará normalmente con las instrucciones que
sigan. Usar un ciclo con un elevado número de repeticiones pero con bloque de acciones
vacío suele ser un truco empleado para provocar un breve retardo o delay en la ejecución
del programa si el programador lo cree necesario.
La instrucción pass también puede usarse para dejar vacía una rama de una condición, como
se ve en los siguiente ejemplos:
# una condición con rama verdadera en blanco…
if n1 > n2:
pass
else:
print('El primero no es el mayor')
Problema 21.) Desarrollar un Programa Controlado por Menú de Opciones, que incluya opciones
para realizar las siguientes tareas:
1. Cargar un valor entero n por teclado, y obtener la suma de los enteros del 1 al n.
2. Cargar un valor entero n por teclado, y obtener su factorial.
3. Cargar por teclado los coeficientes a, b, y c de un polinomio de segundo grado, y obtener el
valor del polinomio en el punto x, siendo x un valor que también se carga por teclado.
Figura 1: Diagrama de flujo general sugerido para el programa controlado por menú de opciones.
Inicio
op = 1
op != 4
lista de
opciones
op
op == 1
proceso asociado
a la opción 1
op == 2
proceso asociado
a la opción 2
op == 3
proceso asociado
a la opción 3
Fin
Los procesos asociados a cada una de las opciones (salida verdadera de cada una de las
condiciones del diagrama) son directos, y los analizaremos desde su planteo en código
fuente, uno por uno. Pero en este momento, conviene introducir un pequeño detalle de
control: Tanto para el cálculo de la suma (en la opción 1) como en el factorial (opción 2), se
esperaría que el valor cargado por teclado para hacer el cálculo sea mayor o igual a 0. En
ninguno de ambos casos sería admisible un valor negativo, y para controlar que eso no
ocurra, podemos incluir un proceso de validación que realice la carga por teclado, pero
verificando que el número cargado no sea negativo, pidiéndolo nuevamente en caso de
serlo:
n = -1
while n < 0:
n = int(input('Ingrese n (no negativo, por favor): '))
if n < 0:
print('Error... se pidio no negativo... cargue de nuevo...')
Sin embargo, el proceso indicado demoraría lo que demore el ciclo for en terminar de
recorrer el range de control, y si bien eso puede parecer despreciable, el hecho es que para
un valor realmente grande de n la demora en el tiempo de ejecución comenzará a notarse...
incluso una computadora se las verá en problemas cuando deba ejecutar un proceso con
una enorme cantidad de pasos.
Es conveniente, para una buena formación a futuro, que el programador se acostumbre a
pensar todo el tiempo en soluciones mejores (en este caso, más rápidas)… incluso cuando
podría parecer que en el contexto del problema no vale la pena el esfuerzo. En este caso,
existe al menos una manera mucho más rápida de hacer el cálculo, recurriendo a una
fórmula directa para calcular esa suma. Puede demostrarse (por inducción matemática) [3]
que:
1 + 2 + 3 + 4 + … + (n-2) + (n-1) + n = n * (n+1) / 2
La versión original del proceso que hacía la suma con un ciclo tiene un tiempo de ejecución
que crece en forma directamente proporcional al valor de n. Pero la segunda versión se
ejecuta en tiempo constante: no importa cuál sea el valor de n, el tiempo insumido en el
cálculo es siempre el mismo.
El proceso a desarrollar para la opción 1 entonces podría quedar finalmente planteado así:
if opcion == 1:
n = -1
while n < 0:
n = int(input('Ingrese n (no negativo, por favor): '))
if n < 0:
print('Error... se pidio no negativo... cargue de nuevo...')
s = n * (n+1) // 2
print('Suma de los enteros del 1 al', n, ':', s)
Respecto del proceso para la opción 2, el planteo es muy similar al de la opción 1, pero ahora
se pide el factorial de n (y no la suma). El problema del factorial de n fue analizado y resuelto
en la Ficha 7, por lo que aquí simplemente reutilizaremos el proceso que propusimos en ese
momento, con un único pequeño ajuste: el range a recorrer para obtener los factores del
cálculo, está ajustado a range(2, n+1) en lugar de range(1, n+1)… ya que la multiplicación por
1 en realidad no aporta nada al producto final:
if opcion == 2:
n = -1
while n < 0:
n = int(input('Ingrese n (no negativo, por favor): '))
if n < 0:
print('Error... se pidio no negativo... cargue de nuevo...')
f = 1
for i in range(2, n+1):
f *= i
Mostramos a continuación (por fin…) el programa completo que incluye el ciclo del menú de
opciones:
__author__ = 'Catedra de AED'
op = 1
while op != 4:
# visualizacion de las opciones...
print('1. Suma de 1 al n')
print('2. Factorial de n')
print('3. Polinomio valuado en x')
print('4. Salir')
op = int(input('Ingrese el numero de la opcion elegida: '))
s = n * (n+1) // 2
print('Suma de los enteros del 1 al', n, ':', s)
elif op == 2:
# Calculo del factorial de n...
n = -1
while n < 0:
n = int(input('Ingrese n (>=0, por favor): '))
if n < 0:
print('Error... se pidio >=0... cargue de nuevo...')
f = 1
for i in range(2, n+1):
f *= i
elif op == 3:
# Calculo del valor de un polinomio...
a = float(input('a: '))
b = float(input('b: '))
c = float(input('c: '))
x = float(input('x: '))
p = a*pow(x, 2) + b*x + c
print('Valor de p(', x, '):', p)
Problema 22.) Un pequeño comercio de papelería cuenta con dos vendedores. Cada vendedor está
codificado con los números 1 y 2. Considere que la carga de datos se realizará desde teclado, de
forma que una entrada consta de 3 variables que representan una venta realizada: por cada venta,
cargar el código del vendedor (1 o 2) que hizo la venta, cantidad de artículos vendida en esa
operación, e importe de la venta. El fin de datos se indicará con código de vendedor igual a 0 (cero).
El dueño del comercio desea cierta información estadística y para ello solicita un programa que
obtenga lo siguiente:
a.) La cantidad de productos vendida por cada vendedor (dos totales).
b.) El importe total vendido por cada vendedor (otros dos totales).
c.) El importe de la menor venta realizada por el vendedor 2.
d.) El importe promedio de ventas por vendedor (importe total acumulado / 2).
Discusión y solución: Este problema muestra un típico caso en el que los datos de entrada se
presentan de alguna forma divididos en categorías diferentes: en este caso, se tienen ciertos
datos que pertenecen a las ventas realizadas por el vendedor 1, y ciertos otros datos que
describen ventas del vendedor 2. Para cada vendedor se pide calcular resultados
diferenciados, y eso lleva a tener que dividir el proceso a realizar en dos ramas (una por cada
vendedor). El programa completo es algo extenso, pero no demasiado complejo en sus
detalles:
La carga de datos, como es costumbre, se realiza con un ciclo, que en este caso será un while
implementando un esquema de carga por doble lectura, ya que se desconoce la cantidad de
ventas a procesar. Por cada venta, se tienen tres datos: el código del vendedor que la hizo
(variable codigo), la cantidad de productos vendidos (variable cantidad), y el importe de esa
venta (variable importe). El ciclo debe permitir que en cada vuelta se carguen esos tres
valores, y sabemos que debe detenerse si aparece un 0 en el código de vendedor. El
programa completo podría quedar así:
# acumuladores de cantidades...
c1 = c2 = 0
# acumuladores de importes...
i1 = i2 = 0
while codigo != 0:
cantidad = int(input('Cantidad vendida: '))
importe = float(input('Importe: '))
if codigo == 1:
c1 += cantidad
i1 += importe
elif codigo == 2:
c2 += cantidad
i2 += importe
El programa lanza un proceso de carga por doble lectura para el código del vendedor, que
sólo se detendrá cuando ese código de vendedor sea cero. Dentro del ciclo y al inicio del
bloque de acciones, se cargan los demás datos de esa venta (cantidad e importe). Note que
estas dos variables se cargan dentro del ciclo, una vez que nos hemos asegurado que el
código del vendedor no es cero: no tendría sentido cargar los tres datos juntos (antes del
ciclo o al final de su bloque) si el código del vendedor a cargar en ese momento fuese cero…
por no decir que en ese caso la carga inútil de la cantidad y el importe molestaría mucho al
usuario…
Note que para la carga del código de vendedor se está aplicando un proceso de validación
similar a los que hemos usado en modelos anteriores: se pide el código del vendedor por
teclado y se acepta ese código si se cargó correctamente, pero se vuelve a pedir si el número
ingresado no es un 0, un 1 o un 2: el cero es un valor válido para el código de vendedor, ya
que ese es justamente el valor a ingresar para detener el ciclo de carga en el programa
principal.
También dentro del ciclo de carga se usa una instrucción condicional anidada para saber cuál
de los vendedores hizo la venta, y en función de ello se acumulan las cantidades y los
importes en distintas variables de acumulación (c1 y c2 para las cantidades, además de i1 e
i2 para los importes). Esos cuatro acumuladores se definen antes del ciclo, inicializados en
cero.
Si el código de vendedor fue el 2 (segunda rama de las instrucciones condicionales anidadas)
se aplica el ya conocido proceso de determinación del mayor/menor que hemos analizado en
la Ficha 7, para ir quedándose con el menor de los importes que bajen por esa rama. Para
capturar al primero de esos importes, se usa una variable booleana llamada aviso, que
empieza con el valor False y quedará con ese valor hasta que se detecte la primera venta que
baje por la rama 2 (y en ese momento cambia a True).
Al terminar el ciclo, cuando los importes individuales ya se han cargado y acumulado
completamente, se calcula el importe promedio por vendedor. Un análisis más detallado
(que recomendamos…) se deja para el estudiante.
Problema 23.) Desarrollar un programa que implemente el conocido juego de manos llamado
"Piedra , Papel y Tijera". En este juego participan dos jugadores, uno contra el otro. Cada uno de
ellos, al mismo tiempo que el otro, debe mostrar con una de sus manos, alguna de las tres figuras
básicas llamadas Piedra (la mano cerrada), Papel (la mano abierta y extendida) o Tijera (los dedos de
la mano formando una V). Luego se comparan las figuras que cada uno mostró, y se determina el
ganador de acuerdo a la siguiente secuencia de reglas generales:
Piedra vence a Tijera (ya que Tijera se rompe si intenta cortar a Piedra)
Tijera vence a Papel (ya que Tijera corta a Papel)
Discusión y solución: El primer desafío en este tipo de programas es decidir la forma en que
será modelado el sistema de pantallas para que el programa informe al usuario sobre lo que
está ocurriendo y la forma de hacer las cargas de datos cuando el programa lo requiera (es
decir, se debe decidir el modelado de lo que se conoce como la Interfaz de Usuario del
programa o User Interface (UI) en inglés). En general, si la UI contendrá elementos visuales
de alto nivel, como ventanas, botones, gráficos, posibilidad de uso del mouse u otros
elementos de interacción, entonces se habla (en español) de la Interfaz Gráfica de Usuario
(IGU) o bien (en inglés) de la Graphic User Interface (GUI).
En nuestra versión del juego, supondremos que uno de los jugadores será el usuario
humano, y el segundo jugador será la computadora. Los estudiantes podrán luego dedicarse
a intentar modificar esta versión para incluir la posibilidad de partidas "humano-humano" o
"computadora-computadora". La idea entonces será la siguiente: cuando deba jugar el
humano, el programa deberá solicitar que cargue por teclado un número entero, cuyo valor
identificará a la figura que el humano quiere jugar (por ejemplo: 1 – Piedra, 2 – Papel, 3 –
Tijera). Los nombres de las tres figuras serán cadenas de caracteres en una tupla definida
como una variable descripcion de uso general:
descripcion = 'Piedra', 'Papel', 'Tijera'
En este esquema, la variable humano se usa para almacenar el valor cargado por el usuario,
que será un 1, un 2 o un 3. Luego de cargar ese valor, se muestra un mensaje informando
cuál fue efectivamente la figura elegida. Note que el número que cargó el usuario en la
variable humano, se usa como índice para entrar a la cadena que describe a la figura dentro
de la tupla descripcion, pero restando uno al valor (ya que en una tupla, los índices
1
Hemos citado en la Ficha 7 a la que quizás fue la primera película cuyo argumento se basaba en algún juego
de computadoras (WarGames [o Juegos de Guerra] de 1983). Y a partir de entonces, aparecieron muchas más.
En algunas, el argumento gira alrededor de personajes que usan juegos de computadoras y/o son expertos en
ellos (como Ender's Game [o El Juego de Ender] de 2013). Pero también aparecen cada vez más películas que
no tratan sobre juegos de computadoras, pero están inspiradas en algún juego muy conocido: Prince of Persia:
The Sands of Time (o El Príncipe de Persia: Las Arenas del Tiempo) de 2010; Battleship (o Batalla Naval) de
2012, Transformers (de 2007) y las tres secuelas posteriores de esta; y muchas, pero muchas más…
Una vez que se tiene cargada la jugada del usuario humano, debe jugar la computadora. La
elección de la figura será realizada en este caso en forma aleatoria mediante la función
random.randint() que hemos presentado en la Ficha anterior. El sencillo par de instrucciones
que sigue muestra el mecanismo:
computadora = random.randint(1, 3)
print('La computadora eligió:', descripcion[computadora - 1])
La variable computadora se usa para almacenar el número que representa a la figura elegida
en forma aleatoria. Ese número se obtiene con la invocación random.randint(1, 3) que
obtiene un número entero aleatorio en el intervalo [1, 3]. Igual que antes, se muestra luego
el nombre de la figura elegida, con la misma técnica usada en la elección del jugador
humano.
El paso siguiente es determinar si hubo un ganador, y en ese caso, cuál de los dos jugadores
ganó en esa jugada. Recordando que las variables humano y computadora contienen el
número de la figura elegida por cada jugador, el siguiente fragmento de código compara
esos números y determina el ganador:
if humano != computadora:
if (humano == 1 and computadora == 3) \
or (humano == 3 and computadora == 2) \
or (humano == 2 and computadora == 1):
ganador = 1
else:
ganador = -1
else:
ganador = 0
fuese cierta, significaría que el humano (1: Piedra) le ha ganado en esa jugada a la
computadora (3: Tijera). La condición evaluada es más extensa, ya que controla todas las
combinaciones posibles de valores entre las variables humano y computadora, pero la lógica
esencial es la misma que la que hemos descripto aquí. Confiamos en que los estudiantes
Note que en el planteo del código fuente la instrucción condicional completa aparece escrita
en tres líneas diferentes. Esto es así debido a que la instrucción completa es tan larga que no
cabe en una línea regular de 80 caracteres de ancho (que según las recomendaciones PEP 8
debería ser el límite a respetar en una línea de código fuente). Si el programador decide
partir una instrucción y seguir escribiendo la misma en la línea siguiente, se usa el separador
\ (barra invertida) para hacer ese corte, en la forma que se mostró [1] [4].
Una vez que el programa ha determinado si hubo un ganador en una jugada, lo que sigue es
llevar la cuenta del puntaje de cada jugador para poder al final determinar si hubo un
ganador de la partida completa (recuerde: se hacen tres jugadas, y se declara ganador al que
gane en dos o más de ellas). El script que sigue es el que lleva la cuenta:
if ganador == 1:
contar_ganadas = contar_ganadas + 1
elif ganador == -1:
contar_perdidas = contar_perdidas + 1
La idea general es simple: si la variable ganador quedó valiendo 1 entonces el ganador fue el
humano y debe sumársele un punto. Pero si ganador quedó valiendo -1, el ganador de la
jugada fue la computadora y el punto se debe sumar a ella. Las variables contar_ganadas y
contar_perdidas son contadores que se usan para sumar los puntos que el humano ganó y
perdió (respectivamente). Esas mismas variables permiten saber lo que ganó o perdió la
computadora, tomándolas en forma invertida (lo que ganó el humano lo perdió la
computadora, y lo que perdió el humano lo ganó la computadora: no es necesario usar dos
variables adicionales). Obviamente, asumimos que el valor inicial de ambas variables misma
es 0 (cosa que efectivamente haremos en el programa completo). Recuerde además, que la
expresión contar_ganadas = contar_ganadas + 1 es equivalente a contar_ganadas += 1.
El script anterior entonces, está usando dos contadores para llevar la cuenta de los puntos
ganados o perdidos por el humano. Es importante que se comprenda que si se va a usar un
contador en un programa, ese contador debe ser asignado con algún valor inicial válido
(normalmente el 0) para garantizar que el conteo comience desde donde debe hacerlo y no
desde un valor indefinido, o bien para garantizar que esa variable realmente exista antes de
comenzar a contar. En nuestro caso el valor inicial 0 de cada una se asigna (en principio) en
el programa completo, en el mismo lugar donde se define la variable descripción:
print('Bienvenido al juego de Piedra - Papel - Tijera')
Con todos estos procesos ya definidos, podemos controlar totalmente una jugada o ronda.
Pero el juego consta de tres rondas, con resultado al mejor de tres. La simulación de las tres
rondas (una luego de la otra), puede hacerse sin problema mediante un ciclo for que ejecute
tres iteraciones:
# Juega el humano...
humano = 0
while humano < 1 or humano > 3:
humano = int(input('Ingrese 1 - Piedra, 2 - Papel o 3 - Tijera: '))
if humano < 1 or humano > 3:
print('Error... se pidió entre 1 y 3... cargue de nuevo...')
print('Usted eligio:', descripcion[humano - 1])
# Juega la computadora...
computadora = random.randint(1, 3)
print('La computadora eligió:', descripcion[computadora - 1])
El proceso comienza definiendo las variables más generales (la tupla con la descripción de las
figuras, y los dos contadores). Luego se activa el ciclo for para repetir tres veces tres veces la
ejecución de una ronda completa (con lo que se logra entonces la simulación de las tres
rondas del juego) y antes de terminar simplemente controla si alguno de los dos jugadores
sumó al menos dos puntos, mostrando un mensaje con el resultado. Note que según el
enunciado, sólo hay un ganador si alguno de los jugadores hizo dos o más puntos: en casos
como que un jugador gane una ronda y se empate en las otras dos, el programa anunciará
que no hay ganador.
Para terminar, note que si el segmento de código anterior hace todo este trabajo, entonces
en el programa completo lo único que nos restaría por hacer es controlar el resultado final al
terminar el ciclo, e informar al ganador. Mostramos el programa completo a continuación:
import random
# Titulo general...
# Juega el humano...
humano = 0
while humano < 1 or humano > 3:
humano = int(input('Ingrese 1 - Piedra, 2 - Papel o 3 - Tijera: '))
if humano < 1 or humano > 3:
print('Error... se pidió entre 1 y 3... cargue de nuevo...')
print('Usted eligio:', descripcion[humano - 1])
# Juega la computadora...
computadora = random.randint(1, 3)
print('La computadora eligió:', descripcion[computadora - 1])
# cierre...
print('Fin del programa')
matemáticos. En general, se espera que el alumno sea capaz de leer, estudiar, dominar y aplicar
estos temas aún cuando los mismos no sean específicamente tratados en clase.
La función time.gmtime(t) retorna una colección de valores que representan la fecha dada
por la cantidad de segundos t tomada como parámetro. Si t = 0, entonces la fecha pedida
coincide con el momento epoch. El pequeño script anterior, mostrará la siguiente salida
(que aquí se muestra en dos líneas por razones de espacio) [1]:
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0,
tm_wday=3, tm_yday=1, tm_isdst=0)
De todos modos, y como veremos, no debe preocuparnos mucho cuál fue exactamente el
momento epoch. En la práctica, la técnica básica para medir el tiempo que demore en
ejecutarse un proceso consiste en invocar dos veces a time.clock(): la primera vez
inmediatamente antes de lanzar el proceso, y la segunda, inmediatamente después de
finalizado el mismo. El tiempo total de ejecución del proceso medido, será entonces igual a
la diferencia entre esos tiempos. Veamos un ejemplo muy simple:
import time
import time
n1, n2 = 20, 10
m = n1
else:
m = n2
t2 = time.clock()
La ejecución del programa produce una salida similar (en orden de magnitud) a la que
mostramos aquí:
Tiempo total: 8.210460372828794e-07
Se puede apreciar que ahora la cantidad de dígitos con valor 0 a la derecha del punto sigue
siendo 7, pero el primer decimal significativo vale ahora 8 (en lugar del 4 del ejemplo
anterior). Conclusión: en este caso puntual, la ejecución de un proceso completo que incluye
a una condición, le llevó a Python el doble de tiempo que ejecutar una instrucción simple que
asigne en una variable el resultado de una expresión aritmética. Esto era esperable: no es lo
mismo una sola instrucción simple, que una instrucción compuesta que incluye el chequeo
de una condición y luego una asignación.
Aún más amplio resulta considerar la función eval() de la librería estándar de Python [1]. En
su forma más simplificada, esta función toma como parámetro una cadena de caracteres
que exprese una instrucción válida en Python, analiza esa expresión, y si efectivamente es
válida la ejecuta y retorna el resultado de esa expresión. Ejemplo:
x = eval('3 + 4**2')
print('x:', x)
De esta forma, podemos plantear un script que tome una cadena cualquiera (asignada o
cargada por teclado) pero que represente una expresión válida en Python, y retorne el
tiempo de ejecución de la expresión:
import time
Luego pedirá que se cargue por teclado una expresión válida en Python. Si el usuario carga
una cadena cualquiera que efectivamente represente una expresión ejecutable en Python
(como puede ser la expresión lógica '3 >= 8') entonces el programa ejecutará esa expresión,
mostrará el resultado de la misma (False en este caso…) y luego el tiempo insumido en esa
ejecución:
Ingrese una expresión válida en Python: 3 >= 8
Resultado: False
Tiempo de ejecución: 7.389511409705563e-05
A medida que se avance en el curso serán analizadas otras posibles aplicaciones de las
técnicas presentadas aquí para medición del tiempo de ejecución de un proceso.
Créditos
El contenido general de esta Ficha de Estudio fue desarrollado por el Ing. Valerio Frittelli para ser
utilizada como material de consulta general en el cursado de la asignatura Algoritmos y Estructuras
de Datos – Carrera de Ingeniería en Sistemas de Información – UTN Córdoba, en el ciclo lectivo 2016.
Actuaron como revisores (indicando posibles errores, sugerencias de agregados de contenidos y
ejercicios, sugerencias de cambios de enfoque en alguna explicación, etc.) en general todos los
profesores de la citada asignatura como miembros de la Cátedra, y particularmente los ingenieros
Silvio Serra, Analía Guzmán, Cynthia Corso y Karina Ligorria, que realizaron aportes de contenidos,
propuestas de ejercicios y sus soluciones, sugerencias de estilo de programación, y planteo de
enunciados de problemas y actividades prácticas, entre otros elementos.
Bibliografía
[1] Python Software Foundation, "Python Documentation," 2016. [Online]. Available:
https://docs.python.org/3/. [Accessed 24 February 2016].
[4] M. Pilgrim, "Dive Into Python - Python from novice to pro," 2004. [Online]. Available:
http://www.diveintopython.net/toc/index.html. [Accessed 6 March 2016].
[5] M. A. Weiss, Estructuras de Datos en Java - Compatible con Java 2, Madrid: Addison Wesley,
2000.