Cap 3

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 14

Capítulo 3

Interacción con Python

Hasta el momento, todos nuestros ejemplos han sido programas que no re-
quieren o solicitan información del usuario. Esto tiene la limitación que el pro-
grama es estático y siempre se va a comportar de la misma manera. Por ejemplo,
el programa multint.py siempre dará como resultado 6, y si queremos hacer
una multiplicación diferente, nos toca escribir un nuevo programa.

3.1. Entrada con el teclado


Para ampliar la capacidad de los programas de Python, el programa puede
solicitar información del usuario a través del teclado. Para esto, se le debe indicar
al usuario que información dar, como en el siguiente ejemplo:
usuario_info.py

# Código que solicita información del usuario


# y reporta los resultados

name = input("Cuál es su nombre? ")


txt = input(’Cuál es su altura (m)? ’)
alt = float(txt)
txt = input(’Cuánto pesa Ud. (kg)? ’)
weigh = float(txt)

print (’%s, Ud. mide %4.2f m y pesa %5.1f kg’


% (name,alt,weigh))

que en la terminal da como resultado

Cuál es su nombre? Germán


Cuál es su altura (m)? 1.82
20 Interacción con Python

Cuánto peso Ud. (kg)? 87


Germán, Ud. mide 1.82 m y pesa 87.0 kg

El comando input es el encargado de solicitar al usuario que debe digitar


una respuesta con el teclado. El programa no continúa a menos que el usuario
oprime Enter.
Para los valores solicitados de altura o peso, el comando

txt = input(’Cuál es su altura (m)? ’)

genera una variable txt con caracteres (una variable tipo string). La función
float(txt) convierte la variable txt en una variable real o float. Note que
si el usuario responde con letras o símbolos, el programa generará un error, es
decir se espera un número como respuesta.
Como se ve en el programa anterior, solicitar información del usuario es
bastante sencillo en Python. El siguiente programa muestra una variación al
programa multint.py de tal forma que los números a ser multiplicados sean
definidos por el usuario.

usuariomult.py

# Código para multiplicar dos números enteros,


# definidos por el usuario.

a = int(input("Digite un primer número entero: "))


b = int(input("Digite un segundo número entero: "))

c = a*b

print(a,"x",b," = ",c)

que tiene como resultado

Digite un primer número entero: 3


Digite un segundo número entero: 5
3 x 5 = 15

Este código tiene dos llamadas para pedirle al usuario que digite los números
a multiplicar. También es importante notar que al poner

a = int(input("Enter an integer: "))

se le pide al usuario un número entero, por lo que si el usuario digita un numero


real (2,2) o caracteres diferentes a números, el programa mostrará un error:
3.1 Entrada con el teclado 21

Digite un primer número entero: 2.2


-----------
ValueError
Traceback (most recent call last)
<ipython-input-8-7860f1ff099c> in <module>
3 # definidos por el usuario.
4
----> 5 a = int(input("Digite un primer número entero: "))
6 b = int(input("Digite un segundo número entero: "))
7

ValueError: invalid literal for int() with base 10: ’2.2’

donde la respuesta y explicación del error es bastante clara y muestra el


problema que se generó.
El programa anterior tiene una desventaja, el usuario se le solicita la pareja
de números uno a uno. Esta es una versión más corta, donde se le solicita
al usuario los dos números con una sola llamada. El usuario debe digitar los
números con un espacio entre ellos, no con coma (,), ni otro separador. Tampoco
puede digitar enter entre los números, pues esto generará un error.
usuariomult2.py

# Código para multiplicar dos números enteros,


# definidos por el usuario.
# Una sola solicitud para los dos números.
#

intxt = input("Digite dos números enteros: ")


a,b = intxt.split()
a = int(a)
b = int(b)

c = a*b

print(a,"x",b," = ",c)

con el programa generando el siguiente resultado

Digite dos números enteros: 2 3


2 x 3 = 6

El comando input permite digitar una serie de caracteres. Si éstos caracteres


están separados por espacios, se pueden asignar a múltiples variables con el
comando intxt.split(). Sin embargo, si el usuario digita tres números (en
22 Interacción con Python

vez de dos) se genera un error. Puede pensar en alguna alternativa para evitar
este error?

3.2. for y while loops, condicionales if


Los programas anteriores siguen mostrando limitaciones. Aunque el usuario
puede hacer la multiplicación, tiene que volver a correr el programa si quiere
cambiar los números. ¿Qué hacer si queremos hacer más de una operación?
Cómo hacer un programa que solicite continuamente al usuario por 2 núme-
ros hasta que el usuario quiera detenerse?
usuariomult3.py

# Código para multiplicar dos números enteros,


# definidos por el usuario.
# Operación se repite hasta que el usuario lo determine.
#

