Python
Python
3 Charles R. Severance
Créditos
Historial de impresión
Detalles de Copyright
Prólogo
Contents
v
vi CONTENTS
Chapter 1
1
2CHAPTER 1. ¿POR QUÉ DEBERÍAS APRENDER A ESCRIBIR PROGRAMAS?
Por ejemplo, mira los primeros tres párrafos de este capítulos y dime cuál es la
pal abra que más se repite, y cuántas veces se ha utilizado. Aunque seas capaz
de leer y comprender las palabras en pocos segundos, contarlas te resultará
casi doloroso, porque la mente humana no fue diseñada para resolver ese tipo
de problemas. Para una computadora es justo al revés, leer y comprender texto
de un trozo de papel le sería difícil, pero contar las palabras y decirte cuántas
veces se ha repetido la más utilizada le resulta muy sencillo:
python words.py
Enter file:words.txt
to 16
¡Elíge me!
me! ¡Elíge
¡Elíge me!
me!
Figure 1.2: Programadores Dirigiéndose a Ti
¿Qué hago a
Principal
continuación?
Secundaria
Dispositivos Entrada
Salida
Software
Red
Unidad
Central
Procesamiento
Memoria Memoria
• Actualmente, casi todos los equipos tienen una Conexión de Red para
recibir información dentro de una red. Podemos pensar en una red como
en un lugar donde almacenar y recuperar datos de forma muy lenta, que
puede no estar siempre “activo”. Así que, en cierto sentido, la red no es
más que un tipo de Memoria Secundaria más lenta y a veces poco fiable.
¿Qué hago a
continuación?
Unidad
Dispositivos Entrada Central
Salida
Software Procesamiento Red
Secundaria
Memoria Principal
Memoria
Las palabras reservadas en el lenguaje que utilizan los humanos para hablar
con Python son, entre otras, las siguientes:
print('¡Hola, mundo!')
>>> Vengo en son de paz, por favor llévame ante tu líder File
"<stdin>", line 1
Vengo en son de paz, por favor llévame ante tu líder
^
SyntaxError: invalid syntax
>>>
Esto tiene mejor aspecto, de modo que intentas comunicarte un poco más:
>>> print('Usted debe ser el dios legendario que viene del cielo') Usted debe
ser el dios legendario que viene del cielo
>>> print('Hemos estado esperándole durante mucho tiempo')
Hemos estado esperándole durante mucho tiempo
>>> print('La leyenda dice que debe estar usted muy rico con mostaza') La
leyenda dice que debe estar usted muy rico con mostaza >>> print 'Tendremos un
festín esta noche a menos que diga File "<stdin>", line 1
print 'Tendremos un festín esta noche a menos que diga
^
SyntaxError: Missing parentheses in call to 'print'
>>>
>>> adiós
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'adiós' is not defined
>>> if you don't mind, I need to leave
File "<stdin>", line 1
if you don't mind, I need to leave
^
SyntaxError: invalid syntax
>>> quit()
Te habrás fijado en que el error es diferente en cada uno de los dos primeros
intentos. El segundo error es diferente porque if es una palabra reservada, y
cuando Python la ve, cree que estamos intentando decirle algo, pero encuentra
la sintaxis de la frase incorrecta.
La forma correcta de decirle “adiós” a Python es introducir quit() en el símbolo
indicador del sistema >>>. Seguramente te hubiera llevado un buen rato
adivinarlo, así que tener este libro a mano probablemente te haya resultado útil.
001010001110100100101010000001111
11100110000011101010010101101101
...
El código máquina parece bastante sencillo a simple vista, dado que sólo
contiene ceros y unos, pero su sintaxis es incluso más compleja y mucho más
enrevesada que la de Python, razón por la cual muy pocos programadores
escriben en código máquina. En vez de eso, se han creado varios programas
traductores para permitir a los programadores escribir en lenguajes de alto nivel
como Python o Javascript,
1.6. TERMINOLOGÍA: INTÉRPRETE Y COMPILADOR 9
>>> x = 6
>>> print(x)
6
>>> y = x * 7
>>> print(y)
42
>>>
^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@\xa0\x82
^D^H4^@^@^@\x90^]^@^@^@^@^@^@4^@ ^@^G^@(^@$^@!^@^F^@
^@^@4^@^@^@4\x80^D^H4\x80^D^H\xe0^@^@^@\xe0^@^@^@^E
^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^T\x81^D^H^T\x81^D^H^S
^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A\^D^HQVhT\x83^D^H\xe8
....
C:\Python35\python.exe
bigcount = None
bigword = None
for word, count in list(counts.items()):
if bigcount is None or count > bigcount:
bigword = word
bigcount = count
print(bigword, bigcount)
# Código: https://es.py4e.com/code3/words.py
No necesitas ni siquiera saber Python para usar este programa. Tendrás que
llegar hasta el capítulo 10 de este libro para entender por completo las
impresionantes técnicas de Python que se han utilizado para crearlo. Ahora eres
el usuario final, sólo tienes que usar el programa y sorprenderte de sus
habilidades y de cómo te permite ahorrar un montón de esfuerzo. Tan sólo
tienes que escribir el código dentro de un fichero llamado words.py y ejecutarlo,
o puedes descargar el código fuente directamente desde
https://es.py4e.com/code3/ y ejecutarlo.
Este es un buen ejemplo de cómo Python y el lenguaje Python actúan como un
intermediario entre tú (el usuario final) y yo (el programador). Python es un
medio para que intercambiemos secuencias de instrucciones útiles (es decir,
programas) en un lenguaje común que puede ser usado por cualquiera que
instale Python en su computadora. Así que ninguno de nosotros está hablando
con Python, sino que estamos comunicándonos uno con el otro a través de
Python.
entrada Obtener datos del “mundo exterior”. Puede consistir en leer datos
desde un fichero, o incluso desde algún tipo de sensor, como un micrófono
o un GPS.
1.10. ¿QUÉ ES POSIBLE QUE VAYA MAL? 13
Parece demasiado simple para ser cierto, y por supuesto nunca es tan sencillo.
Es como si dijéramos que andar es simplemente “poner un pie delante del otro”.
El “arte” de escribir un programa es componer y entrelazar juntos esos
elementos básicos muchas veces hasta conseguir al final algo que resulte útil
para sus usuarios.
El programa para contar palabras que vimos antes utiliza al mismo tiempo todos
esos patrones excepto uno.
Errores de sintaxis (Syntax errors) Estos son los primeros errores que come
terás y también los más fáciles de solucionar. Un error de sintaxis significa
que has violado las reglas “gramaticales” de Python. Python hace todo lo
que puede para señalar el punto exacto, la línea y el carácter donde ha de
tectado el fallo. Lo único complicado de los errores de sintaxis es que a
veces el error que debe corregirse está en realidad en una línea anterior a
la cual Python detectó ese fallo. De modo que la línea y el carácter que
Python indica en un error de sintaxis pueden ser tan sólo un punto de
partida para tu investigación.
Errores lógicos Se produce un error lógico cuando un programa tiene una sin
taxis correcta, pero existe un error en el orden de las sentencias o en la
forma en que están relacionadas unas con otras. Un buen ejemplo de un
error lógico sería: “toma un trago de tu botella de agua, ponla en tu
mochila, camina hasta la biblioteca y luego vuelve a enroscar la tapa en la
botella.”
Errores semánticos Un error semántico ocurre cuando la descripción que has
brindado de los pasos a seguir es sintácticamente perfecta y está en el
orden correcto, pero sencillamente hay un error en el programa. El
programa es correcto, pero no hace lo que tú pretendías que hiciera. Un
ejemplo podría ser cuando le das indicaciones a alguien sobre cómo llegar
a un restaurante, y le dices “. . . cuando llegues a la intersección con la
gasolinera, gira a la izquierda, continúa durante otro kilómetro y el
restaurante es el edificio rojo que encontrarás a tu izquierda.”. Tu amigo se
retrasa y te llama para decirte que está en una granja dando vueltas
alrededor de un granero, sin rastro alguno de un restaurante. Entonces le
preguntas “¿giraste a la izquierda o la derecha?”, y te responde “Seguí tus
indicaciones al pie de la letra, di jiste que girara a la izquierda y continuar
un kilómetro desde la gasolinera.”, entonces le respondes “Lo siento
mucho, porque a pesar de que mis indica-
1.11. DEPURANDO LOS PROGRAMAS 15
leer Revisar tu código, leerlo de nuevo, y asegurarte de que ahí está expresado
de forma correcta lo que quieres decir.
ejecutar Prueba haciendo cambios y ejecutando diferentes versiones. Con
frecuen cia, si muestras en tu programa lo correcto en el lugar indicado, el
problema se vuelve obvio, pero en ocasiones debes invertir algo de tiempo
hasta con seguirlo.
pensar detenidamente ¡Toma tu tiempo para pensar!, ¿A qué tipo de error
corresponde: sintaxis, en tiempo de ejecución, semántico?, ¿Qué
información puedes obtener de los mensajes de error, o de la salida del
programa?, ¿Qué tipo de errores podría generar el problema que estás
abordando?, ¿Cuál fue el último cambio que hiciste, antes de que se
presentara el problema?
retroceder En algún momento, lo mejor que podrás hacer es dar marcha atrás,
deshacer los cambios recientes hasta obtener de nuevo un programa que
fun cione y puedas entender. Llegado a ese punto, podrás continuar con tu
trabajo.
Según vayas avanzando por el resto del libro, no te asustes si los conceptos no
parecen encajar bien unos con otros al principio. Cuando estabas aprendiendo
a hablar, no supuso un problema que durante los primeros años solo pudieras
emitir lindos balbuceos. Y también fue normal que te llevara seis meses pasar
de un vocabulario simple a frases simples, y que te llevara 5-6 años más pasar
de frases a párrafos, y que todavía tuvieran que transcurrir unos cuantos años
más hasta que fuiste capaz de escribir tu propia historia corta interesante.
Pretendemos que aprendas Python rápidamente, por lo que te enseñaremos
todo al mismo tiempo durante los próximos capítulos. Aún así, ten en cuenta
que el proceso es similar a aprender un idioma nuevo, que lleva un tiempo
absorber y comprender antes de que te resulte familiar. Eso produce cierta
confusión, puesto que revisaremos en distintas ocasiones determinados temas,
y trataremos que de esa manera puedas visualizar los pequeños fragmentos
que componen esta obra completa. A pesar de que el libro está escrito de forma
lineal, no dudes en ser no lineal en la forma en que abordes las materias.
Avanza y retrocede, y lee a veces por encima. Al ojear material más avanzado
sin comprender del todo los detalles, tendrás una mejor comprensión del “¿por
qué?” de la programación. Al revisar el material anterior e incluso al realizar
nuevamente los ejercicios previos, te darás cuenta que ya has aprendido un
montón de cosas, incluso si el tema que estás examinando en ese momento
parece un poco difícil de abordar.
1.14 Ejercicios
Ejercicio 6: ¿En qué lugar del computador queda almacenada una variable,
como en este caso “X”, después de ejecutar la siguiente línea de Python?:
x = 123
x = 43
x=x+1
print(x)
a) 43
b) 44
c) x + 1
d) Error, porque x = x + 1 no es posible matemáticamente.
Ejercicio 8: Explica cada uno de los siguientes conceptos usando un ejemplo de
una capacidad humana: (1) Unidad central de procesamiento, (2) Memoria prin
cipal, (3) Memoria secundaria, (4) Dispositivos de entrada, y (5) Dispositivos de
salida. Por ejemplo, “¿Cuál sería el equivalente humano de la Unidad central de
procesamiento?”.
Ejercicio 9: ¿Cómo puedes corregir un “Error de sintaxis”?.
Chapter 2
Variables, expresiones y
sentencias
python
>>> print(4)
4
Not surprisingly, strings belong to the type str and integers belong to the type int.
Less obviously, numbers with a decimal point belong to a type called float,
because these numbers are represented in a format called floating point.
>>> type(3.2)
<class 'float'>
19
20 CHAPTER 2. VARIABLES, EXPRESIONES Y SENTENCIAS
¿Qué ocurre con valores como “17” y “3.2”? Parecen números, pero van entre
comillas como las cadenas.
>>> type('17')
<class 'str'>
>>> type('3.2')
<class 'str'>
Son cadenas.
Cuando escribes un entero grande, puede que te sientas tentado a usar comas
o puntos para separarlo en grupos de tres dígitos, como en 1,000,000 1. Eso no
es un entero válido en Python, pero en cambio sí que resulta válido algo como:
>>> print(1,000,000)
100
2.2 Variables
Una de las características más potentes de un lenguaje de programación es la
capacidad de manipular variables. Una variable es un nombre que se refiere a
un valor.
Una sentencia de asignación crea variables nuevas y las da valores:
Este ejemplo hace tres asignaciones. La primera asigna una cadena a una
variable nueva llamada mensaje; la segunda asigna el entero 17 a n; la tercera
asigna el valor (aproximado) de π a pi.
Para mostrar el valor de una variable, se puede usar la sentencia print:
>>> print(n)
17
>>> print(pi)
3.141592653589793
>>> type(mensaje)
<class 'str'>
>>> type(n)
<class 'int'>
>>> type(pi)
<class 'float'>
Puede que quieras tener esta lista a mano. Si el intérprete se queja por el
nombre de una de tus variables y no sabes por qué, comprueba si ese nombre
está en esta lista.
22 CHAPTER 2. VARIABLES, EXPRESIONES Y SENTENCIAS 2.4
Sentencias
print(1)
x=2
print(x)
produce la salida
1
2
20+32
hour-1
hour*60+minute
minute/60
5**2
(5+9)*(15-7)
>>> minute = 59
>>> minute/60
0.9833333333333333
2.6. EXPRESIONES 23
>>> minute = 59
>>> minute/60
0
Para obtener la misma respuesta en Python 3.0 use división dividida (// integer).
>>> minute = 59
>>> minute//60
0
2.6 Expresiones
>>> 1 + 1
2
Sin embargo, en un script, ¡una expresión por si misma no hace nada! Esto a
menudo puede producir confusión entre los principiantes.
5
x=5
x+1
24 CHAPTER 2. VARIABLES, EXPRESIONES Y SENTENCIAS 2.7 Orden
de las operaciones
>>> quotient = 7 // 3
>>> print(quotient)
2
>>> remainder = 7 % 3
>>> print(remainder)
1
cadenas
El operador + funciona con las cadenas, pero no realiza una suma en el sentido
matemático. En vez de eso, realiza una concatenación, que quiere decir que
une ambas cadenas, enlazando el final de la primera con el principio de la
segunda. Por ejemplo:
>>> primero = 10
>>> segundo = 15
>>> print(primero+segundo)
25
>>> primero = '100'
>>> segundo = '150'
>>> print(primero + segundo)
100150
>>> prompt = '¿Cual es la velocidad de vuelo de una golondrina sin carga?\n' >>>
velocidad = input(prompt)
¿Cual es la velocidad de vuelo de una golondrina sin carga? 17
>>> int(velocidad)
17
>>> int(velocidad) + 5
22
Pero si el usuario escribe algo que no sea una cadena de dígitos, obtendrás un error:
En este caso, el comentario aparece como una línea completa. Pero también
puedes poner comentarios al final de una línea
asigna 5 a v
horas = 35.0
tarifa = 12.50
salario = horas * tarifa
print(salario)
x1q3z9ahd = 35.0
x1q3z9afd = 12.50
x1q3p9afd = x1q3z9ahd * x1q3z9afd
print(x1q3p9afd)
¿Qué ocurre aquí? ¿Cuáles de las piezas (for, word, in, etc.) son palabras reser
vadas y cuáles son simplemente nombres de variables? ¿Acaso Python
comprende de un modo básico la noción de palabras (words)? Los
programadores novatos tienen problemas separando qué parte del código debe
mantenerse tal como está en este ejemplo y qué partes son simplemente
elección del programador.
El código siguiente es equivalente al de arriba:
Para los principiantes es más fácil estudiar este código y saber qué partes son
palabras reservadas definidas por Python y qué partes son simplemente
nombres de variables elegidas por el programador. Está bastante claro que
Python no entiende nada de pizza ni de porciones, ni del hecho de que una
pizza consiste en un conjunto de una o más porciones.
Pero si nuestro programa lo que realmente va a hacer es leer datos y buscar
palabras en ellos, pizza y porción son nombres muy poco mnemónicos.
Elegirlos como nombres de variables distrae del propósito real del programa.
Dentro de muy poco tiempo, conocerás las palabras reservadas más comunes,
y empezarás a ver cómo esas palabras reservadas resaltan sobre las demás:
Las partes del código que están definidas por Python (for, in, print, y :) están en
negrita, mientras que las variables elegidas por el programador (word y words)
no lo están. Muchos editores de texto son conscientes de la sintaxis de Python y
colorearán las palabras reservadas de forma diferente para darte pistas que te
permitan mantener tus variables y las palabras reservadas separados. Dentro
de poco empezarás a leer Python y podrás determinar rápidamente qué es una
variable y qué es una palabra reservada.
3
El párrafo anterior se refiere más bien a quienes eligen nombres de variables en inglés, ya que
todas las palabras reservadas de Python coinciden con palabras propias de ese idioma (Nota del
trad.)
2.13. DEPURACIÓN 29 2.13 Depuración
En este punto, el error de sintaxis que es más probable que cometas será
intentar utilizar nombres de variables no válidos, como class y yield, que son
palabras clave, o odd~job y US$, que contienen caracteres no válidos.
Si pones un espacio en un nombre de variable, Python cree que se trata de dos
operandos sin ningún operador:
>>> month = 09
File "<stdin>", line 1
month = 09
^
SyntaxError: invalid token
Los nombres de las variables son sensibles a mayúsculas, así que LaTeX no es
lo mismo que latex.
En este punto, la causa más probable de un error semántico es el orden de las
operaciones. Por ejemplo, para evaluar 12π, puedes sentirte tentado a escribir
Pero la división se evalúa antes, ¡así que obtendrás π/2, que no es lo mismo!
No hay forma de que Python sepa qué es lo que querías escribir exactamente,
así que en este caso no obtienes un mensaje de error; simplemente obtienes
una respuesta incorrecta.
2.14 Glosario
asignación Una sentencia que asigna un valor a una variable.
30 CHAPTER 2. VARIABLES, EXPRESIONES Y SENTENCIAS cadena Un tipo
división entera La operación que divide dos números y trunca la parte frac
cionaria.
palabra clave Una palabra reservada que es usada por el compilador para
analizar un programa; no se pueden usar palabres clave como if, def, y
while como nombres de variables.
sentencia Una sección del código que representa un comando o acción. Hasta
ahora, las únicas sentencias que hemos visto son asignaciones y
sentencias print.
tipo Una categoría de valores. Los tipos que hemos visto hasta ahora son
enteros (tipo int), números en punto flotante (tipo float), y cadenas (tipo str).
valor Una de las unidades básicas de datos, como un número o una cadena,
que un programa manipula.
2.15 Ejercicios
Ejercicio 2: Escribe un programa que use input para pedirle al usuario su
nombre y luego darle la bienvenida.
Introduzca tu nombre: Chuck
Hola, Chuck
Introduzca Horas: 35
Introduzca Tarifa: 2.75
Salario: 96.25
ancho = 17
alto = 12.0
1. ancho/2
2. ancho/2.0
3. alto/3
4. 1 + 2 * 5
Chapter 3
Ejecución condicional
>>> 5 == 5
True
>>> 5 == 6
False
True y False son valores especiales que pertenecen al tipo bool (booleano); no
son cadenas:
>>> type(True)
<class 'bool'>
>>> type(False)
<class 'bool'>
x != y # x es distinto de y
x > y # x es mayor que y
x < y # x es menor que y
x >= y # x es mayor o igual que y
x <= y # x es menor o igual que y
x is y # x es lo mismo que y
x is not y # x no es lo mismo que y
33
34 CHAPTER 3. EJECUCIÓN CONDICIONAL 3.2 Operadores
lógicos
Existen tres operadores lógicos: and (y), or (o), y not (no). El significado
semántico de estas operaciones es similar a su significado en inglés. Por
ejemplo,
x > 0 and x < 10
es verdadero sólo cuando x es mayor que 0 y menor que 10.
n%2 == 0 or n%3 == 0 es verdadero si cualquiera de las condiciones es
verdadera, es decir, si el número es divisible por 2 o por 3.
Finalmente, el operador not niega una expresión booleana, de modo que not (x
> y) es verdadero si x > y es falso; es decir, si x es menor o igual que y.
Estrictamente hablando, los operandos de los operadores lógicos deberían ser
ex presiones booleanas, pero Python no es muy estricto. Cualquier número
distinto de cero se interpreta como “verdadero.”
>>> 17 and True
True
Esta flexibilidad puede ser útil, pero existen ciertas sutilezas en ese tipo de uso
que pueden resultar confusas. Es posible que prefieras evitar usarlo de este
modo hasta que estés bien seguro de lo que estás haciendo.
if x > 0 :
print('x es positivo')
sí
x>0
print(‘x es positivo’)
if x < 0 :
pass # ¡necesito gestionar los valores negativos!
>>> x = 3
>>> if x < 10:
... print('Pequeño')
...
Pequeño
>>>
>>> x = 3
>>> if x < 10:
... print('Pequeño')
... print('Hecho')
File "<stdin>", line 3
print('Hecho')
^
SyntaxError: invalid syntax
alternativa
if x%2 == 0 :
print('x es par')
else :
print('x es impar')
x%2 == 0
no
if x < y:
print('x es menor que y')
elif x > y:
print('x es mayor que y')
else:
print('x e y son iguales')
elif es una abreviatura para “else if”. En este caso también será ejecutada única
mente una de las ramas.
No hay un límite para el número de sentencias elif. Si hay una clausula else,
debe ir al final, pero tampoco es obligatorio que ésta exista.
3.6. CONDICIONALES ANIDADOS 37
sí
x<y print(‘menor’)
sí
print(‘igual’)
Figure 3.3: If-Then-ElseIf Logic
if choice == 'a':
print('Respuesta incorrecta')
elif choice == 'b':
print('Respuesta correcta')
elif choice == 'c':
print('Casi, pero no es correcto')
if x == y:
print('x e y son iguales')
else:
if x < y:
print('x es menor que y')
else:
print('x es mayor que y')
x<y
No
print(‘menor’)
print(‘mayor’)
Figure 3.4: Nested If Statements
if 0 < x:
if x < 10:
print('x es un número positivo con un sólo dígito.')
python fahren.py
Introduzca la Temperatura Fahrenheit:72
22.2222222222
python fahren.py
Introduzca la Temperatura Fahrenheit:fred
Traceback (most recent call last):
File "fahren.py", line 2, in <module>
fahr = float(ent)
ValueError: invalid literal for float(): fred
# Código: https://es.py4e.com/code3/fahren2.py
python fahren2.py
Introduzca la Temperatura Fahrenheit:72
22.2222222222
python fahren2.py
Introduzca la Temperatura Fahrenheit:fred
Por favor, introduzca un número
Gestionar una excepción con una sentencia try recibe el nombre de capturar
una excepción. En este ejemplo, la clausula except muestra un mensaje de
error. En general, capturar una excepción te da la oportunidad de corregir el
problema, volverlo a intentar o, al menos, terminar el programa con elegancia.
>>> x = 6
>>> y = 2
>>> x >= 2 and (x/y) > 2
True
>>> x = 1
>>> y = 0
>>> x >= 2 and (x/y) > 2
False
>>> x = 6
>>> y = 0
>>> x >= 2 and (x/y) > 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>
La tercera operación ha fallado porque Python intentó evaluar (x/y) e y era cero,
lo cual provoca un runtime error (error en tiempo de ejecución). Pero el segundo
3.9. DEPURACIÓN 41
>>> x = 1
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x = 6
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x >= 2 and (x/y) > 2 and y != 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>
3.9 Depuración
Los “traceback” que Python muestra cuando se produce un error contienen un
montón de información, pero pueden resultar abrumadores. Las partes más
útiles normalmente son:
>>> x = 5
>>> y = 6
File "<stdin>", line 1
y=6
^
IndentationError: unexpected indent
42 CHAPTER 3. EJECUCIÓN CONDICIONAL
import math
int_senal = 9
int_ruido = 10
relacion = int_senal / int_ruido
decibelios = 10 * math.log10(relacion)
print(decibelios)
# Código: https://es.py4e.com/code3/snr.py
3.10 Glosario
condición La expresión booleana en una sentencia condicional que determina
qué rama será ejecutada.
3
En Python 3.0, ya no se produce el mensaje de error; el operador de división realiza división en
punto flotante incluso con operandos enteros.
3.11. EJERCICIOS 43
traceback Una lista de las funciones que se están ejecutando, que se muestra
en pantalla cuando se produce una excepción.
3.11 Ejercicios
Ejercicio 1: Reescribe el programa del cálculo del salario para darle al empleado
1.5 veces la tarifa horaria para todas las horas trabajadas que excedan de 40.
Ejercicio 2: Reescribe el programa del salario usando try y except, de modo que
el programa sea capaz de gestionar entradas no numéricas con elegancia,
mostrando un mensaje y saliendo del programa. A continuación se muestran
dos ejecuciones del programa:
Ejercicio 3: Escribe un programa que solicite una puntuación entre 0.0 y 1.0. Si
la puntuación está fuera de ese rango, muestra un mensaje de error. Si la
puntuación está entre 0.0 y 1.0, muestra la calificación usando la tabla
siguiente:
Puntuación Calificación
>= 0.9 Sobresaliente
>= 0.8 Notable
>= 0.7 Bien
>= 0.6 Suficiente
< 0.6 Insuficiente
Chapter 4
Funciones
45
46 CHAPTER 4. FUNCIONES
La función max nos dice cuál es el “carácter más grande” de la cadena (que
resulta ser la letra “u”), mientras que la función min nos muestra el carácter más
pequeño (que en ese caso es un espacio).
Otra función interna muy común es len, que nos dice cuántos elementos hay en
su argumento. Si el argumento de len es una cadena, nos devuelve el número
de caracteres que hay en la cadena.
>>> int('32')
32
>>> int('Hola')
ValueError: invalid literal for int() with base 10: 'Hola'
int puede convertir valores en punto flotante a enteros, pero no los redondea;
simplemente corta y descarta la parte decimal:
>>> int(3.99999)
3
>>> int(-2.3)
-2
>>> float(32)
32.0
>>> float('3.14159')
3.14159
>>> str(32)
'32'
>>> str(3.14159)
'3.14159'
4.4. FUNCIONES MATEMÁTICAS 47 4.4 Funciones
matemáticas
>>> print(math)
<module 'math' (built-in)>
>>> grados = 45
>>> radianes = grados / 360.0 * 2 * math.pi
>>> math.sin(radianes)
0.7071067811865476
for i in range(10):
x = random.random()
print(x)
0.11132867921152356
0.5950949227890241
0.04820265884996877
0.841003109276478
0.997914947094958
0.04842330803368111
0.7416295948208405
0.510535245390327
0.27447040171978143
0.028511805472785867
>>> t = [1, 2, 3]
>>> random.choice(t)
2
>>> random.choice(t)
3
Hasta ahora, sólo hemos estado usando las funciones que vienen incorporadas
en Python, pero es posible añadir también funciones nuevas. Una definición de
fun ción especifica el nombre de una función nueva y la secuencia de
sentencias que se ejecutan cuando esa función es llamada. Una vez definida
una función, se puede reutilizar una y otra vez a lo largo de todo el programa.
He aquí un ejemplo:
def muestra_estribillo():
print('Soy un leñador, qué alegría.')
print('Duermo toda la noche y trabajo todo el día.')
def es una palabra clave que indica que se trata de una definición de función. El
nombre de la función es muestra_estribillo. Las reglas para los nombres de las
funciones son los mismos que para las variables: se pueden usar letras,
números y algunos signos de puntuación, pero el primer carácter no puede ser
un número. No se puede usar una palabra clave como nombre de una función, y
se debería evitar también tener una variable y una función con el mismo
nombre.
Los paréntesis vacíos después del nombre indican que esta función no toma
ningún argumento. Más tarde construiremos funciones que reciban argumentos
de entrada.
La primera línea de la definición de la función es llamada la cabecera; el resto
se llama el cuerpo. La cabecera debe terminar con dos-puntos (:), y el cuerpo
debe ir indentado. Por convención, el indentado es siempre de cuatro espacios.
El cuerpo puede contener cualquier número de sentencias.
Las cadenas en la sentencia print están encerradas entre comillas. Da igual uti
lizar comillas simples que dobles; la mayoría de la gente prefiere comillas
simples, excepto en aquellos casos en los que una comilla simple (que también
se usa como apostrofe) aparece en medio de la cadena.
Si escribes una definición de función en modo interactivo, el intérprete mostrará
puntos suspensivos (. . .) para informarte de que la definición no está completa:
50 CHAPTER 4. FUNCIONES
Para finalizar la función, debes introducir una línea vacía (esto no es necesario
en un script).
Al definir una función se crea una variable con el mismo nombre.
>>> print(muestra_estribillo)
<function muestra_estribillo at 0xb7e99e9c>
>>> print(type(muestra_estribillo))
<type 'function'>
Una vez que se ha definido una función, puede usarse dentro de otra. Por ejem
plo, para repetir el estribillo anterior, podríamos escribir una función llamada
repite_estribillo:
def repite_estribillo():
muestra_estribillo()
muestra_estribillo()
>>> repite_estribillo()
Soy un leñador, qué alegría.
Duermo toda la noche y trabajo todo el día.
Soy un leñador, qué alegría.
Duermo toda la noche y trabajo todo el día.
def muestra_estribillo():
print('Soy un leñador, que alegría.')
print('Duermo toda la noche y trabajo todo el día.')
def repite_estribillo():
muestra_estribillo()
muestra_estribillo()
repite_estribillo()
# Código: https://es.py4e.com/code3/lyrics.py
Para asegurarnos de que una función está definida antes de usarla por primera
vez, es necesario saber el orden en que las sentencias son ejecutadas, que es
lo que llamamos el flujo de ejecución.
La ejecución siempre comienza en la primera sentencia del programa. Las
senten cias son ejecutadas una por una, en orden de arriba hacia abajo.
Las definiciones de funciones no alteran el flujo de la ejecución del programa,
pero recuerda que las sentencias dentro de una función no son ejecutadas
hasta que se llama a esa función.
Una llamada a una función es como un desvío en el flujo de la ejecución. En vez
de pasar a la siguiente sentencia, el flujo salta al cuerpo de la función, ejecuta
todas las sentencias que hay allí, y después vuelve al punto donde lo dejó.
Todo esto parece bastante sencillo, hasta que uno recuerda que una función
puede llamar a otra. Cuando está en mitad de una función, el programa puede
tener que ejecutar las sentencias de otra función. Pero cuando está ejecutando
esa nueva función, ¡tal vez haya que ejecutar todavía más funciones!
52 CHAPTER 4. FUNCIONES
>>> muestra_dos_veces('Spam')
Spam
Spam
>>> muestra_dos_veces(17)
17
17
>>> muestra_dos_veces(math.pi)
3.14159265359
3.14159265359
El argumento es evaluado antes de que la función sea llamada, así que en los
ejemplos, la expresión Spam *4 y math.cos(math.pi) son evaluadas sólo una
vez.
También se puede usar una variable como argumento:
x = math.cos(radians)
aurea = (math.sqrt(5) + 1) / 2
>>> math.sqrt(5)
2.23606797749979
math.sqrt(5)
>>> print(type(None))
<class 'NoneType'>
x = sumados(3, 5)
print(x)
# Código: https://es.py4e.com/code3/addtwo.py
Cuando se ejecuta este script, la sentencia print mostrará “8”, ya que la función
sumados ha sido llamada con 3 y 5 como argumentos. Dentro de la función, los
parámetros a y b equivaldrán a 3 y a 5 respectivamente. La función calculó la
suma de ambos número y la guardó en una variable local a la función llamada
suma. Después usó la sentencia return para enviar el valor calculado de vuelta
al código de llamada como resultado de la función, que fue asignado a la
variable x y mostrado en pantalla.
A lo largo del resto del libro, a menudo usaremos una definición de función para
explicar un concepto. Parte de la habilidad de crear y usar funciones consiste en
llegar a tener una función que represente correctamente una idea, como
“encontrar el valor más pequeño en una lista de valores”. Más adelante te
mostraremos el código para encontrar el valor más pequeño de una lista de
valores y te lo pre sentaremos como una función llamada min, que toma una
lista de valores como argumento y devuelve el menor valor de esa lista.
4.12. DEPURACIÓN 55 4.12 Depuración
Si estás usando un editor de texto para escribir tus propios scripts, puede que
tengas problemas con los espacios y tabulaciones. El mejor modo de evitar
esos problemas es usar espacios exclusivamente (no tabulaciones). La mayoría
de los editores de texto que reconocen Python lo hacen así por defecto, aunque
hay algunos que no.
Las tabulaciones y los espacios normalmente son invisibles, lo cual hace que
sea difícil depurar los errores que se pueden producir, así que mejor busca un
editor que gestione el indentado por ti.
Tampoco te olvides de guardar tu programa antes de hacerlo funcionar. Algunos
entornos de desarrollo lo hacen automáticamente, pero otros no. En ese caso,
el programa que estás viendo en el editor de texto puede no ser el mismo que
estás ejecutando en realidad.
¡La depuración puede llevar mucho tiempo si estás haciendo funcionar el
mismo programa con errores una y otra vez!
Asegúrate de que el código que estás examinando es el mismo que estás
ejecutando. Si no estás seguro, pon algo como print("hola") al principio del
programa y hazlo funcionar de nuevo. Si no ves hola en la pantalla, ¡es que no
estás ejecutando el programa correcto!
4.13 Glosario
larga,
función estéril (void function) Una función que no devuelve ningún valor.
notación punto La sintaxis para llamar a una función de otro módulo, especifi
cando el nombre del módulo seguido por un punto y el nombre de la
función.
objeto módulo Un valor creado por una sentencia import, que proporciona ac
ceso a los datos y código definidos en un módulo.
sentencia import Una sentencia que lee un archivo módulo y crea un objeto
módulo.
def fred():
print("Zap")
def jane():
print("ABC")
jane()
fred()
jane()
Introduzca Horas: 45
Introduzca Tarifa: 10
Salario: 475.0
Puntuación Calificación
> 0.9 Sobresaliente
> 0.8 Notable
> 0.7 Bien
> 0.6 Suficiente
<= 0.6 Insuficiente
Chapter 5
Iteración
x=x+1
Esto quiere decir “‘toma el valor actual de x, añádele 1, y luego actualiza x con
el nuevo valor”.
Si intentas actualizar una variable que no existe, obtendrás un error, ya que
Python evalúa el lado derecho antes de asignar el valor a x:
>>> x = x + 1
NameError: name 'x' is not defined
>>> x = 0
>>> x = x + 1
59
60 CHAPTER 5. ITERACIÓN
n=5
while n > 0:
print(n)
n=n-1
print('¡Despegue!')
Este tipo de flujo recibe el nombre de bucle, ya que el tercer paso enlaza de
nuevo con el primero. Cada vez que se ejecuta el cuerpo del bucle se dice que
realizamos una iteración. Para el bucle anterior, podríamos decir que “ha tenido
cinco itera ciones”, lo que significa que el cuerpo del bucle se ha ejecutado cinco
veces.
El cuerpo del bucle debe cambiar el valor de una o más variables, de modo que
la condición pueda en algún momento evaluarse como falsa y el bucle termine.
La variable que cambia cada vez que el bucle se ejecuta y controla cuándo
termina éste, recibe el nombre de variable de iteración. Si no hay variable de
iteración, el bucle se repetirá para siempre, resultando así un bucle infinito.
break
n = 10
while True:
print(n, end=' ')
n=n-1
print('¡Terminado!')
while True:
linea = input('> ')
if linea == 'fin':
break
print(linea)
print('¡Terminado!')
# Código: https://es.py4e.com/code3/copytildone1.py
La condición del bucle es True, lo cual es verdadero siempre, así que el bucle
se repetirá hasta que se ejecute la sentencia break.
Cada vez que se entre en el bucle, se pedirá una entrada al usuario. Si el
usuario escribe fin, la sentencia break hará que se salga del bucle. En cualquier
otro caso, el programa repetirá cualquier cosa que el usuario escriba y volverá al
principio del bucle. Éste es un ejemplo de su funcionamiento:
Este modo de escribir bucles while es habitual, ya que así se puede comprobar
la condición en cualquier punto del bucle (no sólo al principio), y se puede
expresar la condición de parada afirmativamente (“detente cuando ocurra. . . ”),
en vez de tener que hacerlo con lógica negativa (“sigue haciéndolo hasta que
ocurra. . . ”).
5.5 Finalizar iteraciones con continue
Algunas veces, estando dentro de un bucle se necesita terminar con la iteración
actual y saltar a la siguiente de forma inmediata. En ese caso se puede utilizar
la sentencia continue para pasar a la siguiente iteración sin terminar la
ejecución del cuerpo del bucle para la actual.
A continuación se muestra un ejemplo de un bucle que repite lo que recibe
como entrada hasta que el usuario escribe “fin”, pero trata las líneas que
empiezan por el carácter almohadilla como líneas que no deben mostrarse en
pantalla (algo parecido a lo que hace Python con los comentarios).
while True:
linea = input('> ')
if linea[0] == '#' :
continue
if linea == 'fin':
break
print(linea)
print('¡Terminado!')
# Código: https://es.py4e.com/code3/copytildone2.py
tiene una lista de cosas para recorrer, se puede construir un bucle definido
usando una sentencia for. A la sentencia while se la llama un bucle indefinido,
porque simplemente se repite hasta que cierta condición se hace Falsa,
mientras que el bucle for se repite a través de un conjunto conocido de
elementos, de modo que ejecuta tantas iteraciones como elementos hay en el
conjunto.
La sintaxis de un bucle for es similar a la del bucle while, en ella hay una
sentencia for y un cuerpo que se repite:
La traducción de este bucle for al español no es tan directa como en el caso del
while, pero si piensas en los amigos como un conjunto, sería algo así como:
“Ejecuta las sentencias en el cuerpo del bucle una vez para (for) cada amigo que
esté en (in) el conjunto llamado amigos.”
Revisando el bucle for, for e in son palabras reservadas de Python, mientras
que amigo y amigos son variables.
• Se realiza alguna operación con cada elemento en el cuerpo del bucle, posi
blemente cambiando las variables dentro de ese cuerpo.
Por ejemplo, para contar el número de elementos en una lista, podemos escribir
el siguiente bucle for:
contador = 0
for valor in [3, 41, 12, 9, 74, 15]:
contador = contador + 1
print('Num. elementos: ', contador)
total = 0
for valor in [3, 41, 12, 9, 74, 15]:
total = total + valor
print('Total: ', total)
Ni el bucle que cuenta los elementos ni el que los suma resultan particularmente
útiles en la práctica, dado que existen las funciones internas len() y sum() que
cuentan el número de elementos de una lista y el total de elementos en la
misma respectivamente.
mayor = None
print('Antes:', mayor)
for valor in [3, 41, 12, 9, 74, 15]:
if mayor is None or valor > mayor :
mayor = valor
print('Bucle:', valor, mayor)
print('Mayor:', mayor)
Antes: None
Bucle: 3 3
Bucle: 41 41
Bucle: 12 41
Bucle: 9 41
Bucle: 74 74
Bucle: 15 74
Mayor: 74
Debemos pensar en la variable mayor como el “mayor valor visto hasta ese mo
mento”. Antes del bucle, asignamos a mayor el valor None. None es un valor
constante especial que se puede almacenar en una variable para indicar que la
variable está “vacía”.
Antes de que el bucle comience, el mayor valor visto hasta entonces es None,
dado que no se ha visto aún ningún valor. Durante la ejecución del bucle, si
mayor es None, entonces tomamos el primer valor que tenemos como el mayor
hasta entonces. Se puede ver en la primera iteración, cuando el valor de valor
es 3, mientras que mayor es None, inmediatamente hacemos que mayor pase a
ser 3.
Tras la primera iteración, mayor ya no es None, así que la segunda parte de la
ex presión lógica compuesta que comprueba si valor > mayor se activará sólo
cuando encontremos un valor que sea mayor que el “mayor hasta ese
momento”. Cuando encontramos un nuevo valor “mayor aún”, tomamos ese
nuevo valor para mayor. Se puede ver en la salida del programa que mayor pasa
desde 3 a 41 y luego a 74.
Al final del bucle, se habrán revisado todos los valores y la variable mayor
contendrá entonces el mayor valor de la lista.
Para calcular el número más pequeño, el código es muy similar con un pequeño
cambio:
66 CHAPTER 5. ITERACIÓN
print('Antes:', menor)
for valor in [3, 41, 12, 9, 74, 15]:
if menor is None or valor < menor:
menor = valor
print('Bucle:', valor, menor)
print('Menor:', menor)
def min(valores):
menor = None
for valor in valores:
if menor is None or valor < menor:
menor = valor
return menor
5.8 Depuración
A medida que vayas escribiendo programas más grandes, puede que notes que
vas necesitando emplear cada vez más tiempo en depurarlos. Más código
significa más oportunidades de cometer un error y más lugares donde los bugs
pueden esconderse.
Un método para acortar el tiempo de depuración es “depurar por bisección”. Por
ejemplo, si hay 100 líneas en tu programa y las compruebas de una en una, te
llevará 100 pasos.
En lugar de eso, intenta partir el problema por la mitad. Busca en medio del
programa, o cerca de ahí, un valor intermedio que puedas comprobar. Añade
una sentencia print (o alguna otra cosa que tenga un efecto verificable), y haz
funcionar el programa.
Si en el punto medio la verificación es incorrecta, el problema debería estar en
la primera mitad del programa. Si ésta es correcta, el problema estará en la
segunda mitad.
Cada vez que realices una comprobación como esta, reduces a la mitad el
número de líneas en las que buscar. Después de seis pasos (que son muchos
menos de 100), lo habrás reducido a una o dos líneas de código, al menos en
teoría.
En la práctica no siempre está claro qué es “en medio del programa”, y no
siempre es posible colocar ahí una verificación. No tiene sentido contar las
líneas y encontrar
5.9. GLOSARIO 67
el punto medio exacto. En lugar de eso, piensa en lugares del programa en los
cuales pueda haber errores y en lugares donde resulte fácil colocar una
comprobación. Luego elige un sitio donde estimes que las oportunidades de que
el bug esté por delante y las de que esté por detrás de esa comprobación son
más o menos las mismas.
5.9 Glosario
acumulador Una variable usada en un bucle para sumar o acumular un resultado.
contador Una variable usada en un bucle para contar el número de veces que
algo sucede. Inicializamos el contador a cero y luego lo vamos
incrementando cada vez que queramos que “cuente” algo.
inicializar Una asignación que da un valor inicial a una variable que va a ser
después actualizada.
5.10 Ejercicios
Ejercicio 1: Escribe un programa que lea repetidamente números hasta
que el usuario introduzca “fin”. Una vez se haya introducido “fin”, muestra
por pantalla el total, la cantidad de números y la media de esos números.
Si el usuario introduce cualquier otra cosa que no sea un número, detecta
su fallo usando try y except, muestra un mensaje de error y pasa al
número siguiente.
Introduzca un número: 4
Introduzca un número: 5
Introduzca un número: dato erróneo
Entrada inválida
Introduzca un número: 7
Introduzca un número: fin
16 3 5.33333333333
68 CHAPTER 5. ITERACIÓN
Ejercicio 2: Escribe otro programa que pida una lista de números como la
anterior y al final muestre por pantalla el máximo y mínimo de los
números, en vez de la media.