Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A cierto nivel, usted aprenderá a programar, lo cual es una habilidad muy útil por sí
misma. A otro nivel, usted utilizará la programación para obtener algún resultado. Ese
resultado se verá más claramente durante el proceso.
Aun así, las ventajas son enormes. En primer lugar, la programación en lenguajes de alto
nivel es mucho más fácil; escribir programas en un lenguaje de alto nivel toma menos
tiempo, los programas son más cortos y más fáciles de leer, y es más probable que
estos programas queden correctos. En segundo lugar, los lenguajes de alto nivel
son portables, lo que significa que los programas escritos con estos lenguajes pueden
ser ejecutados en diferentes tipos de computadoras sin modificación alguna o con pocas
modificaciones. Los programas escritos en lenguajes de bajo nivel sólo pueden ser
ejecutados en un tipo de computadora y deben ser reescritos para ser ejecutados en
otra.
Debido a estas ventajas, casi todo programa se escribe en un lenguaje de alto nivel. Los
lenguajes de bajo nivel son sólo usados para unas pocas aplicaciones especiales.
Hay dos tipos de programas que traducen lenguajes de alto nivel a lenguajes de bajo
nivel: intérpretes y compiladores. Un intérprete lee un programa de alto nivel y lo
ejecuta, lo que significa que lleva a cabo lo que indica el programa. Es decir, traduce el
programa poco a poco, leyendo y ejecutando cada comando.
Muchos de los lenguajes modernos usan ambos tipos de programas de traducción. Estos
lenguajes se traducen primero a un lenguaje de bajo nivel, llamado código de bytes, y
después son interpretados por un programa denominado máquina virtual. Aunque
Python usa ambos tipos de programas de traducción, usualmente se le considera un
lenguaje interpretado debido a la manera en que los programadores interactúan con él.
$ python
Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1 + 1
2
Por convención, los archivos que contienen programas de Python tienen nombres que
terminan con .py.
Para ejecutar el programa, se le tiene que indicar al intérprete el nombre del guión:
$ python primerprograma.py
2
En los ejemplos de este libro se usa tanto el intérprete de Python como los guiones.
Usted será capaz de identificar cualquiera de ellos, puesto que los ejemplos en modo de
comandos siempre empezarán con el indicador del intérprete de comandos de Python
(>>>).
entrada
Reciben datos del teclado, de un archivo o de algún otro dispositivo.
salida
Muestran datos en el monitor o los envían a un archivo u otro dispositivo.
matemáticas
Ejecutan operaciones básicas de matemáticas como la adición y la multiplicación.
operación condicional
Prueban la veracidad de alguna condición y ejecutan la secuencia de
instrucciones apropiada.
repetición
Ejecutan alguna acción repetidas veces, usualmente con alguna variación.
Aunque sea difícil de creer, estos conceptos agrupan más o menos todas las
instrucciones que hay en los lenguajes de programación. Todos los programas en
existencia, sin importar su complejidad, son formulados exclusivamente con tales
instrucciones. Así, la programación se puede describir como el proceso de dividir una
tarea amplia y compleja en tareas cada vez más pequeñas hasta que éstas sean lo
suficientemente sencillas como para ser ejecutadas con estas instrucciones básicas.
Quizás esta descripción sea un poco imprecisa, pero volveremos a este tema más
adelante cuando hablemos de algoritmos.
Hay tres tipos de errores que pueden ocurrir en un programa: errores de sintaxis,
errores en tiempo de ejecución y errores semánticos. Es muy útil distinguirlos para
encontrarlos más rápido.
Los errores en tiempo de ejecución son raros en los programas simples que veremos en
los primeros capítulos, por lo que pasará un buen tiempo antes de encontrar el primer
error de este tipo.
La depuración es una actividad parecida a la labor realizada por detectives: se tienen que
estudiar las pistas para inferir los procesos y eventos que han generado los resultados
que se han encontrado.
La depuración es como una ciencia experimental. Una vez que se tiene conciencia de un
error, se modifica el programa y se intenta nuevamente. Si la hipótesis fue la correcta se
pueden predecir los resultados de la modificación y se estará más cerca de un programa
correcto. Si la hipótesis fue errónea tendrá que idearse otra hipótesis. Como dijo
Sherlock Holmes: “Cuando se ha descartado lo imposible, lo que queda, no importa cuán
inverosímil, debe ser la verdad”. (A. Conan Doyle, The Sign of Four)
Los Lenguajes de programación son lenguajes formales que han sido desarrollados para
expresar cómputos.
Los lenguajes formales casi siempre tienen reglas sintácticas estrictas. Por
ejemplo, 3+3=6 es una expresión matemática sintácticamente correcta, pero 3=+6$ no lo
es. De la misma manera, H2O es una nomenclatura química sintácticamente correcta,
pero 2Zz`` no lo es.
Al leer una oración, sea en un lenguaje natural o una sentencia en un lenguaje formal, se
debe discernir la estructura de la oración. En un lenguaje natural este proceso,
llamado análisis sintáctico, ocurre subconscientemente.
Por ejemplo, cuando se escucha una oración simple como el otro zapato se cayó, se
puede distinguir el predicado (el otro zapato) y el verbo (se cayó). Cuando se ha
analizado la oración sintácticamente, se puede deducir el significado, o la semántica, de
la oración. Si usted sabe lo que es un zapato y el significado de caer, comprenderá el
significado de la oración.
Aunque existen muchas cosas en común entre los lenguajes naturales y los lenguajes
formales — por ejemplo, las unidades léxicas, la estructura, la sintaxis y la semántica —
también existen muchas diferencias:
ambigüedad
Los lenguajes naturales tienen muchísimas ambigüedades que se superan
usando claves contextuales e información adicional. Los Lenguajes formales son
diseñados para estar completamente libres de ambigüedades, tanto como sea
posible, lo que quiere decir que cualquier sentencia tiene sólo un significado sin
importar el contexto en el que se encuentra.
redundancia
Para reducir la ambigüedad y los malentendidos, los lenguajes naturales utilizan
bastante redundancia. Como resultado tienen una abundancia de posibilidades
para expresarse. Los lenguajes formales son menos redundantes y más concisos.
literalidad
Los lenguajes naturales tienen muchas metáforas y frases comunes. El significado
de un dicho, por ejemplo, estiró la pata, es diferente al significado de sus
sustantivos y verbos. En este ejemplo, la oración no tiene nada que ver con un
pie y significa ‘murió’. En los lenguajes formales sólo existe el significado literal.
Los que aprenden a hablar un lenguaje natural —es decir todo el mundo— muchas veces
tienen dificultad en adaptarse a los lenguajes formales. A veces la diferencia entre los
lenguajes formales y los naturales es comparable a la diferencia entre la prosa y la
poesía:
Poesía
Se utiliza la palabra por su cualidad auditiva tanto como por su significado. El
poema, en su totalidad, produce un efecto o reacción emocional. La ambigüedad
no es sólo común sino utilizada a propósito.
Prosa
El significado literal de la palabra es más importante y la estructura contribuye
aún más al significado. La prosa se presta más al análisis que la poesía, pero
todavía contiene ambigüedad.
Programas
El significado de un programa es inequívoco y literal, y es entendido en su
totalidad analizando las unidades léxicas y la estructura.
Este es un ejemplo de una sentencia print , la cual no imprime nada en papel, más bien
muestra un valor. En este caso, el resultado es las palabras:
Las comillas señalan el comienzo y el final del valor; ellas no aparecen en el resultado.
Algunas personas evalúan la calidad de un lenguaje de programación por la simplicidad
del programa ¡Hola todo el mundo!. Si seguimos ese criterio, Python cumple con este
cometido bastante bien.
1.10. Glosario
algoritmo
Un proceso general para resolver una clase completa de problemas.
análisis sintáctico
Escudriñamiento de un programa y realización del análisis de su estructura
sintáctica.
bicho
Un error en un programa.
código de bytes
Un lenguaje intermedio entre el código fuente y el código objeto. Muchos de los
lenguajes modernos traducen el código fuente en código de bytes y después
interpretan el código de bytes mediante un programa denominado máquina
virtual.
código fuente
Un programa escrito en un lenguaje de alto nivel antes de ser compilado.
código objeto
La salida del compilador una vez que el programa ha sido traducido.
compilar
Traducir un programa escrito en un lenguaje de alto nivel a un lenguaje de bajo
nivel de una vez, en preparación para la ejecución posterior.
depuración
El proceso de hallazgo y eliminación de los tres tipos de errores de
programación.
error de sintaxis
Un error estructural que hace que un programa sea imposible de analizar
sintácticamente (e imposible de interpretar).
error en tiempo de ejecución
Un error que no ocurre hasta que el programa ha comenzado su ejecución e
impide que éste continúe.
error semántico
Un error en un programa que hace que se ejecute algo que no era lo deseado.
excepción
Otro nombre para un error en tiempo de ejecución.
guión
Un programa almacenado en un archivo (que usualmente será interpretado).
interpretar
Ejecutar un programa escrito en un lenguaje de alto nivel traduciéndolo línea por
línea.
lenguaje formal
Cualquier lenguaje diseñado que tiene un propósito específico, como la
representación de ideas matemáticas o programas de computadoras; todos los
lenguajes de programación son lenguajes formales.
lenguaje natural
Cualquier lenguaje hablado que evolucionó de forma natural.
portabilidad
La cualidad de un programa que puede ser ejecutado en más de un tipo de
computadora.
programa
Secuencia de instrucciones que especifica a una computadora las acciones y
cálculos que debe realizar.
Programa ejecutable
Otro nombre para el código de objeto que está listo para ser ejecutado.
Resolución de problemas
El proceso de plantear un problema, hallar la solución y expresarla.
semántica
El significado de un programa
Sentencia print
Una instrucción que causa que el intérprete de Python muestre un valor en el
monitor.
sintaxis
La estructura de un programa.
terminal de Python
Interfase interactiva del intérprete de Python. El usuario de la terminal de Python
escribe los comandos en el indicador (>>>), y presiona la tecla Entrar para enviar
inmediatamente estos comandos al intérprete para su procesamiento.
Unidad léxica
Uno de los elementos básicos de la estructura sintáctica de un programa, análogo
a una palabra en un lenguaje natural.
1.11. Ejercicios
Muchas veces Python indica la ubicación del error de sintaxis, sin embargo, no
siempre es precisa, por lo que no proporciona suficiente información sobre cuál
es el problema. De esta manera, el mejor antídoto es que usted aprenda la
sintaxis de Python.
¿Qué pasa cuando corre este guión? Ahora cambie el contenido del guión a:
>>> print 4
4
Si no esta seguro del tipo que un valor tiene, el intérprete le puede decir.
Las cadenas pertenezcan al tipo str y los enteros pertenezcan al tipo int . Los números
con un punto decimal pertenezcan a un tipo llamado float, porque éstos se representan
en un formato denominado punto flotante.
>>> type(3.2)
<type 'float'>
¿Que ocurre con valores como "17" y "3.2"? Parecen números, pero están encerrados
entre comillas como las cadenas.
>>> type("17")
<type 'str'>
>>> type("3.2")
<type 'str'>
Cadenas en Python puede ser incluida en cualquiera de los dos comillas simples (') o
comillas dobles ("):
Cuando usted escribe un número grande podría estar tentado a usar comas para separar
grupos de tres dígitos, como en 1,000,000. Esto no es un número entero válido en
Python, pero sí es aceptado en una sentencia como:
2.2. Variables
Una de las características más poderosas en un lenguaje de programación es la
capacidad de manipular variables. Una variable es un nombre que se refiere a un valor.
En cada caso el resultado es el valor de la variable. Las variables también tienen tipos;
nuevamente, le podemos preguntar al intérprete cuáles son.
>>> type(mesaje)
<type 'str'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>
Usted puede mantener esta lista a mano. Si el intéprete se queja por alguno de sus
nombres de variables, y usted no sabe por qué, búsquelo en esta lista.
2.4. Sentencias
Una sentencia es una instrucción que el intérprete de Python puede ejecutar. Hemos
visto dos clases de sentencias: la asignación y print.
Un guión usualmente contiene una secuencia de sentencias. Si hay más de una, los
resultados aparecen uno a uno a medida que las sentencias se ejecutan.
print 1
x = 2
print x
produce la salida:
1
2
>>> 1 + 1
2
>>> 17
17
>>> x
2
Cuando la terminal de Python muestra el valor de una expresión que ha evaluado, usa el
mismo formato que se usaría para introducir un valor. En el caso de las cadenas, esto
implicaría que se incluyen las comillas. Pero la sentencia print despliega el valor de la
expresión que, en este caso, es el contenido de la cadena.
En un guión, una expresión, por sí misma, es una sentencia válida, pero no realiza nada.
El guión
17
3.2
"¡Hola todo el mundo!"
1 + 1
no produce ninguna salida. ¿Como cambiaría el guión de manera que despliegue los
valores de las cuatro expresiones?
Los siguientes son expresiones válidas en Python cuyo significado es más o menos claro:
Los símbolos +, - y /, y los paréntesis para agrupar, significan en Python lo mismo que
en matemáticas. El asterisco (*) es el símbolo para la multiplicación, y ** es el símbolo
para la potenciación.
>>> minuto = 59
>>> minuto/60
0
Cuando los dos operandos son enteros el resultado también debe ser un entero; y, por
convención, la división entera siempre redondea hacia abajo, incluso en casos como éste
donde el siguiente entero está muy cerca.
Una posible solución a este problema consiste en calcular un porcentaje, en lugar de una
fracción:
>>> minuto*100/60
98
$ python entrada.py
Introduzca su nombre por favor: Arturo, Rey de los británicos
Arturo, Rey de los británicos
Introduzca una expresión numérica: 7 * 3
21
2.10. Composición
Hasta aquí hemos visto aisladamente los elementos de un programa — variables,
expresiones, y sentencias — sin especificar cómo combinarlos.
>>> print 17 + 3
20
De hecho, la suma tiene que calcularse antes que el mostrado en pantalla, así que las
acciones no están ocurriendo realmente al mismo tiempo. La cuestión es que cualquier
expresión que tenga números, cadenas y variables puede ser usada en una
sentencia print. Usted ya ha visto un ejemplo de esto:
Esta capacidad no parece nada impresionante ahora, pero vamos a ver otros ejemplos en
los que la composición hace posible expresar cálculos complejos organizada y
concisamente.
Advertencia: hay restricciones sobre los lugares en los que se pueden usar las
expresiones. Por ejemplo, el lado izquierdo de una sentencia de asignación tiene que ser
un nombre de variable, no una expresión. Entonces lo siguiente es
inválido: minuto+1 = hour.
2.11. Comentarios
A medida que los programas se hacen más grandes y complejos, se hacen más difíciles
de leer. Los lenguajes formales son densos; y, a menudo, es difícil mirar una sección de
código y saber qué hace, o por qué lo hace.
Por esta razón, es una buena idea añadir notas a sus programas para explicar, en
lenguaje natural, lo que el programa hace. Estas notas se denominan comentarios y se
marcan con el símbolo #:
En este caso el comentario aparece en una línea completa. También se pueden poner
comentarios al final de una línea:
2.12. Glosario
cadena
Un tipo de dato en Python que tiene una “cadena” de caracteres.
comentario
Información que se incluye en un programa para otro programador (o lector del
código fuente) que no tiene efecto en la ejecución.
composición
La capacidad de combinar expresiones y sentencias simples dentro de sentencias
y expresiones compuestas para representar concisamente cálculos complejos.
concatenar
Unir dos operandos, en el orden en que aparecen.
diagrama de estado
Una representación gráfica de un conjunto de variables y los valores a los que se
refieren.
división entera
Una operación que divide un entero por otro y retorna un entero. La división
entera retorna el número de veces que el denominador cabe en el numerador y
descarta el residuo.
entero
Un tipo de dato en Python que tiene números enteros positivos y negativos.
evaluar
Simplificar una expresión ejecutando varias operaciones hasta obtener un sólo
valor.
expresión
Una combinación de variables, operadores y valores cuyo resultado se representa
por un único valor.
nombre de variable
Es el nombre dado a una variable. Los nombres de variables en Python consisten
en una secuencia de letras (a...z, A...Z, and _) y dígitos (0..9) que empiezan con
una letra. De acuerdo con las buenas prácticas de la programación, los nombres
de variables se eligen, de forma tal, que describan su uso en el programa
haciéndolo autodocumentado.
operador
Un símbolo especial que representa cálculos simples como la suma,
multiplicación, o concatenación de cadenas.
operador de asignación
El símbolo = es el operador de asignación de Python, que no debe confundirse
con el <em>signo igual</em>, utilizado para indicar la igualdad matemática.
operando
Uno de los valores sobre el cual actúa un operador.
2.13. Ejercicios
>>> print n = 7
>>> print 7 + 5
¿Puede identificar un uso general para lo que sigue a una sentencia print? ¿Qué es lo
que proporciona como salida la sentencia print?
>>> x = input()
3.14
>>> type(x)
>>> x = raw_input()
3.14
>>> type(x)
>>> x = input()
'Los caballeros que dicen "¡no!"'
>>> x
¿Qué sucede si realiza el mismo ejercicio anterior sin las comillas simples?
>>> x = input()
Los caballeros que dicen "¡no!"
>>> x
>>> x = raw_input()
'Los caballeros que dicen "¡no!"'
>>> x
3. Funciones
3.1. Definiciones y uso
En el contexto de la programación una función es una secuencia de sentencias que
ejecuta una operación deseada y tiene un nombre. Esta operación se especifica en
una definición de función. La sintaxis para una definición de función en Python es:
Usted puede inventar los nombres que desee para sus funciones siempre y cuando no
use una palabra reservada de Python. La lista de parámetros especifica qué información,
si es que la hay, se debe proporcionar a fin de usar la nueva función.
Se puede incluir cualquier número de sentencias dentro de la función, pero todas deben
sangrarse a partir del margen izquierdo. En los ejemplos de este libro usaremos un
sangrado estándar de cuatro espacios. La definición de función es la primera de
diversas sentencias compuestas que veremos más adelante, teniendo todas ellas la
misma estructura:
1. Un encabezado, que empieza con una palabra reservada y termina con dos
puntos.
2. Un cuerpo consistente de una o más sentencias de Python, cada una de ellas con
la misma sangría – 4 espacios es el estándar de Python – a partir del margen
izquierdo.
El primer par de funciones que escribiremos no tiene parámetros, por lo que la sintaxis
luce así:
def nueva_linea():
print # la sentencia print sin argumentos muestra una nueva línea
Esta función se llama nueva_linea. Los paréntesis vacíos indican que la función no tiene
parámetros. Su cuerpo contiene solamente una única sentencia, cuya salida es una línea
vacía. (Eso es lo que ocurre cuando se usa la sentencia print sin argumentos.)
Nota del traductor: El uso de nombres de funciones (y de nombres de variables) con
acentos sólo es posible en la versión 3.0 — y superiores — del intérprete de Python. Si
tiene alguna versión inferior, no use acentos en los nombres de funciones.
Definir una nueva función no hace que la función se ejecute. Para hacerlo se necesita
una llamada a función. Las llamadas a función contienen el nombre de la función a
ejecutar seguida por la lista de valores, llamados argumentos, que son asignados a los
parámetros en la definición de función. Nuestra primera función tiene una lista vacía de
parámetros, por lo que la llamada a función no tiene ningún argumento. Nótese, sin
embargo, que en la llamada a función se requiere los paréntesis:
Primera Línea.
Segunda Línea.
def tres_lineas():
nueva_linea()
nueva_linea()
nueva_linea()
Esta función contiene tres sentencias, y todas están sangradas por cuatro espacios.
Como la siguiente sentencia no está sangrada, Python reconoce que tal sentencia no es
parte de la función.
Hay que destacar algunos aspectos de este programa:
Hasta este punto, puede que no parezca claro por qué hay que tomarse la molestia de
crear todas estas funciones. De hecho, hay muchas razones, y el ejemplo que acabamos
de ver muestra dos:
def nueva_linea():
print
def tres_lineas():
nueva_linea()
nueva_linea()
nueva_linea()
Como usted puede imaginar, se tiene que crear una función antes de ejecutarla. En otras
palabras, la definición de función tiene que ejecutarse antes de llamarla por primera vez.
La ejecución siempre empieza con la primera sentencia del programa. Las sentencias se
ejecutan una a una, desde arriba hacia abajo.
Las definiciones de función no alteran el flujo de ejecución del programa, pero recuerde
que las sentencias que están dentro de las funciones no se ejecutan hasta que éstas
sean llamadas. Aunque no es muy común, usted puede definir una función dentro de
otra. En este caso, la definición interna no se ejecuta hasta que la función externa sea
llamada.
Esto suena sencillo, hasta que tenemos en cuenta que una función puede llamar a otra.
Mientras se está ejecutando una función, el programa puede ejecutar las sentencias de
otra función. Pero, mientras se está ejecutando la nueva función, el programa puede
tener que ejecutar ¡otra función!
>>> abs(5)
5
>>> abs(-5)
5
>>> pow(2, 3)
8
>>> pow(7, 4)
2401
Aquí hay un ejemplo de una función definida por el programador que toma un
parámetro:
def muestra_doble(bruno):
print bruno, bruno
Cualquier tipo de argumento que pueda ser mostrado, puede ser enviado a la
función muestra_doble. En la primera llamada a función el argumento es una cadena. En
la segunda es un entero. En la tercera es un número de punto flotante (tipo float).
De la misma manera que con las funciones de biblioteca, podemos usar una expresión
como argumento para la función muestra_doble:
>>> muestra_doble('Basura' * 4)
BasuraBasuraBasuraBasura BasuraBasuraBasuraBasura
3.4. Composición
Asi como las funciones matemáticas, las funciones de Python pueden componerse, esto
es, puede usar el resultado de una función como entrada de otra
>>> muestra_doble(abs(-7))
7 7
>>> muestra_doble(max(3, 1, abs(-11), 7))
11 11
Note algo muy importante en este ejemplo: el nombre de la variable que pasamos como
argumento (miguel) no tiene nada que ver con el nombre del parámetro (bruno). Es decir,
no importa cómo se nombraba el valor originalmente (desde la llamada de función);
aquí, en la función muestra_doble llamamos a cualquiera de ellos bruno.
Esta función toma dos argumentos, los concatena, y luego muestra el resultado dos
veces. Podemos llamar a la función con dos cadenas:
Si sucede un error durante una llamada de función, Python muestra el nombre de ésta, el
nombre de la función que la llamó, el nombre de la función que llamó a esta otra, y así
sucesivamente hasta llegar a la función de más alto nivel.
Para ver cómo funciona esto cree un guión en Python que se llame pruebame2.py que
luce como sigue:
def muestra_doble(bruno):
print bruno, bruno
print concatena
3.7. Glosario
función
definición de función
Sentencia que crea una nueva función, especificando su nombre, parámetros y las
sentencias que ejecuta.
sentencia compuesta
.. sourcecode:: python
palabra_reservada expresión:
cuerpo
Segunda parte de una sentencia compuesta. El cuerpo consiste de una secuencia
de sentencias sangradas la misma distancia a partir del inicio del encabezado. El
sangrado usual usado en la comunidad Python es de 4 espacios.
llamada a función
Una sentencia que ejecuta una función. Está compuesta por el nombre de la
función más una lista de argumentos encerrados entre paréntesis.
flujo de ejecución
Orden en el que se ejecutan las sentencias durante la ejecución de un programa.
parámetro
Nombre que se usa dentro de una función para referirse al valor que se le pasa
como argumento.
import
def muestra_tres_veces(algo):
print algo, algo, algo
n = 42
c = "Y ahora algo completamente diferente..."
Ahora inicie una sesión en la terminal de Python desde el mismo directorio donde
se localiza pruebame.py:
$ ls
pruebame.py <y otras cosas...>
$ python
>>>
Se han definido tres nombres en pruebame.py: muestra_tres_veces, n, y c. Si
intentamos acceder a cualquiera de ellos desde la terminal, sin haberlos
importado primero, obtenemos un error:
argumento
composición de función
Uso de la salida de una llamada a función como la entrada de otra.
variable local
Variable definida dentro de una función. Las variables locales sólo pueden usarse
dentro de su función.
diagrama de pila
Representación gráfica de una pila de funciones, sus variables y los valores a los
que se refieren.
marco
Recuadro que en un diagrama de pila representa una llamada a función. Contiene
las variables locales y los parámetros de la función.
trazado inverso
Listado de las funciones en curso de ejecución, presentadas cuando sucede un
error en tiempo de ejecución. Es común que al trazado inverso también se le
conozca como trazado de pila porque lista las funciones en el orden en el cual
son almacenadas en la pila de llamadas.
3.8. Ejercicios
Si todo sale bien su sesión lucirá como esta. Experimente con otras llamadas
a concatena_n_veces hasta que usted se sienta a gusto con los resultados obtenidos.
4. Condicionales
>>> cociente = 7 / 3
>>> print cociente
2
>>> residuo = 7 % 3
>>> print residuo
1
El operador residuo resulta ser sorprendentemente útil. Por ejemplo, puede comprobar
si un número es divisible entre otro —si x % y es cero, entonces x es divisible entre y.
También puede usar el operador módulo para extraer el dígito más a la derecha de un
número. Por ejemplo, x % 10 devuelve el dígito más a la derecha de x (en base 10). De
manera similar, x % 100 devuelve los dos últimos dígitos.
>>> 5 == 5
True
>>> 5 == 6
False
En la primera sentencia, los dos operandos son iguales, así que la evaluación de la
expresión produce True; en la segunda sentencia, 5 no es igual a 6, así que
obtenemos False.
x != y # x no es igual a 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
if x > 0:
print "x es positivo"
if EXPRESION BOOLEANA:
SENTENCIAS
Así como la definición de función del capítulo anterior y otras sentencias compuestas, la
sentencia if consiste de un encabezado y un cuerpo. El encabezado empieza con la
palabra reservada if seguida por una expresión booleana y termina con dos puntos (:).
Cada una de las sentencias dentro del cuerpo se ejecuta en orden si la expresión
booleana produce el valor True. El bloque completo es ignorado si la expresión booleana
produce el valor False.
Como comentario al margen, si piensa que querrá comprobar con frecuencia la paridad
(pares o nones) de números, quizá desee “envolver” este código en una función:
def muestra_paridad(x):
if x % 2 == 0:
print x, "es par."
else:
print x, "es non."
>>> muestra_paridad(17)
17 es non.
>>> y = 41
>>> muestra_paridad(y+1)
42 es par.
if x < y:
print x, "es menor que", y
elif x > y:
print x, "es mayor que", y
else:
print x, "y", y, "son iguales"
elif es una abreviatura de “else if”. De nuevo, sólo se ejecutará una rama. No hay límite
al número de sentencias elif, pero sólo se permite una sentencia else (que es opcional)
y debe ser la última rama de la sentencia:
Las condiciones se comprueban en orden. Si la primera es falsa, se comprueba la
siguiente, y así se sigue con las demás. Si una de ellas es cierta, se ejecuta la rama
correspondiente y termina la sentencia. Incluso, si es cierta más de una condición, sólo
se ejecuta la primera rama verdadera.
if x == y:
print x, "y", y, "son iguales"
else:
if x > y:
print x, "es menor que", y
else:
print x, "es mayor que", y
La condicional externa contiene dos ramas. La primera rama contiene una sentencia
simple de salida. La segunda rama contiene otra sentencia if, que tiene dos ramas
propias. Estas dos ramas son ambas sentencias de salida, aunque podrían ser
igualmente sentencias condicionales.
if 0 < x:
if x < 10:
print "x es un número positivo de un solo dígito."
La sentencia print sólo se ejecuta si conseguimos superar ambas condicionales, así que
podemos usar el operador and:
Este tipo de condiciones son comunes, por lo que Python nos proporciona una sintaxis
alternativa similar a la notación matemática:
4.8. La sentencia return
La sentencia return le permite terminar la ejecución de una función antes de alcanzar su
final. Una razón para usarla es detectar una condición de error:
def muestra_raiz_cuadrada(x):
if x <= 0:
print "Por favor, use sólo números positivos."
return
resultado = x**0.5
print "La raíz cuadrada de x es", resultado
Note que el indicador es una cadena, por lo que debe ir encerrada entre paréntesis.
Si en este último ejemplo el usuario hubiese escrito una expresión válida de Python
colocando comillas en su respuesta, no habría obtenido un error:
Para evitar este tipo de error, es buena idea usar raw_input para obtener una cadena y
usar entonces las funciones de conversión para transformarla en otros tipos.
4.10. Conversión de tipos
Cada tipo en Python viene con un comando de biblioteca que convierte los valores de un
tipo en el tipo asociado al comando. El comando int(ARGUMENTO), por ejemplo, toma
cualquier valor y lo convierte, si es posible, en un entero, si no, dará un mensaje de
error:
>>> int("32")
32
>>> int("Hola")
ValueError: invalid literal for int() with base 10: 'Hola'
>>> int(-2.3)
-2
>>> int(3.99999)
3
>>> int("42")
42
>>> int(1.0)
1
>>> float(32)
32.0
>>> float("3.14159")
3.14159
>>> float(1)
1.0
Pareciera extraño que Python distinga el valor entero 1 del valor en punto flotante 1.0;
son el mismo número, pero pertenecen a tipos distintos. La razón es que se representan
en la computadora de manera diferente.
El comando str(ARGUMENTO) convierte cualquier argumento dado, en tipo cadena (str):
Python asigna valores booleanos a los valores de otros tipos. Para tipos numéricos como
enteros y de punto flotante, los valores cero son valores falsos y los valores diferentes
de cero son valores verdaderos. Para cadenas, las cadenas vacías son falsas y las no
vacías son verdaderas.
4.11. GASP
GASP (Graphics API for Students of Python - Gráficas API para Estudiantes de Python)
nos permitirá escribir programas que involucren gráficas. Antes de se puede utilizar el
GASP, se necesita instalarlo en su máquina. Si está ejecutando Ubuntu GNU/Linux,
véase GASP en Apéndice A.
A partir de ahora estaremos usando gasp para ilustrar (en el más amplio sentido de la
palabra) los conceptos de programación de computadoras, y para divertirnos mientras
aprendemos.
4.12. Glosario
operador módulo
Operador que, denotado por el signo de tanto por ciento (%), trabaja sobre
enteros y devuelve el residuo cuando un número es dividido por otro.
valor booleano
Existen exactamente dos valores booleanos: True y False. Los valores booleanos
se obtienen cuando una expresión booleana es evaluada por el intérprete de
Python. Estos valores son del tipo bool.
expresión booleana
Una expresión que es falsa o verdadera.
operador de comparación
Uno de los operadores que comparan dos valores: ==, !=, >, <, >=, y <=.
operador lógico
Uno de los operadores que combinan expresiones booleanas: and, or, y not.
sentencia condicional
Sentencia que controla el flujo de ejecución dependiendo de cierta condición. En
Python las palabras reservadas if, elif, y else son usadas por las sentencias
condicionales.
condición
En una sentencia condicional es una expresión booleana que determina cuál rama
se ejecutará.
bloque
Grupo de sentencias consecutivas con el mismo sangrado.
cuerpo
En una sentencia compuesta es el bloque que está después del encabezado.
rama
Uno de los posibles caminos del flujo de ejecución determinado por la ejecución
condicional.
condicional encadenada
Rama condicional con más de dos posibles flujos de ejecución. En Python las
condicionales encadenadas se escriben con las sentencias if ... elif ... else.
anidamiento
Estructura de un programa dentro de otra, tal como una sentencia condicional
dentro de una rama de otra sentencia condicional.
indicador
Indicación visual que invita al usuario a introducir datos.
conversión de tipos
Sentencia explícita que toma un valor de un tipo y calcula el valor
correspondiente a otro tipo.
4.13. Ejercicios
1. Intente evaluar
mentalmente las siguientes expresiones numéricas, luego use el intérprete de
Python para verificar sus respuestas:
1. >>> 5 % 2
2. >>> 9 % 5
3. >>> 15 % 12
4. >>> 12 % 15
5. >>> 6 % 6
6. >>> 0 % 7
7. >>> 7 % 0
¿Qué pasó con el último ejemplo? ¿Por qué? Si pudo anticipar correctamente todas las
respuestas de la computadora — excepto la última, es el momento de continuar con los
demás ejercicios, si no, tómese un tiempo para realizar ejemplos similares por su
cuenta. Explore el operador módulo hasta que tenga plena confianza que ha entendido
cómo funciona.
if x < y:
print x, "es menor que", y
elif x > y:
print x, "es mayor que", y
else:
print x, "y", y, "son iguales"
2. Envuelva este
código en una función llamada comparar(x, y). Llame a la función comparar tres
veces: una en la que el primer argumento sea menor que el segundo, otra en la que
aquel sea mayor que éste, y una tercera en la que los argumentos sean iguales.
3. Para entender
mejor las expresiones booleanas es útil la construcción de tablas de verdad. Dos
expresiones booleanas son lógicamente equivalentes si y solo si tienen la misma
tabla de verdad.
En capítulos posteriores usted aprenderá cómo trabaja este guión. Por ahora lo usará
para aprender sobre expresiones booleanas. Copie este programa en un archivo
llamado p_y_q.py, luego ejecútelo desde la línea de comandos, y cuando el indicador
solicite una expresión booleana escriba: p or q. Debería obtener la siguiente salida:
p q p or q
=====================
True True True
True False True
False True True
False False False
Ahora que sabemos cómo trabaja el guión, pongámoslo en una función para facilitar su
uso:
def tabla_de_verdad(expresion):
print " p q %s" % expresion
longitud = len( " p q %s" % expresion)
print longitud*"="
1. not(p or q)
2. p and q
3. not(p and q)
4. not(p) or not(q)
5. not(p) and not(q)
4. Introduzca las
siguientes expresiones en la terminal de Python:
Analice los resultados. ¿Qué observaciones tiene sobre los diferentes tipos de valores y
los operadores lógicos? ¿Puede escribir sus observaciones en forma de reglas simples
sobre las expresiones que usan and y or?
5. Envuelva este
código en una función llamada aviso(eleccion). Luego defina las
funciones funcion_a, funcion_b, y funcion_c de forma tal que muestren un aviso de
que fueron llamadas. Por ejemplo:
def funcion_a():
print "la funcion_a fue llamada..."
Finalmente, modifique el guión para que el usuario pueda introducir ‘a’, ‘b’, o ‘c’.
Pruébelo importando su guión en la terminal de Python.
6. Escriba una
función llamada es_divisible_entre_3 que tome un valor entero como un
argumento y muestre “Este número es divisible entre tres.” si el argumento es
exactamente divisible entre 3, y que muestre “Este número no es divisible entre
tres.” en caso contrario.
7. Generalice las
funciones que escribió en el ejercicio anterior en una función
llamada es_divisible_entre_n(x, n) que tome dos enteros como argumentos y
muestre cuándo el primero es divisible por el segundo y cuándo no. Guarde esta
función en un archivo llamado cap04e07.py. Importe el archivo en una terminal y
úselo. Una muestra de su sesión sería:
if "¡No!":
print 'Somos los caballeros que dicen "¡No!"'
else:
print "¡Basta! ¡No más!"
if 0:
print "Y ahora algo completamente diferente..."
else:
print "Entonces, ¿qué es todo esto?"
8. El siguiente
guión de gasp — escrito en un archivo llamado casa.py — dibuja una casa simple en
una ventana de gasp:
from gasp import * # importa todas las funciones del módulo gasp
Ejecute este guión y confirme que obtiene una ventana que se ve como esta:
1. Envuelva el código de la casa en una función que se llame dibuja_casa().
2. Ahora ejecute el guión. ¿Ve la casa? ¿Por qué no?
3. Agregue una llamada a dibuja_casa() al final del guión, tal que la casa
vuelva a la pantalla.
4. Parametrice la función con los parámetros x y y — el encabezado debería
ser def dibuja_casa(x, y):, de forma tal que pueda pasar la localización de la casa
a la ventana de gasp.
5. Use dibuja_casa para ubicar cinco casas en la ventana de gasp en
diferentes localizaciones.