for i in range(1000):
intxt = input(’Digite dos enteros (ceros para parar) ’)
a,b = intxt.split()
a = int(a)
b = int(b)
if (a==0 and b==0):
break
c = a*b
print(a,"x",b," = ",c)

Digite dos números enteros (ceros para parar) 2 5


2 x 5 = 10
Digite dos números enteros (ceros para parar) 7 9
7 x 9 = 63
Digite dos números enteros (ceros para parar) 1 2
1 x 2 = 2
Digite dos números enteros (ceros para parar) 0 0

Este código puede no ser el mas óptimo, ya que en Python no se permite hacer
for loops de manera indefinida, por lo que hay que decirle que lo haga en un
rango definido (en este caso hasta 1000 veces). Esta es una manera muy clásica
de Fortran de hacer loops indefinidos, hasta que cierta condición se cumpla, y
el programa hace un break que ordena a salir del for loop. Note que el código
dentro del loop está indentado. Esto es una exigencia de Python.
El programa seguirá pidiendo al usuario los 2 números y imprimiendo el
resultado, hasta que el usuario lo detenga. Una forma poco elegante de parar un
3.2 for y while loops, condicionales if 23

programa es con CTRL+C, pero el programa solicita que si se quiere detener, los
dos valores deben ser ceros (0) y se detiene de manera limpia con el condicional:

if (a==0 and b==0):

El resultado de correr el programa se muestra arriba, para terminarlo

Digite dos números enteros (ceros para parar) 0 0

Operadores de relación en varios lenguajes

F77 F90 C MATLAB Python meaning

.eq. == == == == equals

.ne. /= != ~= != does not equal

.lt. < < < < less than

.le. <= <= <= <= less than or equal to

.gt. > > > > greater than

.ge. >= >= >= >= greater than or equal to

.and. .and. && & and and

.or. .or. || | or or

En Python el for loop procesa cada item dentro de una secuencia, asi que
puede ser usado en cualquier secuencia de datos de diferente tipo (arreglos,
strings, listas, tuples, etc.). La variable del loop (i en nuestro ejemplo) se le
asigna en cada iteración el valor correspondiente de la variable y el cuerpo
(indentado) dentro del loop es ejecutado. La forma general de un for loop en
Python es

for VARIABLE_LOOP in SECUENCIA:


Comandos a ejecutar

Note que los comandos tienen un encabezado (header) que termina con dos
puntos (:) y un cuerpo con una serie de comandos que se encuentran indentados.
La indentación puede ser uno, dos, o cualquier número de espacios, siempre de
igual cantidad a la derecha del encabezado.
En lenguajes modernos se tiene la opción de utilizar el comando while, en
lugar de un for loop. El while es un comando compuesto, que tiene un header
y un cuerpo, y tiene el siguiente formato general
24 Interacción con Python

while expresión_lógica:
Comandos a ejecutar

El while loop se ejecuta de manera continua siempre y cuando la expresión


lógica (booleana, de falso o verdadero) sea cierta. El programa anterior, se puede
escribir utilizando un while
usuariomult4.py

# Operación se repite con while loop.

a=None
b=None
while (a!=0 or b!=0):
intxt = input(’Digite dos enteros (ceros para parar) ’)
a,b = intxt.split()
a = int(a)
b = int(b)
c = a*b
print(a,"x",b," = ",c)

Digite dos enteros (ceros para parar) 2 5


2 x 5 = 10
Digite dos enteros (ceros para parar) 7 9
7 x 9 = 63
Digite dos enteros (ceros para parar) 1 2
1 x 2 = 2
Digite dos enteros (ceros para parar) 0 0
0 x 0 = 0

Note que para iniciar el while loop, es necesario tener definidos a y b, para
que el programa pueda realizar la verificación del condicional la primera vez.

3.2.1. Escoger entre for y while loops


Hay dos tipos de loops, y para el programar clásico, el for loop parece
más sencillo y lógico. Una buena guía para decidir cuál usar, es si Ud. sabe
de antemano el número de iteraciones que debe hacer. O si por ejemplo va a
hacer un loop sobre una lista o arreglo, donde el número total de elementos es
conocido. Por ejemplo, si quiere hacer un modelo y correrlo 100 veces, el for
loop es la mejor opción.
Pero si, por ejemplo, debe realizar una iteración de un cálculo hasta que una
condición se dé, y no se puede saber de antemano cuando esa condición se va a
cumplir, una mejor opción es el while loop.
3.3 Multiples condicionales if, elif, else 25

El primer caso se conoce como una iteración definida, mientras que el se-
gundo caso es conocida como iteración indefinida – no sabemos de antemano
cuantas iteraciones son requeridas.

3.3. Multiples condicionales if, elif, else


En el ejemplo anterior, una operación es llevada a cabo si una condición se
cumple. Una versión más versátil permite multiples condiciones con la siguiente
estructura

