Nuestro primer programa en Python
Ahora que hemos cubierto algunos elementos básicos del lenguaje Python en modo interactivo, queremos transferir este conocimiento a un programa real. A diferencia del modo interactivo, que permite la interacción mutua entre el programador y el intérprete, el código fuente de un programa se escribe en un archivo. El intérprete lo lee y ejecuta en su totalidad.
En las siguientes lecciones, aprenderás sobre las estructuras básicas de un programa Python y escribirás tu primer programa.
Tipeado, compilación y testing
Esta sección describe los flujos de trabajo necesarios para crear y ejecutar un programa Python. De manera más general, en gran parte del curso solo escribiremos aplicaciones de consola, por lo que te prepararemos para eso. Una aplicación de consola tiene una interfaz puramente de texto para el usuario y se ejecuta en la consola (o shell) del sistema operativo respectivo. Para la mayoría de los ejemplos y también para muchos casos de uso del mundo real, una interfaz basada en texto es suficiente.
Básicamente, un programa Python consta de uno o varios archivos de programa. Estos archivos de programa utilizan la extensión de archivo .py
y contienen el código fuente de Python. Los archivos son archivos de texto simple. En consecuencia, los archivos de programa se pueden editar con un editor de texto normal.
Una vez escrito un archivo de programa, el siguiente paso es ejecutarlo. Si utilizas IDLE, el archivo del programa se puede ejecutar cómodamente a través del elemento de menú Ejecutar > Ejecutar módulo. Si usas un editor que no admite una funcionalidad similar, debes cambiar al directorio del archivo del programa en una línea de comandos y, según tu sistema operativo, ejecutar varios comandos.
Windows
En Windows, debes ir al directorio donde se encuentra el archivo del programa e iniciar el intérprete de Python, usando el comando python
seguido del nombre del archivo del programa a ejecutar.
python program.py
Una salida del programa Python en el archivo program.py
podría ser el texto ¡Hola mundo desde tu programa Python!
, que demuestra que el programa Python realmente se ejecutó.
C:\Proyecto> python program.py
¡Hola mundo desde tu programa Python!
Nota
En Windows, también es posible ejecutar un programa de Python haciendo doble clic en el archivo de programa respectivo. Pero el inconveniente de esto es que la ventana de la consola se cierra inmediatamente después de que finaliza el programa y no es posible ver la salida del programa.
Linux y macOS
En sistemas operativos tipo Unix, como Linux o macOS, también debes ir al directorio donde se encuentra el archivo del programa y luego iniciar el intérprete de Python, usando el comando python
seguido del nombre del archivo del programa que se ejecutará. En el siguiente ejemplo, el archivo de programa program.py
se ejecuta en Linux, que se encuentra en el directorio /home/user/folder
:
user@HOST ~ $ cd folder
user@HOST ~/folder $ python program.py
Esto es lo que te escribe tu programa Python
Nota
El comando que utilizarás para iniciar Python puede diferir del comando de
python
que se muestra aquí, dependiendo de la distribución.
Línea mágica
En un sistema operativo tipo Unix, como Linux, los archivos de programa Python se pueden hacer directamente ejecutables usando un shebang (#!
), también conocido como línea mágica. Para este propósito, la primera línea del archivo del programa generalmente debe decir lo siguiente:
#!/usr/bin/python
En este caso, se recomienda que el sistema operativo ejecute siempre este archivo de programa utilizando el intérprete de Python. En otros sistemas operativos, como Windows, se ignora la línea shebang.
Ten en cuenta que el intérprete de Python puede estar instalado en tu sistema en un directorio diferente al especificado aquí. En general, por lo tanto, la siguiente línea shebang es mejor ya que es independiente de la ubicación real de instalación de Python:
#!/usr/bin/env python
También ten en cuenta que el indicador ejecutable del archivo del programa debe establecerse antes de que el archivo sea realmente ejecutable. Esto se puede hacer usando el siguiente comando:
chmod +x filename
Para mantener un alto grado de claridad, los ejemplos que se muestran en este libro no incluyen una línea de shebang. Sin embargo, esto no significa explícitamente que deba evitarse el uso de una línea shebang.
Procesos internos
Hasta este punto, debes tener una idea aproximada de qué se trata Python y dónde se pueden encontrar las fortalezas de este lenguaje de programación. También proporcionamos los conocimientos básicos para crear y ejecutar un archivo de programa de Python. Pero en las secciones anteriores se han utilizado términos como compilador o intérprete sin mayor explicación. En esta sección, por lo tanto, veremos las operaciones internas que ocurren cuando se ejecuta un archivo de programa de Python.
Cuando se ejecutas el archivo de programa program.py
, como se describe al principio de esta lección, primero pasa por el compilador, un programa que traduce de un lenguaje formal a otro. En el caso de Python, el compilador traduce del lenguaje Python al código de bytes. El compilador es libre de mantener el código de bytes generado en la memoria o guardarlo como programa.pyc
en el disco duro.
Ten en cuenta que el código de bytes generado por el compilador no se puede ejecutar directamente en el procesador, a diferencia de las compilaciones de C o C++, por ejemplo. Para ejecutar el código de bytes, se necesita otra capa de abstracción, el intérprete. El intérprete, a menudo denominado máquina virtual, lee el código de bytes generado por el compilador y lo ejecuta.
Este principio de un lenguaje de programación interpretado tiene varias ventajas. Por ejemplo, el mismo código Python se puede ejecutar sin modificaciones en todas las plataformas para las que esté disponible un intérprete de Python. Sin embargo, los programas de lenguajes de programación interpretados suelen funcionar más lentamente que un programa C análogo ejecutado directamente en el procesador debido al intérprete intermediario.
Estructura básica de un programa en Python
Para darte una idea del lenguaje Python, primero te brindaremos una descripción general de su sintaxis. La palabra sintaxis proviene del griego y significa "estructura de la oración". La sintaxis de un lenguaje de programación es la descripción completa de construcciones permitidas y prohibidas. La sintaxis está definida por una gramática que debe ser respetada por el programador. Si no lo haces, se activará el conocido error de sintaxis.
Python le da al programador instrucciones muy precisas sobre cómo estructurar el código fuente. Aunque los programadores experimentados pueden ver esto como una limitación, esta característica beneficia especialmente a los programadores novatos, porque el código desestructurado y desordenado es una de las mayores fuentes de errores en la programación.
Básicamente, un programa de Python consta de declaraciones individuales, que en el caso más simple ocupan exactamente una línea en el código fuente. Por ejemplo, la siguiente instrucción imprime texto en la pantalla:
print("Hola Mundo")
Algunas declaraciones se pueden dividir en un encabezado de declaración y un cuerpo de declaración, donde el cuerpo puede contener más declaraciones:
Encabezado de declaración:
Declaración
...
Declaración
En un programa real de Python, esto puede verse así:
if x > 10:
print("x is greater than 10")
print("Second line!")
La afiliación del cuerpo al encabezado se especifica en Python mediante dos puntos al final del encabezado de la declaración y mediante una sangría más profunda del cuerpo de la declaración. La sangría se puede realizar utilizando tabulaciones y espacios, aunque se recomienda no mezclar ambos. Recomendamos una profundidad de sangría de cuatro espacios cada uno.
Python se diferencia aquí de muchos lenguajes de programación comunes, donde la asignación del encabezado y el cuerpo de la declaración se logra mediante llaves o palabras clave como begin y end.
Nota
El compilador de Python puede compilar sin dificultad un programa en el que se hayan utilizado espacios y tabulaciones, ya que cada pestaña se reemplaza internamente por ocho espacios. Sin embargo, esto puede causar errores difíciles de encontrar porque muchos editores usan un ancho de tabulación de cuatro espacios por defecto. Esto hace que ciertas secciones del código fuente parezcan estar igualmente sangradas cuando en realidad no lo están.
Configura tu editor para reemplazar automáticamente cada tabulación con espacios, o usa solo espacios para sangrar tu código.
Quizás te preguntes ahora cómo las declaraciones que se ejecutan en varias líneas son compatibles con el modo interactivo, en el que solo se puede editar una línea a la vez. Bueno, en general, intentaremos evitar el modo interactivo cuando una muestra de código tiene varias líneas. Sin embargo, la pregunta está justificada. La respuesta es que las sentencias se introducen de forma bastante intuitiva línea por línea. Cuando el intérprete detecta que una instrucción aún no está completa, cambia el indicador de >>>
a ...
. Ingresemos el ejemplo anterior en el modo interactivo:
>>> x = 123
>>> if x > 10:
... print("El intérprete está haciendo un buen trabajo")
... print("¡Segunda linea!")
...
El intérprete está haciendo un buen trabajo
¡Segunda linea!
Ten en cuenta que debes considerar la profundidad de sangría actual, incluso si una línea comienza con ...
. Además, el intérprete no puede detectar automáticamente el final del cuerpo de la declaración, ya que puede contener cualquier cantidad de declaraciones. Por este motivo, el cuerpo de una declaración en modo interactivo debe finalizar presionando la tecla ENTER
.
Envolviendo líneas largas
Básicamente, las líneas del código fuente pueden tener cualquier longitud. Sin embargo, muchos programadores limitan la longitud de las líneas de su código fuente para que, por ejemplo, varios archivos de código fuente quepan uno al lado del otro en la pantalla o el código se pueda leer cómodamente en dispositivos con un ancho de línea fijo. La longitud máxima de línea común es de 80 o 120 caracteres. Entre paréntesis, puedes ajustar el código fuente como quieras:
>>> var = (
... 10
... +
... 10
... )
>>> var
20
Sin embargo, en muchos otros lugares donde no se permiten paréntesis, estarás sujeto a las estrictas reglas sintácticas de Python. Al utilizar la notación de barra invertida, es posible dividir el código fuente en una nueva línea en casi cualquier posición:
>>> var \
... = \
... 10
>>> var
10
En general, una barra invertida se puede colocar en cualquier lugar donde podría haber estado un espacio. Por lo tanto, también es posible una barra invertida dentro de una cadena:
>>> "Hola \
... Mundo"
'Hola Mundo'
Sin embargo, ten en cuenta que al sangrar la parte envuelta de la cadena se escribirán espacios en la cadena. Por este motivo, deberías preferir la siguiente variante de escribir una cadena en varias líneas:
>>> "Hola " \
... "Mundo"
'Hola Mundo'
Unir varias líneas
Así como divides una declaración de una sola línea en varias líneas usando la barra invertida, puedes combinar varias declaraciones de una sola línea en una sola línea. Para ello, las declaraciones están separadas entre sí por un punto y coma:
>>> print("Hola"); print("Mundo")
Hola
Mundo
Las declaraciones que constan de un encabezado y un cuerpo de declaración también se pueden colocar en una línea sin usar punto y coma, siempre que el cuerpo de la declaración en sí no conste de más de una línea:
>>> x = True
>>> if x: print("Hola Mundo")
...
Hola Mundo
Si el cuerpo de la declaración tiene varias líneas, se pueden combinar con un punto y coma:
>>> x = True
>>> if x: print("Hola"); print("Mundo")
...
Hola
Mundo
Todas las declaraciones unidas por un punto y coma se tratan como si tuvieran la misma sangría. Los dos puntos por sí solos aumentan la profundidad de la sangría. Por esta razón, en el ejemplo anterior, no hay forma de escribir una declaración en la misma línea que ya no esté en el cuerpo de la declaración if
.
Nota
El uso excesivo de la barra invertida y especialmente el punto y coma da como resultado rápidamente un código ilegible. Por lo tanto, debes utilizar ambas notaciones sólo si crees que favorecen la legibilidad y la claridad.
El primer programa
Como introducción a la programación con Python, ahora crearemos un pequeño programa de muestra: el juego Adivinando números. La idea del juego es la siguiente: el jugador debe adivinar un número especificado en el programa. Para ello, pueden realizar tantos intentos como quieran. Después de cada intento, el programa les informa si el número adivinado era demasiado grande, demasiado pequeño o exactamente correcto. Una vez que el jugador adivina el número, el programa imprime el número de intentos y sale. Desde el punto de vista del jugador, todo debería verse así:
Adivina: 42
Demasiado pequeño
Adivina: 10000
Demasiado grande
Adivina: 999
Demasiado pequeño
Adivina: 1337
¡Genial, solo te tomó 4 intentos!
Pasemos ahora del protocolo de flujo a la implementación real en Python.
secret = 1337
attempt = -1
counter = 0
while attempt != secret:
attempt = int(input("Adivina: "))
if attempt < secret:
print("Demasiado pequeño")
if attempt > secret:
print("Demasiado grande")
counter = counter + 1
print("¡Genial, solo te tomó", counter, "intentos!")
Analicemos ahora en detalle cada parte de este programa.
Inicialización
Durante la inicialización, se crean las variables necesarias para el juego. Python distingue entre diferentes tipos de datos, como cadenas, enteros o flotantes. El tipo de variable se determina en tiempo de ejecución del programa en función del valor que se le asigna, por lo que no es necesario especificar un tipo de datos explícitamente. Una variable puede cambiar de tipo en el transcurso del programa.
En nuestro juego, se crean variables para el número buscado (secret
), la entrada del usuario (attempt
) y el contador de intentos (counter
) y se les asignan valores iniciales. El hecho de que attempt
y el secret
tengan valores diferentes al comienzo del programa garantiza que el ciclo realmente comenzará.
Encabezado de bucle
Se inicia un bucle while
. Un bucle while
se ejecuta siempre que se cumpla la condición nombrada en el encabezado del bucle (attempt != secret
); en este caso, hasta que las variables attempt
y secret
tengan el mismo valor. Desde la perspectiva del usuario, esto significa que el bucle se ejecuta hasta que la entrada del usuario coincide con el número que se va a adivinar.
El cuerpo del bucle que pertenece al encabezado del bucle se puede reconocer porque las líneas siguientes se han sangrado un paso más. Tan pronto como el sangrado se mueve nuevamente un paso hacia la izquierda, el cuerpo del bucle termina.
Cuerpo de bucle
En la primera línea del cuerpo del bucle, se lee un número ingresado por el jugador y se almacena en la variable attempt
. La entrada del usuario se lee usando input("Adivina: ")
y se convierte a un número entero con int()
. Esta conversión es importante porque la entrada del usuario generalmente se lee como una cadena. En nuestro caso, sin embargo, queremos seguir usando la entrada como un número. La cadena "Adivina: "
se muestra antes de la entrada y se utiliza para solicitar al usuario que ingrese el número.
Después de la lectura, se comprueba individualmente si el número ingresado attempt
es mayor o menor que el número secreto buscado secret
y se imprime el mensaje correspondiente. Finalmente, el contador de intentos counter
se incrementa en uno.
Una vez que se incrementa el contador de intentos, el cuerpo del bucle finaliza porque la siguiente línea ya no tiene sangría debajo del encabezado del bucle.
Salida en pantalla
La última línea del programa no forma parte del cuerpo del bucle. Esto significa que no se ejecuta hasta que el ciclo se ejecuta por completo, es decir, hasta que se gana el juego. En este caso, se muestra un mensaje de éxito y el número de intentos necesarios. El juego ha terminado.
Ahora crea tu primer programa Python escribiendo el código del programa en un archivo llamado game.py
y ejecutándolo. Cambia el valor inicial de secret
y juega.
Comentarios
Seguramente puedes imaginar que el objetivo no es escribir programas que quepan en una postal. Con el tiempo, el código fuente de tus programas se volverá más extenso y complejo. En algún punto llega el momento en que el mero entrenamiento de la memoria ya no es suficiente para realizar un seguimiento de las cosas. Ahí es cuando entran al juego los comentarios.
Un comentario es un pequeño fragmento de texto que explica una determinada parte del código fuente para señalar problemas, tareas abiertas o cosas similares. El intérprete ignora un comentario, por lo que no cambia el flujo del programa.
La forma más sencilla de escribir un comentario es utilizar un comentario de línea. Este tipo de comentario comienza con el carácter #
y termina al final de la línea:
# Un ejemplo con comentarios
print("Hola Mundo!") # Salida Hola Mundo simple
Para comentarios más largos, un comentario en bloque es una buena opción. Un comentario de bloque comienza y termina con tres comillas consecutivas:
""" Este es un comentario en bloque,
puede extenderse a varias líneas. """
Los comentarios sólo deben utilizarse si contribuyen a la comprensión del código fuente o contienen información valiosa. Comentar cada línea, por poco importante que sea, lleva a que los árboles no dejen ver el bosque.
En caso de error
Quizás ya hayas jugado con el programa de muestra de la lección anterior y te hayas encontrado con el siguiente resultado o uno similar del intérprete:
File "hello_world.py", line 10
if attempt < secret
^
SyntaxError: expected ':'
Este es un mensaje de error que indica un error de sintaxis en el programa.
¿Puedes decir cuál es exactamente el error en este caso? Correcto: faltan los dos puntos al final de la línea.
Python proporciona información importante al generar un mensaje de error, lo cual es útil para solucionar problemas:
- La primera línea del mensaje de error indica en qué línea y dentro de qué archivo se produjo el error. En este caso, es la línea 8 del archivo
hello_world.py
. - La parte central muestra la sección afectada del código fuente, con la ubicación exacta a la que se refiere el mensaje marcada con una pequeña flecha. Es importante que este sea el lugar donde el intérprete pueda detectar el error por primera vez. Este no es necesariamente el mismo lugar donde se cometió el error.
- La última línea especifica el tipo de mensaje de error (en este caso,
SyntaxError
). Estos son los mensajes de error más comunes. Indican que el compilador no pudo seguir compilando el programa debido a un error formal.
Además del error de sintaxis, existen otros tipos de errores, que no se pueden analizar en detalle aquí. Sin embargo, nos gustaría resaltar el IndentationError
porque los principiantes en Python lo encuentran a menudo. Para demostrar esto, intenta ejecutar el siguiente programa:
i = 10
if i == 10: print("Sangría incorrecta")
Puedes ver que la última línea debería tener una sangría un paso más a la derecha. Tal como está escrito el programa ahora, la declaración if
no tiene cuerpo de declaración. Esto no está permitido y se produce un error de sangría IndentationError
:
File "indent.py", line 3
print("Sangría incorrecta")
^
IndentationError: expected an indented block after 'if' statement on line 2
Ahora que nos hemos familiarizado con estos conceptos básicos, podemos pasar a las estructuras de control que permiten a un programador controlar el flujo del programa.
Nota
Con Python 3.10 y 3.11, se han revisado muchos mensajes de error comunes, así como su formato general. Por lo tanto, si utilizas una versión anterior de Python, los resultados reales que veas pueden diferir de los impresos en este curso.