if (expresión_lógica):
(bloque de código)
elif (expresión_lógica):
(bloque de código)
elif (expresión_lógica):
(bloque de código)
...
else:
(bloque de código)

Cada bloque de código puede tener tantas líneas como sea requiera. Tantas
condiciones elif (else if) bloques como se requiera, y máximo un else. Cuando
una condición se cumple, ese bloque de código se ejecuta, sin seguir mirando las
otras condiciones posteriores. Es decir, el orden importa en este caso (Python no
revisa lo que sigue). El último else será ejecutado si ninguna condición anterior
es verdadera.
El siguiente programa muestra un ejemplo donde el usuario debe adivinar
un número entre 1 y 1000 y el programa le va informando en cada intento si
el número introducido por el usuario es mayor o menor que el número que se
busca. Adicionalmente se cuenta el número total de intentos del usuario.
adivine_entero.py

# Juego donde el usuario adivina un número

import numpy as np

# Genere un número aleatorio entre [1 y 1000)


number = np.random.randint(1,1000)

# Empiece el juego
guess = int(input(’Adivine un número del 1 al 999: ’))
guesses = 1

while guess != number:


26 Interacción con Python

if (guess>number):
print(guess," es muy alto")
elif(guess<number):
print(guess," es muy bajo")

guess = int(input("Adivine otra vez "))


# guesses += 1
guesses = guesses + 1

print("\nExcelente, adivinaste en ",guesses, ’ intentos’)

Un ejemplo al correr el programa

Adivine un número del 1 al 1000: 501


501 es muy alto
Adivine otra vez: 250
250 es muy alto
Adivine otra vez: 125
125 es muy alto
Adivine otra vez: 62
62 es muy bajo
Adivine otra vez: 90
90 es muy alto
Adivine otra vez: 75
75 es muy bajo
Adivine otra vez: 85
85 es muy bajo
Adivine otra vez: 88
88 es muy alto
Adivine otra vez: 87

Excelente, adivinaste en 9 intentos

El programa inicia con la generación de un número aleatorio a través de


numpy np.random.randint(1,1000). Después solicita un número al usuario y
a través de un while loop verifica si el número propuesto es igual al verdadero
(guess != number). Si no lo es, informa si el número es mayor o menor y vuelve
a solicitar al usuario otro número.
Acá otra demostración de un programa que le pide un número real y positivo
al usuario repetidamente. Si el número es negativo, repite la solicitud (ya que sólo
queremos números positivos). Si el número es positivo, calcula la raíz cuadrada
con la función sqrt de numpy. Si el usuario pone 0, el programa se termina.
3.4 Ejemplo: Máximo común divisor 27

usuarioraiz.py

# Solicite al usuario un número real y toma la raíz cuadrada.

import numpy as np

x = None
while (x!=0.0):
x = float(input("Digite un número real y positivo "))
if (x<0.0):
print("Número negativo")
continue
else:
y = np.sqrt(x)
print(’sqrt(’,x,’) = ’,y)

Digite un número real y positivo: 2.0


sqrt( 2.0 ) = 1.4142135623730951
Digite un número real y positivo: -1
Número es negativo
Digite un número real y positivo: 3.4
sqrt( 3.4 ) = 1.8439088914585775
Digite un número real y positivo: 0
sqrt( 0.0 ) = 0.0

El programa muestra el uso de un nuevo comando, continue, que le dice a


Python que vaya directamente a la siguiente iteración, es decir no va a imprimir
el resultado y. El comando break hace que el programa salga de un for loop
por completo. Puede escribir el mismo programa pero usando un for loop?

3.4. Ejemplo: Máximo común divisor


El máximo común divisor (o greatest common factor en inglés, GCF), de
dos ( o más) números enteros es el mayor número entero que los divide sin dejar
residuo. Pero, cómo se calcula?

Se empieza con dos números a y b.

El GCF puede tomar valores entre 1 y el menor de los números a y b.

La tarea es buscar entre todos los valores posibles, cuáles son un común
divisor, y cuál de estos es el mayor.

Empiece con el 1, que siempre será un común divisor.


28 Interacción con Python

Siga con el 2, 3, etc. Si alguno de estos números no genera residuo, guárdelo


como el GCF.
Continue hasta min(a,b).
Abajo un código para encontrar el GCF de dos números
gcf.py

a = None
b = None
while (a!=0 or b!=0):
txt = input(’Digite dos enteros (ceros para terminar) ’)
a,b = txt.split()
a = int(a)
b = int(b)

amin = min(a,b)
if (amin<1):
print(’Sólo se aceptan números > 0’)
break

mcd = 1
for j in range(2,amin+1):
if (a%j==0 and b%j==0):
mcd = j

print(’Máximo común divisor de’,a,’y’,b,’=’,mcd)

con resultados para varios números

Digite 2 enteros (ceros para parar) 3 2


Máximo común divisor = 1
Digite 2 enteros (ceros para parar) 7 21
Máximo común divisor = 7
Digite 2 enteros (ceros para parar) 9 24
Máximo común divisor = 3
Digite 2 enteros (ceros para parar) 923 1248
Máximo común divisor = 13
Digite 2 enteros (ceros para parar) 0 0

Este programa no es muy eficiente si los números investigados son muy gran-
des, pero funciona muy bien para números pequeños. Algunas cosas nuevas en
este programa:
min(a,b) calcula el mínimo entre a y b, usando funciones internas de Python. Tam-
bién existe la función max. Pueden tener más de dos argumentos de entra-
da.
3.4 Ejemplo: Máximo común divisor 29

a %i calcula el residuo de la división de los dos números (llamado el módulo).


Para nuestro caso, a %i = 0 si a is divisible por i. Si el valor es diferente
de cero, el valor obtenido es el residuo de dividir los dos números. Note
que el orden importa.

Abajo se muestran otras funciones internas de Python disponibles (lista par-


cial)
abs(a) absolute value
float(a) conversion to real
int(a) conversion to integer
round(a) nearest integer
pow (x,y) Return x to the power y
range(a,b,c) Secuencia desde a hasta b. c es el salto.
30 Interacción con Python

Problemas
3.1. Escriba un programa que imprima una lista de números del 2 al 20, y que
muestra si el número es divisible por 2, por 3, por ambos o por ninguno.
La salida en pantalla se puede ver algo así

Num Div por 2 y/o 3?


--- -----------------
2 por 2
3 por 3
4 por 2
5 ninguno
6 ambos
7 ninguno

3.2. Escriba un programa que repetidamente le pida al usuario tres valores


(reales) a, b, c, para la ecuación cuadrática
a ∗ x2 + b ∗ x + c = 0,
Usando la famosa formula para las raíces de este problema, el programa
debe reconocer si hay raíces reales y calcular estos valores. Como resultado,
muestre el número de raíces reales y sus valores. El programa debe parar
si todos los valores son 0.
3.3. Modifique el programa gfc.py para calcular el mínimo común múltiplo
(least common multiple en inglés) de dos números enteros.
3.4. Python incluye un modulo para la generación de números aleatorios (lla-
mado random). Abajo se muestra un ejemplo que imprime en pantalla 20
valores aleatorios entre 0 y 1.

rand_ej.py

# Generate a short list of random number between 0 and 1

import numpy as np

for i in range(20):
a = np.random.random()
print (a)

Escriba un programa simple de Python para generar 10000 números alea-


torios entre 0 y 1. Realice un test de que tan aleatorio es el generador de
números, contando el número de veces que el número cae dentro de 10
rangos distintos entre 0 y 1 (por ejemplo, 0 a 0.1, 0.1 a 0.2, etc.). Imprima
el número total de veces para cada rango en la pantalla. Este es un ejemplo
de cómo se puede ver la salida del programa:
3.4 Ejemplo: Máximo común divisor 31

0 1009
1 1048
2 1001
3 1038
4 1008
5 959
6 993
7 925
8 1017
9 1002

AYUDA: Cree un arreglo de números enteros (mire el modulo numpy) con


10 elementos e inicie con ceros. Para cada número aleatorio, sume una
unidad al rango apropiado y así poder adicionar todos los números.
NOTA: En C o Fortran cada vez que corra el programa, Ud. obtendrá
siempre la misma serie de números aleatorios. Esto no es muy buena idea,
pero el código para obtener series de números aleatorios distintas cada
vez que se corre el programa es complicado. Python fija la semilla del
número aleatorio (seed) con el reloj del computador, así que no debe ser
un problema.
3.5. La Tierra de manera general se divide en varias capas, corteza, manto y
núcleo (interno y externo). Si la Tierra tiene un radio de 6371 km, y lo
comparamos con un balón de Baloncesto (24.26 cm de diámetro): Ponga
en una tabla y compare
radio del núcleo interno
radio hasta el tope del núcleo externo
radio hasta el moho (límite manto-corteza)
Para todos los anteriores, determine su espesor.
La atmósfera (la parte más densa) tiene 16 km de espesor. Cuál es el
espesor en nuestro ejemplo?
Espesores en km para cada capa
Tcrust = 25
Tmantle = 2900
Tocore = 2250
Ticore = 1196
3.6. Calcule la presión P en el interior de la Tierra, a diferentes profundidades
h. Asuma presión hidrostática para la corteza, densidad del granito ρ, y
que g (acc gravedad) es constante.
P =g∗ρ∗h
32 Interacción con Python

También podría gustarte