0% encontró este documento útil (0 votos)
25 vistas194 páginas

Introducción y instalación de Python

Python es un ​lenguaje de programación​. Los lenguajes de programación son lenguajes que  pueden ser interpretados por máquinas y a su vez pueden ser leídos y escritos por humanos.  Evidentemente, es necesario comprender el lenguaje para poder leerlo y escribirlo, de la  misma forma que es necesario saber un idioma para hablarlo y entenderlo. 

Cargado por

JURAMA33
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
25 vistas194 páginas

Introducción y instalación de Python

Python es un ​lenguaje de programación​. Los lenguajes de programación son lenguajes que  pueden ser interpretados por máquinas y a su vez pueden ser leídos y escritos por humanos.  Evidentemente, es necesario comprender el lenguaje para poder leerlo y escribirlo, de la  misma forma que es necesario saber un idioma para hablarlo y entenderlo. 

Cargado por

JURAMA33
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

TEMA 1

Conceptos previos e instalación

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

ÍNDICE

¿Qué es Python? 2

¿Qué voy a aprender en este curso? 4

¿Cómo es un tema o unidad? 6

¿Cómo se aprende a programar? 8

Instalando Python 10
Windows 10
Mac 10
Linux 12

Usando la IDLE de Python 3 14

Editor de código 15

Processing 17
Mac y Windows 17
Linux 18
Instalación de Python para Processing 18

¡A programar! 20

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

¿Qué es Python?
Python es un ​lenguaje de programación​. Los lenguajes de programación son lenguajes que
pueden ser interpretados por máquinas y a su vez pueden ser leídos y escritos por humanos.
Evidentemente, es necesario comprender el lenguaje para poder leerlo y escribirlo, de la
misma forma que es necesario saber un idioma para hablarlo y entenderlo.

Pero, como lenguaje de programación, Python tiene muchas ventajas frente a otros
lenguajes habitualmente usados (C, C++, Java, JavaScript…). La principal de todas es una
consecuencia lógica de cómo fue creado.

Python surgió a finales de los ochenta, creado por Guido van Rossum, con la intención de
convertirse en un lenguaje de programación con una sintaxis que favoreciese un código
legible. Es decir, Python se caracteriza por ser un lenguaje fácil de leerse y escribirse. Los
programadores usan a veces la expresión “Python se lo traga todo”, ya que en Python son
válidas muchas expresiones que darían error en otros lenguajes.

Ésto no quiere decir que Python sea un lenguaje para aprender a programar, para niños o sin
potencial. Python es un lenguaje de programación ​multipropósito​, podemos utilizarlo para
programar aplicaciones, videojuegos, animaciones, páginas web, simples scripts de texto…
Es muy usado en el entorno profesional y en el educativo.

Así mismo, Python es un lenguaje pensado para ser interpretado, es decir, poder ser
ejecutado directamente mediante un intérprete sin tener que compilarlo y convertirlo a
lenguaje máquina. Si no has entendido correctamente este párrafo no te preocupes, no es
determinante ahora mismo.

Desde mi experiencia, Python resulta un lenguaje tremendamente útil y sencillo para


múltiples aplicaciones y permite centrarse más en c ​ ómo se ejecuta​ y menos en ​cómo se
escribe correctamente​. Mi experiencia con otros lenguajes me dice que se emplea mucho
tiempo en aprender la sintaxis, por lo que los cursos sobre los mismos suelen enseñar poco
a cómo pensar y programar y se centran en aprender a escribirlo, es decir, picar código
(expresión que se usa en programación para definir al hecho de programar en un lenguaje
concreto sin hacer cosas realmente interesantes).

Al aprender Python, el usuario se puede centrar más en ver la utilidad que en aprender
cientos de cosas que no aparentan utilidad ninguna. Digamos que facilita un aprendizaje
similar al que se dá cuando se aprende a hablar: primero aprendes a decir cosas útiles y
posteriormente ya vas interiorizando la gramática y cómo se estructura el lenguaje, pero lo
primero es decir “hambre”, “sueño”, “caca”...

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Por último, Python debe su nombre a la admiración que su creador profesaba al grupo
cómico inglés Monty Python, de ahí que muchos cursos y recursos en la red utilizan clichés
de la filmografía del grupo. Es normal encontrar expresiones como n
​ í​ (Los Caballeros de la
Mesa Cuadrada) o P ​ ijus Magnificus​ (La Vida de Bryan).

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

¿Qué voy a aprender en este curso?


En este curso nos vamos a centrar en ver las instrucciones básicas de Python (y de
cualquier lenguaje de programación), enmarcándolas en casos prácticos y útiles. Esto no
quiere decir que sean útiles para todo el mundo, es complicado encontrar una aplicación
que sea universal para cada concepto, pero seguro que podrás ver que lo que haces puede
ser útil en algún contexto.

Por ello, es importante que interiorices lo que se explica a continuación para no sentirte
angustiado ni decepcionado a lo largo del curso:

● Vas a aprender gradualmente todo lo básico que requiere cualquier lenguaje de


programación, pero quizá no nos centraremos tanto en cada una de las opciones de
cada uno de los puntos tratados sino más bien en entender su utilidad.

● Por suerte, Python es un lenguaje muy usado por programadores, makers y personas
que apoyan el mundo del software libre, por lo que internet está colmado de páginas
de ayuda y consejos así como de ejemplos resueltos. Es importante que acudas a
internet siempre que tengas alguna duda, es la forma de aprender a solucionar
aquellas inquietudes que te surgirán tras acabar el curso.

● Algunas unidades van a ser más centradas en un concepto y otras algo más
dispersas debido al ejercicio que se resuelve en la misma, pero en todas se
trabajarán conceptos necesarios para programar.

● A lo largo de los temas se plantearán retos o se pedirá que intentes cosas antes de
continuar. La única forma de encontrarse con dificultades y estar preparado para
adquirir conocimiento es desde el interés y para ello es necesario intentarlo primero
para ver dónde hay dificultades. Es muy recomendable tomarse en serio trabajar las
unidades intentando aquellas cosas que se propongan a lo largo de la teoría.

● Los vídeos son breves apoyos para asentar un poco mejor conceptos clave, pero la
unidad central es el documento escrito. Intenta trabajarlo a fondo y, tras ello, antes
de realizar el test y las actividades, podrás ver los vídeos para asentar. En algunas
unidades se comentará el momento en que deberías ver algún vídeo explicativo.

● Aprender realmente a programar requiere mucho tiempo y trabajo. Es una labor


bonita y generalmente muy motivadora, pero requiere batallar una y otra vez con
ciertos problemas, volver a incurrir en errores y tener ​paciencia​. Hoy en día, en el
medio tecnológico que vivimos, la paciencia es un don que empieza a escasear y sin
ella programar se convierte en un tormento. Disfruta de conseguir solucionar tus

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

propios problemas, disfruta del proceso de aprendizaje, de mejorar tus propios


programas…

Una vez terminado el curso serás capaz de usar directamente Python, de crear archivos de
Python que se ejecuten, de utilizar archivos de Python y archivos de texto de manera
coordinada y de usar Python para generar una salida gráfica (incluso crearás un videojuego).

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

¿Cómo es un tema o unidad?


Cada tema (a excepción de éste primero, por ser un tema introductorio) tiene la misma
estructura:

● Un documento de teoría que incluye ejercicios resueltos y a lo largo del cual se


plantean preguntas breves y pequeños retos.

● Una serie de vídeos de apoyo en los cuales se explican con detenimiento algunos de
los conceptos relevantes del tema tratado.

● Una recopilación de todas las instrucciones de código nuevas trabajadas en la


unidad, que se encuentra al final del documento de teoría.

● Uno o dos retos para trabajar sobre los conceptos desarrollados. No es obligatorio
entregarlos pero seguramente realizar estos retos marque la diferencia entre asentar
realmente o no los contenidos de la unidad. Si tienes problemas con ellos usa el foro
o el correo interno para solucionarlos.

● Una serie de preguntas tipo test para ver si tienes claros algunos conceptos clave.

Algunos temas son bastante abiertos y otros son procesos bastante más guiados, pero
siempre plantearán retos o preguntas para que tengas que poner de tu parte en el
aprendizaje. No se trata de aprender a escribir lenguaje Python, se trata de aprender a
resolver problemas programando con lenguaje Python, y ello conlleva pensar.

Por último, se ha trabajado el lenguaje de los textos enfocándolo a personas que no saben
programar, por ello se ha incurrido en algunos aspectos que podrían considerarse
problemáticos a los ojos de un programador experimentado pero que facilitan el
aprendizaje:

● Al programar, se usa el castellano. Sí, las instrucciones de código son en inglés, pero
todo lo que podemos definir como usuarios (nombres, descripciones…) están en
castellano. No es una práctica recomendable porque muchos lenguajes de
programación dan errores con caracteres no anglosajones (la ñ, por ejemplo) pero
para un principiante facilita la comprensión del código.

● No hay comentarios en muchos programas. Los comentarios son descripciones que


hace el usuario en el programa y que Python no tratará de entender, sirven para
aclarar para qué sirve cada parte. La ausencia de los mismos se debe a que quiero
que entiendas el código puro, sin explicaciones del mismo. No es buena práctica
programar sin comentar porque al final no entiendes ni tú mismo qué hace cada

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

parte del código, así que trata de comentar tus propios programas. Los míos están
huérfanos de comentarios para obligarte a entender el código puro.

● Se usan descripciones sencillas y no estrictamente correctas. A veces es más


complicado entender ciertas expresiones que entender lo que significan, por lo que
no he puesto énfasis en llamar a cada cosa con su nombre correcto y preciso, sino
que muchas veces se usan palabras que tienen un significado más claro para el
usuario no experto en programación. En el futuro seguramente cambies la forma de
llamar a ciertas instrucciones, procesos, etc, pero actualmente es mejor centrarse en
aprender Python.

● Intenta guardar TODOS los programas que hagas, organiza una carpeta y ve
almacenándolos por temas de manera que los tengas accesibles, seguro que podrás
reutilizar muchos de ellos.

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

¿Cómo se aprende a programar?


Por encima de todo, estoy muy en contra de los cursos que enseñan instrucciones de código
con ejemplos absurdos e inútiles. Es cierto que inicialmente es complicado proponer
ejemplos útiles pero siempre se puede indicar cómo podría ser útil en un futuro más
complejo.

Para aprender a programar hay que aprender a pensar como lo hace una máquina, es decir,
pensar computacionalmente.​ Esto significa que hay que pensar en etapas y procesos, lo
cual siempre tiene dos partes:

● A alto nivel, es decir, sin profundizar mucho, hay que identificar las partes
individuales que, en caso de ser resueltas, consiguen resolver el problema.

● A bajo nivel, es decir, profundizando ya en el lenguaje de programación, hay que


interpretar mentalmente las secuencias que resuelven cada parte del problema que
hay que resolver, especialmente en qué orden hay que ejecutarlas.

Pongamos un ejemplo de cómo se resuelve un problema en la vida cotidiana. Problema: no


tengo dónde poner todos mis libros. Lo cual quedaría resuelto si consiguiese una estantería,
así que voy a construirla.

Solución a alto nivel:

1. Ir a comprar materiales.

2. Construir la estantería.

3. Ubicarla en el sitio idóneo.

4. Colocar los libros.

Una vez he realizado esta estructura (habitualmente mental) tengo que pensar si cada una
de las etapas puede ser resuelta de forma individual (por ejemplo, si quiero derrotar a
Superman y necesito Kriptonita no tengo que pensar en solucionar el problema porque no
puedo conseguir Kriptonita). Si una etapa no puede ser resuelta tal como está planteada se
puede buscar una alternativa y si existe seguirá siendo un problema con solución.

Este proceso facilita mucho la asimilación del problema y ayuda a enfocarlo por etapas.

Solución a bajo nivel:

1. Iré a comprar los materiales al centro de bricolage que más cerca tengo.

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

2. Compraré tablas de madera para las baldas, tablones largos para la estructura y
clavos y tornillos para sujetarlo todo.

3. Compraré barniz para proteger la madera.

4. Construiré primero la estructura.

5. Ubicaré la estantería en su lugar antes de colocar las baldas.

6. Colocaré las baldas y las aseguraré antes de utilizarlas.

7. Organizaré los libros por temáticas.

8. Colocaré los libros de forma que cada temática esté en una zona de la estantería…

Puede parecer un proceso simplón o un ejemplo absurdo, pero la realidad es que un


programador desarrolla una capacidad innata para pensar en etapas. Es mucho más
importante desarrollar esta forma de pensar que aprender un lenguaje concreto. Por ello, es
recomendable profundizar en un único lenguaje y no aprender muchos de forma poco
inmersiva.

Otra cosa importante para aprender a programar es entender que sólo la práctica afianza las
competencias en un lenguaje y sólo la práctica acaba desarrollando la capacidad de
identificar cuando un lenguaje de programación puede ayudarte para resolver un problema.

Otra cosa importante para aprender a programar es aprender a ​cambiar de actividad​.


Muchas veces te atascarás en un problema y no encontrarás solución alguna y en esa
situación a veces conviene levantarse a beber agua, dar una vuelta, ir a hablar a alguien
sobre el problema… de esta forma puedes encontrar una solución que no se te ocurre en el
fragor de la batalla. Los estadounidenses denominan a ésto “pensar fuera de la caja”, ya que
muchas veces desde dentro del problema no ves su solución.

Por último, el mundo necesita programadores, sí, pero cada vez hay más. Lo que el mundo
necesitará muy pronto son ideas más que programadores. Es cierto que ahora mismo hacen
falta programadores, hay déficit de gente que sepa escribir código, pero no es menos cierto
que por aprender a programar no vas a tener la vida resuelta. Hace falta ​aprender qué
programar​.

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Instalando Python
Actualmente coexisten dos versiones de Python, que son usadas y tienen ligeras diferencias
en la forma de escribir instrucciones y en la cantidad de recursos de los que disponen.

Por un lado está ​Python 2​, que actualmente (noviembre del 2016) está en su versión 2.7.12.
Es una versión muy utilizada, especialmente por la gran cantidad de bibliotecas y recursos
creados para ella.

Por otro lado está ​Python 3​, que actualmente (noviembre del 2016) está en su versión 3.5.2.
Está siendo cada vez más usada pero todavía existen bibliotecas de Python 2 que no se
encuentran para Python 3​. A​ un así, por ser la última, en este curso vamos a utilizar siempre
y únicamente esta versión.

Para usar Python en Mac y Linux tenemos la opción de instalarlo y lo reconocerá el propio
sistema operativo, pudiendo ejecutarlo desde Terminal. Si lo queremos utilizar en Windows
necesitaremos un programa denominado IDLE (entorno de desarrollo integrado) que nos
permite ejecutar programas con lenguaje Python. Esta última opción también existe para
Mac y Linux.

Veamos por separado los diferentes sistemas operativos.

Windows
En el sistema operativo Windows vamos a utilizar la IDLE de Python. Puedes descargarla en
el siguiente enlace:

[Link]

En el mismo encontrarás las últimas versiones de Python listas para descargarse. Descarga
la versión más actual de Python [Link] vez descargada, instala el .exe y ya podrás usar la
IDLE de Python. Más adelante se explica cómo usarla.

Mac
Para instalar Python en Mac usaremos el siguiente enlace:

[Link]

En el mismo podrás encontrar las últimas versiones disponibles de Python para


descargarse. Descarga la versión más actual de Python 3:

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Al pulsar en el botón de descarga (download) se descargará un archivo .pkg que tendremos


que abrir. Es un paquete que contiene todo lo necesario para poder usar Python tanto desde
Terminal​ como usando la I​ DLE.​ Al abrir el .pkg se abrirá un instalador:

Una vez instalado podremos usarlo. Para usarlo ​por Terminal​ sólo tendrás que abrir una
Terminal (Aplicaciones → Utilidades → Terminal) y escribir Python3:

El aspecto de tu Terminal puede variar, ya que se puede configurar tanto su fondo como su
letra, tamaño, etc.

Para cargar un programa de Python (terminados en .py) desde Terminal tendremos que
ubicarnos en la ubicación donde está el programa y cargarlo desde ahí escribiendo ​Python3
nombre_del_archivo.py​. Observa la imagen para entender el proceso:

Nota: conviene fijar la Terminal en el Dock, ya que la usarás frecuentemente en este curso.

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Para usar Python desde la I​ DLE s


​ ólo tendrás que buscar su ubicación una vez instalada,
generalmente está dentro de una carpeta llamada Python ubicada en Utilidades.

Pinchando en el icono de la IDLE abriremos el programa:

Más adelante veremos cómo usar la IDLE, ya que se usa de la misma forma para los tres
sistemas operativos.

Linux
En el caso de Linux nos vamos a centrar en distribuciones GNU/Linux, siendo Ubuntu el
sistema operativo más habitual.

En dicho sistema operativo Python viene instalado por defecto, si bien no tiene porqué ser
Python 3 la versión instalada. Para obtener Python 3 simplemente tendremos que abrir un
Terminal y escribir:

sudo apt-get install python3

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Si ya está instalado Python 3 simplemente nos informará de que esa versión ya está
instalada:

Si la versión que viene por defecto es Python 3 quizá convenga que instales, para el futuro,
Python 2.7, ya que si sigues avanzando en la programación con Python puedes encontrar
funcionalidades que quieras implementar en Python 2:

sudo apt-get install python2.7

Por otro lado, para obtener la IDLE de Python 3 tendremos que instalarla igualmente desde
Terminal:

sudo apt-get install idle

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Usando la IDLE de Python 3


Vamos a ver rápidamente cómo usar la IDLE de Python 3. Dicha IDLE tiene directamente un
interpretador de código Python. En el mismo podemos escribir instrucciones y se ejecutarán
si tienen sentido para Python.

Cualquier proceso que yo explique ejecutándolo por Terminal (uso un Mac) se puede
reproducir exactamente igual por Terminal en Linux o en la IDLE de Python 3 en cualquier
sistema operativo.

Así mismo, con la IDLE podemos abrir programas guardados con extensión .​ py​,
simplemente hay que abrirlo desde la pestaña superior F
​ ile ​o ​Archivo​:

Una vez abierto, para ejecutar el programa sólo tendremos que seleccionar la opción ​Run
module d
​ e la barra de herramientas R​ un​. También sirve presionar F5:

El ejemplo anterior se ha realizado cargando un archivo de Python propio, no intentes


reproducirlo, sólo recuerda cómo se podía ejecutar un archivo .​ py.

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Editor de código
Un editor de código es un editor de texto que reconoce, por la extensión del archivo que
carguemos en el mismo, el lenguaje en el que está escrito el código y lo muestra editado
resaltando las diferentes partes y favoreciendo tanto la lectura como la escritura rápida de
código.

A la hora de escribir programas de Python es muy recomendable usar un editor de código y


guardar los archivos, abriéndolos después desde la IDLE o Terminal.

Para este curso voy a recomendar un editor de código: A


​ tom.​ En el mismo podemos escribir
en muchos lenguajes de programación e incluso archivos de texto al uso. Descárgalo para
tu sistema operativo desde este enlace:

[Link]

Una vez lo descargues e instales ábrelo para familiarizarte con él:

La imagen corresponde a Atom en un Mac, pero se muestra similar en Linux y Windows.

Atom no reconocerá el tipo de código que estamos usando hasta que no guardemos el
documento y declaremos su extensión. Al guardarlo hay que indicar q ​ ué tipo de lenguaje
contiene​ con una extensión. Los archivos de Python terminan en .​ py​, por lo que a la hora de
guardar un archivo deberemos indicar un nombre y añadir la extensión mencionada:

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

También podemos elegir la ubicación del archivo a la hora de guardarlo. Una vez lo elijamos,
Atom automáticamente mostrará en una barra lateral izquierda todos los archivos que
contiene la carpeta donde has guardado el mencionado archivo:

Cuando, a lo largo del curso, te inste a guardar un programa acuérdate de abrir Atom y
hacerlo desde ahí.

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Processing
Para los dos últimos temas vamos a utilizar un nuevo programa. Se trata de Processing, un
entorno de desarrollo que, en sus comienzos, trabajaba con java. Actualmente permite
trabajar usando lenguaje Python además de java.

Puedes descargar Processing para tu sistema operativo en el siguiente enlace:

[Link]

Al darle a instalar aparecerá una pestaña preguntando si quieres simplemente descargarlo o


descargarlo con un donativo. El software libre se mantiene a base de la gente que dona
pequeñas cantidades, puedes elegir no hacer donación o donar una pequeña cantidad y
descargarlo.

Una vez lo hayas descargado tendrás que abrirlo, proceso que se complica algo en Linux.

Mac y Windows
Sólo tendrás que abrir el archivo descargado, no necesita instalación.

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Linux
Para usar Processing en Linux tendrás que descargarlo desde la URL mencionada. Una vez
descargado ve a la carpeta que contiene el .tgz que se descargará y extráelo en esa carpeta:

Una vez descargado y extraído viene la parte más complicada. Processing no necesita
instalación y en Línux hay que cargarlo, siempre que queramos usarlo, desde Terminal.

Para ello debes abrir Terminal y buscar la ubicación de la carpeta donde se encuentra
Processing. Una vez ahí carga la carpeta (​cd Processing-3.2.3​) y una vez ubicado dentro de
ella carga Processing con ./processing:

Este proceso habrá que hacerlo cada vez que queramos abrir Processing, por lo que
recomiendo renombrar la carpeta extraída del .tgz con el nombre de ​processing​ y ubicarla en
un lugar conocido (escritorio, por ejemplo). De esta forma el proceso será más sencillo:

cd Escritorio → cd processing → ./processing

Instalación de Python para Processing


Desde la ventana abierta podemos desplegar una pestaña de lenguajes, que por defecto
viene con ​Java​ seleccionado. Al desplegarla seguramente sólo tengas como opción para
seleccionar Java y una segunda opción que será ​Añadir modo.​ Selecciona dicha opción y
entrarás en una nueva ventana donde podrás instalar otros lenguajes para usar en
Processing:

18
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación

Si no aparece ​Python Mode for Processing 3​ busca en la pestaña F​ ilter​ la palabra Python y
te aparecerá. Una vez encuentres el lenguaje Python instálalo para poder usarlo.

19
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 1: Conceptos previos e instalación

¡A programar!
Con ésto tienes lo necesario para empezar el curso y poder trabajar. Espero y deseo que a lo
largo del curso afrontes con ilusión los retos que el propio aprendizaje te va a deparar. No
tengas miedo en preguntar lo que haga falta pero intenta antes solucionarlo por tu propia
iniciativa, es mucho más gratificante.

Nos vemos en el tema 2.

20
TEMA 2
Input - Output y Variables

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

ÍNDICE

Nuestro primer programa 2

Interaccionando con el programa 4

Variables 7

Modificando variables 9

Operando variables 10

Profundiza 13

Instrucciones de código usadas 16

Reto 17

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Nuestro primer programa


Vamos a realizar nuestros primeros programas en Python. Como ya hemos visto en el tema
1, podemos trabajar en Python desde un archivo con extensión .py o directamente desde la
IDLE o, en caso de Linux o Mac, desde Terminal una vez instalada la versión de Python que
queremos usar.

Vamos a usar Python 3 y vamos a comenzar con la terminal o la IDLE. Nuestro primer paso
va a ser m
​ ostrar un texto​ como resultado de un proceso que realice Python. En los vídeos se
explica un poco más este proceso, pero casi siempre todo primer programa en un lenguaje
de programación empieza con un “​Hola mundo” ​(si tienes curiosidad puedes buscar por qué
se usa la expresión Hola mundo en programación).

En nuestro caso, vamos a hacer que Python nos muestre el texto “Hola mundo” desde
Terminal. Para ello vamos a cargar Python 3 y vamos a pedirle que muestre (o imprima) el
texto “Hola mundo”. Usaremos el comando p ​ rint​, que indica al programa que debe mostrar
algo al usuario. Nosotros como usuarios debemos indicarle a Python qué es lo que debe
mostrar (un texto, un número, el resultado de una operación…).

Para conseguir que nos muestre un texto, debemos utilizar comillas para delimitar el texto,
es la forma en la que Python sabe que debe ser literal y mostrarnos lo que pone entre las
mismas. Más adelante verás con más claridad por qué usar comillas para delimitar el texto
(a partir de ahora al texto lo llamaremos s
​ tring​).

Así mismo, debemos usar paréntesis para englobar lo que queremos que Python imprima,
por lo que escribiremos en nuestra terminal lo siguiente:

print​ ​(​"Hola mundo")

Ahora prueba tú, abre la IDLE de Python o Python 3 en Terminal y escribe el comando
anterior. Prueba a cambiar el texto entre las comillas y observa lo que ocurre al presionar
intro.

A mucha gente en este punto se le ocurre cuestionar la utilidad de imprimir algo de esta
forma, especialmente porque el propio texto que imprimimos está escrito una línea más
arriba. Hay que entender que este proceso se aplica generalmente en medio de un programa

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

de Python (a partir de ahora ​script​) en el cual el usuario no ve el código, sólo lo que el


programa le enseña.

Vamos a practicar para comprenderlo mejor. Abre un documento (como hemos visto
puedes hacerlo desde un bloc de notas o, más recomendable, usando un editor de código
como ​Atom​). Guárdalo en el escritorio con el nombre de ​[Link]​. A continuación
escribe en dicho archivo la instrucción ​print (“Hola mundo”)​ y vuelve a guardarlo. Por último,
ejecuta el archivo desde Terminal o desde la IDLE y mira lo que te muestra antes de
continuar.

¿Ya lo has hecho? Como podrás observar, al cargar dicho archivo Python no nos muestra el
código y la instrucción ​print​, por lo que la salida que el usuario (en este caso nosotros)
obtiene es el texto que había que imprimir. A este proceso se le denomina o ​ utput​ o salida de
datos desde el programa hacia el usuario.

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Interaccionando con el programa


Ya sabemos cómo imprimir un ​string​ usando Python, pero el usuario en un s​ cript c
​ omo el
anterior no puede más que ejecutarlo y recibir lo que el programa le muestra, no hay ningún
tipo de interacción usuario - programa.

Vamos a intentar construir nuestro primer programa en el cual se produzca una entrada de
datos del usuario hacia el programa y el programa con esos datos dé una respuesta. A este
flujo se le denomina ​input - output.

En nuestro ejemplo anterior, Python nos ha mostrado el texto ​Hola mundo​, pero quizá sería
mejor que el programa se aprendiese nuestro nombre y nos saludase (en lugar de saludar a
todo el mundo).

Si pensamos en cómo debería ser un programa que hiciese lo anteriormente descrito,


podríamos esquematizarlo de la siguiente forma:

El programa nos pregunta nuestro nombre → contestamos un nombre → el programa lo


almacena → el programa imprime un saludo y nuestro nombre.

En el proceso anterior hay una palabra clave: a


​ lmacena. P
​ ython no puede utilizar una
entrada de datos desde el usuario directamente (o, mejor dicho, no es una buena práctica).
Necesita guardarla en algún sitio y posteriormente utilizarla para el fin que hayamos
programado.

Realmente nuestro cerebro funciona de la misma forma, si una persona se presenta y nos
dice su nombre, nuestra memoria de trabajo almacena ese nombre y nosotros le
saludaremos utilizando su nombre. El asunto es que nuestro cerebro no necesita que le
indiquemos dónde tiene que almacenar ese nombre, es algo que ocurre y nosotros sabemos
utilizar: tenemos memoria (unos más que otros).

En cambio Python si necesita que le digamos cómo tiene que almacenar ese nombre. Como
a la hora de realizar el programa no sabemos qué va a contestar el usuario no podemos sino
decirle algo parecido a: “guarda la respuesta que te de con el nombre r​ espuesta​”. De esta
forma si quiero usar ese nombre que el usuario ha dado sólo tendré que decirle a Python
que utilice la r​ espuesta​.

Para almacenar algo que el usuario tenga que escribir usamos la función i​ nput​, de forma
que yo puedo imprimir directamente una respuesta que dé el usuario utilizando un comando
como el siguiente:

print​(​input​(​"¿Cuántos años tienes?: "​))

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Fíjate que hay un espacio tras los dos puntos de la pregunta. Los espacios también son
caracteres, en la siguiente captura de pantalla entenderás el por qué de ese espacio:

Si nos fijamos, el espacio tras los puntos permite que, al hacer la pregunta el programa y el
usuario dar una respuesta aparezca con cierta lógica y no todo pegado y sin espacios. Si
aún así no te ha quedado claro lo mejor es que pruebes ambas opciones y veas la
diferencia.

No es una buena práctica usar un input dentro de un print, lo mejor sería guardar primero la
respuesta y posteriormente utilizarla. Para ello necesitamos conocer el concepto de
variable.

Una variable, término del que hablaremos en profundidad en el siguiente punto de este
capítulo, no es más que un espacio en la memoria del dispositivo (ordenador, tablet, móvil…)
reservado para guardar un dato.

Para entender el concepto, si creo una variable es como si pusiese una caja en una
estantería donde puedo guardar cualquier cosa, ese espacio está en la estantería reservado
para guardar cosas y puede contener datos hasta que está llena.

En Python, las variables se crean poniéndoles un nombre, de forma que si yo quiero crear
una variable para almacenar un valor, tendré que nombrar el espacio donde va a estar
guardado el dato y posteriormente asignarle a ese espacio un valor o dato, por ejemplo:

name ​=​ ​"Alfredo"

En el ejemplo anterior Python reserva en su m


​ emoria de trabajo​ un hueco al que llama n
​ ame
y en ese hueco almacena el string “Alfredo”, de forma que yo puedo utilizar ese nombre en
cualquier momento en mi programa simplemente mencionando el hueco que lo contiene.

Para imprimir el nombre símplemente le tendré que decir a Python que imprima el hueco
name. F
​ ijate en el siguiente código:

name = "Alfredo"
print​(​name)

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Pruébalo en tu terminal o IDLE.

Como puedes ver, el programa imprime el contenido del hueco n


​ ame​, que para mi ejemplo
es el string A
​ lfredo​.

La instrucción p
​ rint​ tiene entre paréntesis un nombre sin comillas, es el momento de
entender por qué. Si pongo comillas imprimirá un string (un texto) y si no pongo comillas
pasará a imprimir el contenido de una variable (es decir, el contenido de un hueco en la
memoria).

Ahora vamos a combinar un texto fijo con el contenido de una variable. Para encadenar
textos sólo tengo que sumarlos con un signo +, como muestra el ejemplo:

name ​=​ input ​(​"¿Cómo te llamas?: ")


print​ ​(​"Hola, "​ ​+​ name)

Fíjate que he vuelto a dejar un espacio tras el ​Hola y​ la coma, para que el nombre
almacenado en la variable ​name​ aparezca con un espacio. Python va a imprimir un string y
una variable, si la variable n
​ ame​ contiene algo lógico imprimirá una frase lógica (por ejemplo
Hola, Alfredo​). En cambio Python no es capaz de discernir si el contenido de n ​ ame​ es lógico
o no. Por ejemplo podemos almacenar como input un espacio, un punto, números…:

El nombre 67 no tiene mucho sentido a nuestros ojos, pero Python no sabe de ojos (o
cerebros) humanos. Empezamos a entender aquí que la programación hará fielmente lo que
el programador indique (siempre y cuando sea algo que el programa pueda entender) pero
nunca supondrá que algo no tiene sentido o que debería advertir al usuario de un posible
error. Entiende por error algo que un humano pudiese razonar, no una instrucción errónea.

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Variables
Ya hemos visto brevemente lo que es una variable. Por ejemplo, si queremos almacenar un
número y usarlo en cualquier momento del programa declararemos la variable n ​ umber​ con
el valor que queramos:

number ​=​ 6

Ambas veces he usado como nombres para las variables textos vinculados al contenido,
pero no tiene porque ser así, podrías llamar e
​ lefante​ a una variable que contenga un número.
A la hora de declarar una variable debemos tener en cuenta que Python reconoce la
diferencia entre mayúsculas y minúsculas. Observa el siguiente ejemplo y lo entenderás:

Por ello, los programadores suelen evitar usar mayúsculas iniciales para las variables, así
evitan errores.

Una variable reserva un espacio en memoria para almacenar un dato y la memoria de un


ordenador no es infinita (si bien hoy en día y al nivel que vamos a programar en Python es
difícil que esto suponga un problema). Por ello existen diferentes tipos de variables que
llevan asociado un tamaño en memoria. Siguiendo con el símil de la caja en una estantería
podríamos decir que no necesitamos el mismo tamaño de caja para guardar naranjas que
para guardar sandías y, por extensión, cada caja ocupa un tamaño de la estantería y no
conviene almacenar una naranja en una caja para sandías.

De la misma forma, no necesitamos el mismo tamaño para guardar un número entero que
una frase. Eso sí, a diferencia de otros lenguajes de programación, en Python no hay que
indicar qué ​tipo de variable​ necesitas (es decir,​ cuánto espacio va a ocupar​), basta con dar
un nombre y un contenido y Python automáticamente, por el tipo de contenido, sabrá el tipo
de variable que es necesaria.

Inicialmente vamos a ver tres tipos de variables:

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

● Variables que contienen números enteros (en Python i​ nt​ d


​ e integer)​.

● Variables que contienen números decimales (en Python ​float​, de coma flotante).

● Variables que contienen texto (en Python s


​ tr ​de string).

A la hora de iniciar un programa o en diferentes partes del mismo vamos a necesitar


habitualmente crear variables. Podemos definirlas en líneas sucesivas...

number = 6
word ​=​ ​"hola"
decimal​ ​=​ ​3.14

… pero también podemos crear varias variables de manera simultánea separando sus
nombres por comas y los contenidos de cada una de ellas igualmente por comas:

number​,​ ​decimal​,​ word ​=​ ​6​,​ ​3.14​,​ ​"hola"

Saber de qué tipo es una variable a veces es bastante importante, pues hay determinadas
operaciones entre variables que sólo se pueden realizar si son del mismo tipo. Para saber el
tipo de una variable (​str, float o
​ ​int​) sólo tenemos que escribir el comando t​ ype​ y el nombre
de la variable entre paréntesis:

type ​(​name)

Veamo el proceso ejecutado:

Prueba a declarar varios tipos de variable con diferentes nombres (una que contenga un
nombre, una que contenga un número entero y otra que contenga un decimal) y pide a
Python que te muestre el tipo de variable de cada una.

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Modificando variables
En Python podemos, sin ningún problema, cambiar el contenido de una variable,
simplemente volvemos a declarar con el mismo nombre otro contenido:

​ ​ "
name = ​ Alfredo"
name =​ ​ "​ Pedro"

En el caso anterior, la variable n


​ ame​ contiene el string A
​ lfredo​ y posteriormente el programa
le asigna el contenido ​Pedro.

Si imprimimos la variable tras cada declaración veremos cómo, efectivamente, ha cambiado


el contenido:

En realidad Python no cambia el contenido sino que elimina la variable anterior y crea otra
con el mismo nombre y el contenido nuevo. De esta forma, podemos reasignar el contenido
a una variable aunque cambie el tipo:

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Operando variables
Las variables nos permiten operar con ellas siempre y cuando la operación tenga sentido
para el contenido. De esta forma se puede operar con variables con contenidos numéricos
como si operásemos con el contenido directamente:

number1​,​ number2 = ​ ​ ​6​,​ ​14


print​ ​(​number1 ​+​ number2)

Prueba el código anterior en Python.

También podemos almacenar el valor de la suma en una nueva variable:

number1​,​ number2 = ​ ​ ​6​,​ ​14


suma ​=​ number1 ​+​ number2
print​ ​(​suma)

El resultado es el mismo, pero la suma queda almacenada en una nueva variable por si
queremos usarla más adelante.

De la misma forma puedo restar, multiplicar o dividir variables.

Pero, ¿qué ocurre si opero strings?. Dos variables que contienen texto se pueden sumar,
prueba tu mismo el siguiente código:

word1​,​ word2 =​ ​ "​ Hello"​,​ ​"man"


print​ ​(​word1 +​ ​ word2)

Como verás, se suman las variables, aunque falta un espacio entre medias o algo que
delimite las diferentes variables, podemos solucionarlo con el siguiente código...

word1​,​ word2 =​ ​ "​ Hello"​,​ ​"man"


print​ ​(​word1 +​ ​ "​ "​ ​+​ word2)

… en el cual hemos sumado primero un espacio al final de la primera palabra y luego la


segunda palabra a la primera suma. Pruébalo también antes de seguir.

Vamos a ver ahora otro ejemplo de suma. Queremos realizar una suma de dos números que
elija el usuario. Para ello vamos a guardar dos ​input​ y vamos a imprimir su suma:

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

number1 ​=​ input​(​"Primer número a sumar: ")


number2 ​=​ input​(​"Segundo número a sumar: ")
print​ ​(​number1 ​+​ number2)

Prueba el código anterior y mira a ver qué ocurre.

Como habrás podido comprobar no está sumando los números sino que está uniéndolos y
formando un único número con ellos, es decir, está sumando los números como si fuesen
strings…​ ¿Pudiera ser que fuesen strings? Prueba el siguiente código contestando con un
número al input:

number1 ​=​ input​(​"Primer número a sumar: ")


type ​(​number1)

Como puedes ver, el número almacenado es un string, es decir, texto. Python permite
realizar ciertos cambios en el tipo de variables para usarlas con otro fin:

● Puedo cambiar un i​ nt o
​ ​float​ a ​string​ en cualquier momento y el número pasará a ser
texto.

● Puedo convertir un ​str​ que sólo contenga números enteros en un i​ nt.

● Puedo convertir un ​str ​que contenga un número decimal en un f​ loat.

De momento lo dejamos ahí, aunque hay más cambios aceptados.

¿Cómo se convierte una variable a otro tipo? Bien, podemos mantener el nombre o podemos
guardarla con el nuevo tipo bajo otro nombre:

#manteniendo el nombre
number ​=​ ​int​(​number)
#cambiando el nombre
new_number ​=​ ​int​(​number)

En el primer caso Python está reasignando a n ​ umber​ un valor, por lo que el valor anterior
pasa a dejar de existir. En el segundo está convirtiendo a entero el contenido de n ​ umber​ y lo
almacena con otro nombre.

Para conseguir ahora hacer la suma de dos números que el usuario elija deberíamos realizar
el siguiente código:

number1 ​=​ input​(​"Primer número a sumar: ")

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

number2 ​=​ input​(​"Segundo número a sumar: ")


number1 ​=​ ​int​(​number1)
number2 ​=​ ​int​(​number2)
print​(​number1​+​number2)

Prueba el código anterior guardándolo en un archivo en vez de por terminal y cargándolo


desde terminal o la IDLE.

Como habrás podido ver funciona. Otra opción es directamente convertir la variable a entero
en la misma sentencia que el input:

number1 ​=​ ​int​(​input​(​"Primer número a sumar: "​))


number2 ​=​ ​int​(​input​(​"Segundo número a sumar: "​))
print(number1+number2)

El efecto es el mismo, así que si sabemos que vamos a convertir la respuesta siempre a
entero podemos hacer este paso directamente.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Profundiza
Vamos a indicar las operaciones matemáticas que se pueden realizar de forma directa en
Python o bien que se pueden realizar entre variables que contengan números.

Multiplicación:

2​*2
4

División:

2​/2
1.0

Suma:

2​+3
5

Resta:

5​-2
3

Potencia:

5​**2
25

Las raíces se expresan como potencias decimales (en el ejemplo raíz cuadrada):

25​**​0.5
5

Operación para obtener la parte entera de una división:

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

5​//2
2

Operación para obtener el resto de una división:

5​%2
1

Python opera siguiendo las prioridades matemáticas. En el ejemplo, primero se realizará la


multiplicación y después la suma:

5​+​2​*3
11

Otra forma de aplicar una potencia es usar la función ​pow​ que nos obliga a indicar la base y
el exponente para realizar la operación:

pow ​(​2​,​3)
8

Para redondear un número podemos usar la función r​ ound​:

round ​(​4.35)
4

Si queremos redondear a un número concreto de decimales podemos hacerlo con la misma


función, indicando primero el número y después la cantidad de decimales que queremos:

round ​(​4.3578​,​ ​2)


4.36

Si queremos truncar un número, es decir, redondearlo hacia abajo siempre, debemos


importar una parte de una librería (más adelante hablaremos de ellas con calma), en
concreto, tenemos que importar la función ​floor​ de la librería ​math:

from​ math ​import​ floor


floor ​(​4.35)

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Si en cambio queremos siempre redondear al número superior debemos importar la función


ceil​ de la librería m
​ ath:

from​ math ​import​ ceil


ceil ​(​4.35)
5

Hasta aquí llegamos en este tema con las variables. Cuando hayas probado las opciones
matemáticas en la terminal o en la IDLE puedes visionar los videos de la unidad para ver
todo esto en práctica y posteriormente pasar al ejercicio propuesto para afianzar esta
sesión.

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Instrucciones de código usadas

# Imprimir texto
​print​ ​(​"texto")
# Imprimir texto introducido por el usuario
​print​ ​(​input ​(​"texto"​))
# Declarar variable
name ​=​ ​"Nombre"
number ​=​ 6
# Ver el tipo de una variable
type ​(​nombre_variable)
# Guardar respuesta de usuario en variable
respuesta ​=​ input ​(​"Pregunta")
# Sumar dos variables y guardar resultado en nueva variable
suma ​=​ variable1 ​+​ variable2
# Declarar varias variables simultáneamente
variable1​,​ variable2 ​=​ ​"​texto​",​ numero
# Operaciones matemáticas
​# Multiplicación
numero ​*​ numero
​# División
numero ​/​ numero
​# Suma
numero ​+​ numero
​# Resta
numero ​-​ numero
​# Potencia
numero ​**​ numero
​# Parte entera de una división
numero ​// numero
​# Resto de una división
numero ​%​ numero
​# Redondear un número
round ​(​numero)
​# Redondear a una serie de decimales
round ​(​numero​,​ decimales)
​# Truncar
​from​ math ​import​ floor
floor ​(​numero)
​# Redondear al número superior
​from​ math ​import​ ceil
ceil ​(​numero)

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables

Reto
Debes hacer un script que pregunte al usuario por dos números y los almacene (en
diferentes variables). A continuación el programa deberá mostrarnos varias operaciones
comentando primero qué operaciones ha realizado. Al menos debe realizar cinco
operaciones con los números introducidos.

Los números introducidos pueden condicionar las operaciones por lo que se debe avisar de
qué números no son válidos (por ejemplo, no podemos realizar la raiz cuadrada de un
número negativo o no se puede dividir entre cero).

17
TEMA 3
Elemento de control
(Condicionales y Bucles)

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

ÍNDICE

Try - except 2

Condicionales 7

Bucle while 13

Bucle for 19

Instrucciones de código usadas 24

Reto 25

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Try - except
Ya hemos realizado nuestros primeros programas con Python. Los mismos constaban de un
algoritmo secuencial que no alteraba su orden de ejecución, se ejecutaban paso a paso y
siempre de la misma forma.

Algoritmo es el nombre que recibe una secuencia ordenada de acciones que es,
básicamente, un programa.

En este tema, vamos a ver ​elementos de control​ para nuestro script, mediante los cuales el
algoritmo seguirá un camino u otro en función de comprobaciones y decisiones que
realizará Python, siempre respondiendo a nuestra programación.

Antes de lanzarnos a ver cómo se usan esos elementos de control vamos a aprender una
instrucción de código bastante interesante. En el tema anterior hemos visto ya que en
ocasiones Python no sabe cómo realizar una instrucción y nos arroja un error. En muchas
ocasiones el programa puede estar bien realizado pero el usuario no ha sabido introducir un
input adecuado. Por ejemplo, si pedimos un número y contesta una letra el programa no va a
saber tratar esa letra como número.

Vamos a realizar un pequeño script donde pidamos al usuario dos números y los vamos a
sumar. Guarda en un documento .py el siguiente código y ejecútalo por terminal o con la
IDLE. Si hay algo que no entiendas del mismo repasa el tema anterior:

print​(​"Vamos a sumar dos números")


numero_1 ​=​ input​(​"¿Cuál es el primer número?: ")
numero_2 ​=​ input​(​"¿Cuál es el segundo número?: ")
numero_1 ​=​ ​int​(​numero_1)
numero_2 ​=​ ​int​(​numero_2)
suma ​=​ numero_1 ​+​ numero_2
suma ​=​ str​(​suma)
print​(​"La suma de ambos números es "​ ​+​ suma)

Mucho cuidado si copiamos y pegamos texto para hacer un script, a veces ciertos
caracteres se pegan de forma errónea en el archivo de destino, cosa que suele ocurrir con
las comillas. Los editores de texto las escriben como comillas iniciales y finales y Python
sólo entiende de comillas rectas (es así de especialito).

Al ejecutar el script anterior obtendremos algo como:

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

¿Qué ocurre si elegimos un caracter no numérico?:

Como puedes observar Python nos ha dado un error, no puede convertir una a
​ ​ en un i​ nt​.
Vamos a intentar evitar esos errores.

Python tiene una función que nos permite intentar realizar una instrucción y si su resultado
es un error ejecutará otra instrucción que señalemos para tal fin. Hablamos de ​try - except.
Le pediremos a Python que pruebe a ejecutar un código (​try​) y si el resultado del código es
un error pasará a ejecutar el código contenido en el e
​ xcept.

Llegados a este punto conviene hablar de las indentaciones como base de jerarquía en
Python. Si no has entendido esta última frase no te preocupes, a lo largo del curso vas a
tener claro que son las jerarquías. En algunos lenguajes de programación, para marcar
dónde empieza y dónde termina una función, se usan llaves ( { } ). De esta forma el
programa sabe perfectamente dónde termina una instrucción porque lo marca una llave
final.

Python es bastante más simple y ello nos puede llevar a cometer errores si no sabemos
cómo entenderle (o cómo nos entiende él a nosotros). Cuando una instrucción de código
(como puede ser un t​ ry​) contiene un código a ejecutar hay que indentar dicho código
respecto de la instrucción.

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Voy a escribir un código para que veáis a lo que me refiero:

try:
​3​ ​+​ a
except:
​print​(​"No he podido realizar la instrucción")

Si te fijas, el código que contiene el t​ ry​ está indentado, es decir, desplazado a la derecha
respecto del t​ ry​. Así mismo, el contenido del e ​ xcept​ está desplazado a la derecha. Todas las
funciones de Python necesitan que su contenido esté indentado para que sepan qué
contienen exactamente y dónde acaba su campo de acción.

Veamos esta instrucción ejecutada por terminal:

La cantidad de espacios que pongo en el contenido de una función de Python es indiferente,


puedo poner un espacio, tres, cuatro… lo importante es que siempre ponga la misma
cantidad de espacios. En scripts lo habitual es usar una tabulación. En terminal o por la IDLE
es un poco complicado este proceso las primeras veces porque marca con puntos
suspensivos (como se puede ver en la imagen superior) que nos encontramos dentro de una
instrucción y debemos poner espacios, la tecla de tabulación no funciona. En el ejemplo he
puesto un único espacio bajo el ​try​ y un único espacio bajo el e
​ xcept.

Prueba a repetir el código de la imagen anterior y, tras ello, repítelo cambiando la ​a​ por un ​5
para que veas que el código que contiene el ​try​ si se ejecuta cuando no da error.

Una vez que hemos visto cómo funciona un t​ ry - except​ vamos a ver cómo podemos utilizar
esta instrucción en nuestro script suma.

print​(​"Vamos a sumar dos números")


numero_1 ​=​ input​(​"¿Cuál es el primer número?: ")
numero_2 ​=​ input​(​"¿Cuál es el segundo número?: ")
try:
numero_1 ​=​ ​int​(​numero_1)
except:
numero_1 ​=​ input​(​"No has elegido un número, elige un número: ")

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

numero_1 ​=​ ​int​(​numero_1)


numero_2 ​=​ ​int​(​numero_2)
suma ​=​ numero_1 ​+​ numero_2
suma ​=​ str​(​suma)
print​(​"La suma de ambos números es "​ ​+​ suma)

El programa está corregido para tratar de convertir el contenido de la variable n


​ umero_1​ en
entero y, si no puede hacerlo, nos volverá a preguntar por un número y lo convertirá en
número entero. Vamos a probarlo:

Si observas la ejecución del código verás que inicialmente seleccioné una ​a​ y un ​3​ y el
programa me preguntó después por un número ya que el ​try​ le suponía un error. Al escribir
un 5 ya podía hacer la suma.

Antes de seguir, sitúa un t​ ry - except​ para la variable n


​ umero_2​ como hemos hecho para la
variable ​numero_1​ y prueba el programa.

Si pensamos un poco en el recurso que hemos aprendido podríamos llegar a la conclusión


que nos evita un error una única vez, pero en nuestro ejemplo el usuario podría seguir
poniendo letras y volvería a ocurrir un error:

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Como ves, al volver a elegir una ​a​ tras elegirla en primera opción ocurre un error y encima
Python avisa que el error ocurrió durante la excepción, es decir, durante la ejecución de un
try - except.

Más adelante aprenderemos a evitar un error reiterativo, pero de momento nos podemos
conformar con dar una segunda oportunidad de introducir un número al usuario.

Llegados a este punto puedes ver el vídeo referente al ​try - except.

Ahora que ya hemos visto una instrucción que nos va a ser muy útil vamos a pasar a ver
elementos de control.

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Condicionales
El primer elemento de control que vamos a ver es el condicional i​ f​ (en castellano si). El
condicional ​if​ nos permite, al ejecutarse, realizar una acción sólo si se cumple una o varias
condiciones. Por ejemplo: si el número es par haz tal cosa…

Es importante tener claro a partir de ahora la diferencia entre usar = y usar ==. Usar un igual
( = ) significa asignar un valor. La expresión ​numero = 3​ asigna a la variable ​numero​ el valor
3. En cambio, usar dos iguales ( == ) significa comparar si dos elementos tienen el mismo
valor. La expresión n​ umero == 3​ comprueba si el contenido de la variable ​numero ​ tiene el
valor 3.

Una comprobación con == en Python nos dará el valor T ​ rue​ de ser cierta y el valor ​False​ de
no ser cierta, puedes observar la siguiente captura de un código en terminal para entenderlo:

En el primer caso asigno el valor 3 a la variable n


​ umero​ y luego compruebo si la variable
numero​ coincide con el número 3 y, al ser cierto, el programa nos devuelve el valor ​True. ​En
el segundo caso asigno a la variable ​numero​ el valor 4 y luego compruebo si ​numero​ tiene el
valor 3, con un resultado de ​False​ dado que no es cierta esa igualdad.

Ahora que hemos conocido los valores T ​ rue ​y ​False​ podemos conocer un nuevo tipo de
variable, la v
​ ariable booleana​, que sólo tiene dos estados (​True​ y F
​ alse​):

Este tipo de variables se usan para todo aquello que sólo puede tomar dos estados (que en
programación es algo habitual).

Vamos directamente a ver y probar un código que contiene un i​ f​ para entender cómo
trabaja:

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

numero = input("Elige un número: ")


try:
numero = int(numero)
except:
numero = input("No has elegido un número, elige un número: ")
numero = int(numero)
if​ numero ​%​ ​2​ ​==​ ​0:
​print​(​"Has elegido un número par")

Prueba el siguiente código teniendo cuidado con las indentaciones. Guárdalo en un script y
ejecútalo para ver qué ocurre cuando eliges un número. No sigas leyendo hasta que no lo
hayas probado.

Un i​ f​ requiere comprobar una condición para ejecutarse. En nuestro ejemplo hemos


introducido un número y el programa comprueba cual es el resto de la división de ese
número entre 2 (​numero % 2​) y lo compara con el valor 0.

Al ser ​numero​ una variable de tipo entero el resultado de dividirla entre 2 no puede ser otro
que 0 o 1. Si queremos que nos diga, así mismo, si el número elegido es impar en caso de
ocurrir podemos añadir un segundo ​if​:

numero = input("Elige un número: ")


try:
numero = int(numero)
except:
numero = input("No has elegido un número, elige un número: ")
numero = int(numero)
if​ numero ​%​ ​2​ ​==​ ​0:
​print​(​"Has elegido un número par")
if​ numero ​%​ ​2​ ​==​ ​1:
​print​(​"Has elegido un número impar")

Aquí tienes un par de pruebas con el código anterior:

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Como ves, al ejecutar el programa puedo probar números pares e impares y el resultado es
el esperado.

El problema es que a veces tenemos un montón de posibilidades a comprobar y no es buena


práctica incluir cada una de ellas en un i​ f​ diferente porque Python tendrá que comprobar
todas ellas una por una aunque la primera ya haya sido la elegida. En nuestro ejemplo, sin ir
más lejos, Python comprueba si el número es impar aunque ya haya certificado que es par.

Para evitar esto, existe una instrucción ampliada del condicional ​if​ que nos permite ir
chequeando diferentes comparativas hasta que una se cumpla. Para cada nuevo valor que
quiera chequear y esté vinculado al primer if añadiré el código ​else if​ o e
​ lif. ​Esta instrucción
toma la siguiente forma:

if​ numero ​==​ ​0:


​print​(​"Has elegido el 0")
elif​ numero ​==​ ​1:
​print​(​"Has elegido el 1")
elif​ numero ​==​ ​2:
​print​(​"Has elegido el 2")
...

Podríamos seguir poniendo tantas comprobaciones como necesitáramos pero una vez que,
al ejecutarse el programa, una sea cierta, el resto no se comprobarán. Esto hace que los
programas sean bastante más ágiles y rápidos pues en ocasiones hay que comprobar
muchas comparaciones.

Existe una tercera opción además del ​if y​ ​elif​, sólo podemos usarla al final de nuestra lista
de chequeos o comprobaciones y se aplica a cualquier otra condición no incluida en las
comprobaciones hechas. Dicha opción será ​else​ a secas y, en caso de existir, su contenido
siempre se ejecuta si no se ha cumplido ninguna de las anteriores comprobaciones.

Prueba el siguiente código guardándolo en un script .py y elige diferentes números para ver
cómo funciona:

numero ​=​ input​(​"Elige un número del 0 al 2: ")


if​ numero ​==​ ​"0":
​print​(​"Has elegido el 0")
elif​ numero ​==​ ​"1":
​print​(​"Has elegido el 1")
elif​ numero ​==​ ​"2":
​print​(​"Has elegido el 2")
else:
​print​(​"El número elegido no está entre el 0 y el 2 o no es un

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

número")

Como podrás ver, he hecho la comprobación con un número entre comillas. En esta ocasión
en vez de cambiar el contenido de la variable ​numero​ a ​int​ directamente compruebo en los
condicionales con un número como ​string​, que es lo que almacena un input.

Aquí tienes el resultado de probarlo con varios números:

A los condicionales que incluyen varias condiciones se les llama ​if - else.

Ahora que ya conoces el condicional vamos a empezar a hacer un programa funcional.


Vamos a crear un script donde se pregunte al usuario por dos números y se le dé varias
opciones para seleccionar:

numero_1 ​=​ input​(​"Elige el primer número: ")


try:
numero_1 ​=​ ​int​(​numero_1)
except:
numero_1 ​=​ input​(​"No has elegido un número, elige el primer número:
")
​numero_1 ​=​ ​int​(​numero_1)
numero_2 ​=​ input​(​"Elige el segundo número: ")
try:
numero_2 ​=​ ​int​(​numero_2)
except:
numero_2 ​=​ input​(​"No has elegido un número, elige el segundo número:
")
​numero_2 ​=​ ​int​(​numero_2)
print​(​"Puedes elegir los siguientes números:")
print​(​"1 - Sumar ambos números")
print​(​"2 - Restar ambos números")
seleccion ​=​ input​(​"¿Cual es tu selección?: ")

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Prueba a realizar tú mismo el siguiente ejercicio antes de seguir con el documento. Intenta
incluir a continuación del código anterior un ​if - else​ que sume ambos números si la
selección es 1, que reste ambos números si la selección es 2 y que informe de que la
selección es incorrecta en caso de no ser 1 ni 2. Es importante que lo intentes antes de ver
cómo se haría, si no lo consigues puedes seguir leyendo:

numero_1 = input("Elige el primer número: ")


try:
numero_1 = int(numero_1)
except:
numero_1 = input("No has elegido un número, elige el primer número:
")
numero_2 = input("Elige el segundo número: ")
try:
numero_2 = int(numero_2)
except:
numero_2 = input("No has elegido un número, elige el segundo número:
")
print("Puedes elegir los siguientes números:")
print("1 - Sumar ambos números")
print("2 - Restar ambos números")
seleccion = input("¿Cual es tu selección?: ")
if​ seleccion ​==​ ​"1":
​print​ ​(​"Resultado de la suma:")
​print​ ​(​numero_1 ​+​ numero_2)
elif​ seleccion ​==​ ​"2":
​print​ ​(​"Resultado de la resta:")
​print​ ​(​numero_1 ​-​ numero_2)
else:
​print​ ​(​"No has elegido una opción válida")

Para que el contenido del ​if - else​ se muestre impreso en una sola línea (en nuestro ejemplo
está en dos líneas) deberíamos concatenar el número resultado de la operación con el s ​ tring
“Resultado de la…” ​y para ello previamente deberíamos guardar el resultado de la operación
en una variable y convertirlo a ​string. S
​ ería importante, llegados a este punto, que entiendas
de qué estamos hablando y sepas hacerlo (aunque te cueste revisar unas cuantas cosas del
tema anterior).

Ahora que ya sabes hacer tu primer script con condicionales intenta añadir dos nuevas
opciones para multiplicar los números y dividirlos. Debes incluirlas como opción dada al
usuario (que sepa que puede elegirlas) y añadir los i​ f - else​ necesarios para que se ejecuten
esas opciones si las elige el usuario.

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Una vez lo hayas conseguido o si no lo consigues del todo puedes ver el vídeo de
condicionales.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Bucle while
Una vez que sabemos cómo alterar la ejecución de un programa en función de una decisión
puntual, vamos a ver otro tipo de elemento de control, en este caso uno que se repetirá
mientras (​while​) o hasta que se cumpla una condición.

Volvamos a nuestro programa t​ ry - except​ inicial:

print​ ​(​"Vamos a sumar dos números")


numero_1 ​=​ input​(​"¿Cuál es el primer número?: ")
numero_2 ​=​ input​(​"¿Cuál es el segundo número?: ")
try:
numero_1 ​=​ ​int​(​numero_1)
except:
numero_1 ​=​ input​(​"No has elegido un número, elige un número: ")
numero_1 ​=​ ​int​(​numero_1)
numero_2 ​=​ ​int​(​numero_2)
suma ​=​ numero_1 ​+​ numero_2
suma ​=​ str​(​suma)
print​(​"La suma de ambos números es "​ ​+​ suma)

En dicho programa faltaba implementar la solución para el número 2, más adelante tendrás
que completarlo si no lo hiciste en su momento.

¿Qué tal si forzamos al usuario a que la variable que introduzca en el input ​numero_1​ sea un
número repitiendo una y otra vez la pregunta hasta que se pueda convertir en i​ nt​ la
respuesta?

Para este tipo de acciones (y muchas otras) se usan los bucles. Vamos a aprender a usar el
bucle ​while​ (mientras). Dicho bucle se repetirá mientras se cumpla una condición, y también
vamos a aprender a utilizar las variables como elementos para provocar o dejar de provocar
bucles.

Para ello, usaremos variables booleanas (recuerda, las que pueden tomar el valor T
​ rue ​o
False​).

La forma de entender este proceso es sencilla:

1. Declaramos una variable con el valor ​True.

2. Creamos un bucle w
​ hile​ que se repita hasta que la variable declarada tenga el valor
False.

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

3. Dentro del bucle situamos el código que necesitemos que se repita hasta la solución
correcta.

Veámoslo con un código sencillo:

repetimos ​=​ ​True


numero_1 ​=​ input​(​"¿Cuál es el primer número?: ")
while​ repetimos ​==​ ​True:
​try:
numero_1 ​=​ ​int​(​numero_1)
repetimos ​=​ ​False
​except:
numero_1 ​=​ input​(​"No has elegido un número, elige un número: ")
print​(​numero_1)

Aquí tienes una captura de la ejecución del mismo:

Como ves, el usuario no tiene más remedio que poner un número ya que se repite la
pregunta h
​ asta​ que así sea o, dicho de otra forma, m
​ ientras​ que no sea así.

Lo más importante es entender​ cómo usamos una variable para entrar y salir de un bucle ​y
cómo usamos el bucle para forzar al usuario a elegir un número. El cambio de la variable
repetimos​ de ​True a
​ ​False​ produce que se termine el bucle w ​ hile.​ Ese cambio no ocurre
hasta después de que el programa pueda convertir n ​ umero_1​ en entero, y si este proceso da
error pasará directamente al e ​ xcept​ y se saltará el cambio de la variable ​repetimos​ de T
​ rue ​a
False.

Intenta, ahora que has visto este programa, repetirlo para seleccionar un segundo número y
terminar preguntando al usuario qué quiere hacer con esos números (sumarlos, restarlos,
multiplicarlos o dividirlos…). En este punto has llegado a un paso importante que todo
programador acaba dando: ​reutilizar código​.​ Utiliza el final del programa del apartado
Condicionales para agilizar el proceso y completar el reto lanzado.

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Vamos a utilizar el bucle ​while​ para otra función, aprendiendo a la vez a usar bibliotecas.

Una librería o biblioteca (del inglés l​ ibrary​) es un código o conjunto de códigos funcionales
que podemos utilizar importándolos a nuestro programa. Dicho de otra forma, son
programas que nos permiten ser utilizados simplemente cargándolos y utilizándolos enteros
o algunas partes del mismo.

Las bibliotecas pueden tener muchos orígenes pero siempre hay información sobre su uso y
opciones en internet. Veamos un ejemplo con la biblioteca ​time​.

La biblioteca o librería t​ ime​ nos permite usar varias funciones, entre ellas establecer tiempos
de espera en nuestro programa antes de ejecutar la siguiente línea de código. Vamos a
hacer un cronómetro con las siguientes instrucciones:

● El usuario debe seleccionar el tiempo desde el que quiere cronometrar.

● Cuando lleguemos a cero pararemos la cuenta atrás.

● El tiempo disminuirá de segundo en segundo.

Para utilizar una librería debemos usar el siguiente código:

import​ time

En ocasiones usaremos una parte de una librería y no entera, lo veremos más adelante. La
opción anterior importa a tu programa t​ oda​ la librería t​ ime​.

Ahora vamos a crear un programa sencillo y básico y luego propondré mejoras para que
puedas practicar. Observa el siguiente código:

import​ time
tiempo ​=​ input​(​"¿Cuánto tiempo tendrá la cuenta atrás?: ")
tiempo ​=​ ​int​(​tiempo)
while​ tiempo ​>=​ ​0:
​print​(​tiempo)
tiempo ​=​ tiempo ​-​ 1
time​.​sleep​(​1)

Prueba a guardarlo como script y ejecutarlo, elige un tiempo prudencial (10, por ejemplo) y
mira qué ocurre antes de seguir.

Si ya lo has probado deberías haber conseguido algo similar a ésto:

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Si observas el código verás que hemos usado dos instrucciones nuevas. En primer lugar
hemos usado una librería importándola y ejecutando una de sus funciones. Las funciones
de las librerías se ejecutan con el nombre de la librería seguido de un punto y el nombre de
la función que necesitamos. Algunas funciones de las librerías necesitan, además,
parámetros, que irán entre paréntesis.

En nuestro caso la función ​[Link]( )​ necesita entre paréntesis el tiempo (en segundos)
que va a esperar el programa antes de continuar.

Veremos más funciones de las librerías en otros temas, pero de momento podemos
quedarnos con esta función tan interesante: ¡esperar una cantidad de tiempo!.

Además, hemos utilizado una nueva forma de comparación en el w ​ hile​. No hemos usado un
== sino un >=. Esta opción, ubicada en el código t​ iempo >= 0 ​indica al programa que la
comparación será verdadera cuando ​tiempo​ tenga un valor mayor o igual a cero. Al estar
dentro de un ​while​ ese bucle se repetirá hasta que ​tiempo​ tenga un valor inferior a 0, de ahí
que la cuenta atrás se detenga al llegar a cero.

Veamos un pequeño cambio que puede suponer una gran diferencia para entender el bucle.
Efectúa el cambio en el código que verás a continuación y pruébalo como script:

import time
tiempo = input("¿Cuánto tiempo tendrá la cuenta atrás?: ")
tiempo = int(tiempo)
while tiempo >= 0:
tiempo ​=​ tiempo ​-​ 1
​print​(​tiempo)
​[Link](1)

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Como puedes observar, el único cambio es situar primero el cambio de la variable t​ iempo​ y
después imprimimos la variable ​tiempo.

El resultado al probarlo debería ser algo similar a ésto (he elegido 5 como i​ nput​ para reducir
el tiempo de espera):

Ese pequeño cambio resulta en un programa erróneo. Es importante pensar en ​cómo las
fases del programa se suceden ​y qué necesito hacer primero. Si yo quiero hacer una cuenta
atrás de 5 segundos, primero tendré que imprimir el 5, después lo convierto en un 4 y tras
una espera de un segundo lo imprimo. Podría primero esperar un segundo y después
convertirlo en 4 e imprimirlo, pero si primero le quito una unidad y luego lo imprimo mi cinco
inicial se convertirá primero en un 4 y luego lo imprimiré, lo cual no es lo que queremos.

Así mismo, el programa termina en un -1. Esto es así porque (y esto es importante) la
condición que contiene el ​while​ se comprueba tras cada ejecución de su contenido
completo​, es decir, el programa realiza todo el contenido del w
​ hile​ en cada ejecución del
mismo antes de comprobar si la condición sigue siendo válida. Para entender esto mejor
vamos a poner un ejemplo muy claro:

import​ time
tiempo ​=​ input​(​"¿Cuánto tiempo tendrá la cuenta atrás?: ")
tiempo ​=​ ​int​(​tiempo)
while​ tiempo ​>=​ ​0:
​print​(​tiempo)
tiempo ​=​ tiempo ​-​ 1
time​.​sleep​(​1)
print​(​"La variable tiempo ha acabado con un valor de: ")
print​(​tiempo)

Si ejecutamos este código eligiendo como i​ nput​ 5 segundos obtendremos lo siguiente:

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Es importante entender por qué la variable ha acabado con un valor de -1. El programa
imprime la variable t​ iempo​ antes de realizar ninguna otra acción del ​while​. En la última
ejecución del w​ hile​ el programa imprime el 0, después le resta 1 y la variable ​tiempo​ pasa a
tener el valor -1 y posteriormente espera 1 segundo. Tras ello, salimos del ​while a ​ l volver a
comprobar si t​ iempo ​es mayor o igual que 0 y, ya fuera del ​while,​ imprimimos de nuevo el
valor de la variable ​tiempo, ​que tiene el valor final de -1.

Seguramente en el futuro cambiarás muchas cosas de este programa, pero en este punto
suficiente para nuestra cuenta atrás. Sólo añadiré que realmente no está pasando un
segundo exacto en cada ejecución del ​while​, pues el resto de acciones también lleva un
tiempo, aunque sea muy pequeño, pero a efectos prácticos tenemos una cuenta atrás en
segundos.

El reto, ahora, es que consigas hacer una cuenta atrás que pregunte el tiempo al usuario y lo
repita hasta que introduzca un número correcto y que, tras llegar a cero, imprima el valor “​ Ya
hemos terminado”​.

18
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control

Bucle for
Ya tenemos más o menos claro qué es un condicional y qué es un bucle. En el caso de estos
últimos tenemos una evolución del ya conocido bucle w
​ hile​ que nos permite realizar un
número concreto de acciones. Dicha evolución se conoce como bucle f​ or​.

Este bucle es muy usado para repetir acciones cuando conocemos el número de veces que
se va a repetir, es decir, para aquellos bucles en los cuales sabemos cuando va a comenzar
y cuando va a terminar.

Antes de introducirnos en el bucle vamos a ver un ejemplo con un w


​ hile y​ después lo
trasladaremos a un f​ or​.

Imagina que tenemos que escribir todas las letras que componen una palabra. Para ello
tenemos que ir recorriendo la palabra e imprimiendo la letra que ocupa cada posición de la
misma.

Aprendamos algunas cosas nuevas sobre los s ​ tring​ (en castellano, cadenas). ¿Cómo se
nombra la posición que ocupa cada caracter de un s ​ tring​? Prueba el siguiente código en tu
terminal o IDLE:

palabra ​=​ ​"Python"


print​(​palabra​[​1​]​)

Analizando el código podemos intuir que imprimiremos la posición 1 del s ​ tring​ almacenado
en la variable p
​ alabra​. Ahora bien, si lo probáis veréis lo siguiente:

Resulta que la posición 1 de la palabra Python la ocupa la y


​ ,​ cuando lo lógico para un ser
humano hubiese sido pensar que la posición 1 sería la ​P.​ Pues bien, en lenguaje máquina
siempre empezaremos a numerar y contar desde cero.​ Esto es muy importante y al
principio cuesta un poco pensar en numerar desde cero, pero con la práctica lo
naturalizarás.

Si pensamos un poco en cómo contamos los humanos hay cosas que si empezamos a
contar desde cero, por ejemplo los años de vida, nuestro primer año de vida es el cero. Hay

19
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 3: Elementos de control

otras que empezamos en el uno, por ejemplo las cantidades de productos que tenemos, el
primer limón que tenemos en casa es el uno.

Siguiendo con nuestras cadenas, es muy útil saber el número de caracteres que tiene una
cadena. Veamos cómo se podría realizar esta acción:

palabra ​=​ ​"Python"


print​(​len​(​palabra​))

Sencillamente debemos indicar que queremos conocer la longitud de un string con el


comando l​ en​ seguido del nombre de la variable donde está el string.

También se puede utilizar directamente para medir un string no almacenado:

print​(​len​(​"Python"​))

Una vez que ya sabemos cómo conocer la posición de un caracter en una cadena y cómo
medir su longitud vamos a generar un código que deletree una palabra.

Analiza, guarda y prueba el siguiente código para intentar entender cómo funciona:

palabra ​=​ input​(​"¿Qué palabra quieres deletrear?: ")


longitud ​=​ len​(​palabra)
posicion ​=​ 0
while​ posicion ​+​ ​1​ ​<=​ longitud:
​print​(​palabra​[​posicion​])
posicion ​=​ posicion ​+​ 1

Aquí tienes el resultado de su ejecución con la palabra “Python”:

Quizá no tengas muy claro por qué funciona el código, es algo habitual al ver código creados
y es un momento estupendo para aprender a poner c ​ omentarios​. Los comentarios son
textos que ponemos para explicar parte del programa y que Python no interpretará porque
sabrá que son aclaraciones para el usuario. Los comentarios en Python se indican con una

20
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 3: Elementos de control

almohadilla #
​ comentario s​ i son de una línea o con triples comillas si quiero hacer un
comentario más largo “​ “ “ comentario muy largo “ “ “​. Veamos si ahora entiendes bien el
código con esta captura de pantalla de un editor:

Si ya lo tienes un poco más claro podemos seguir. No tengas problema en expresar toda
dificultad con las comparaciones entre valores que tienen diferentes rangos o que empiezan
en diferentes números (unas en cero y otras en uno).

Éste es el caso de las posiciones de un string respecto de su longitud. Las posiciones


empiezan en 0, la longitud empieza en 1, si queremos compararlas hay que conseguir que
ambas empiecen en el mismo número, o bien en el 1 y habrá que sumar una unidad a la
posición, o bien en el 0 y habrá que restar una unidad a la longitud.

Pasemos ahora a ver cómo funciona un bucle ​for​. Prueba el siguiente código guardándolo
en un ​script​:

palabra ​=​ input​(​"¿Qué palabra quieres deletrear?: ")


for​ letra ​in​ range​(​len ​(​palabra​)):
​print​(​palabra​[​letra​])

Como habrás podido comprobar, es un deletreador perfecto y en bastantes menos líneas


que el programa elaborado en un ​while​. Un f​ or e
​ s un bucle que se repite las veces que

21
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 3: Elementos de control

queramos, siguiendo un patrón que le indiquemos, por ejemplo, repite una acción contando
hasta 10 de uno en uno o repite hasta 10 contando de dos en dos…

Los bucles f​ or​ necesitan una ​variable propia​ para ir contando y almacenando el valor de la
cuenta. Podemos declarar esa variable en el mismo f​ or. ​En nuestro ejemplo, sin ir más lejos,
la variable se llama l​ etra​ y está d
​ eclarada directamente​ en el bucle for. Habitualmente se
usa la letra i para la variable propia del f​ or​.

Además, necesitan una indicación de cómo contar y hasta cuánto. En el ejemplo


contaremos desde cero hasta la cantidad de caracteres que tenga el ​string palabra. P
​ ara ello
hemos indicado que cuente dentro del rango (​range​) de la longitud de p
​ alabra.

Veamos un ejemplo de aplicación para explicarlo con más calma:

Hemos vuelto a deletrear la palabra P


​ ython​, cuya longitud es 6, así que el bucle ​for​ viene a
ser, traducido a nuestro lenguaje:

Para cada letra en el rango de 6 letras, repite:

Al ejecutarse el bucle ​for​ este va a ir contando hasta 6 y almacenando el valor de la cuenta


en la variable l​ etra​, eso sí, empezando por 0 (como ya hemos dicho, en programación
empezamos a contar en 0).

De esta forma, en la primera iteración o ejecución del bucle ​for l​ a variable ​letra​ tiene el valor
0, por lo que si le pedimos que imprima la posición l​ etra​ de la palabra ​Python​ imprimirá la P.

Pero, si le pido que cuente hasta 6 empezando en el 0, ¿no contará 7 veces?. Es importante
acordarse que el bucle ​for, a
​ l indicarle el rango en el que queremos contar siempre
empezará en 0 y llegará hasta ​el valor anterior al indicado​.

Si le decimos que cuente en un rango de 6 contará de la siguiente forma: 0, 1, 2, 3, 4 y 5. El


valor indicado no lo incluye. Digamos que cuenta hasta el 6 no incluído.

22
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 3: Elementos de control

Como esta instrucción suele causar algún problema más en su comprensión vamos a
desglosar el bucle tal como lo hace Python con la instrucción ​for letra in range (len (palabra)
) ​y p
​ alabra = “Python”

● Comienda el bucle for. Para cada letra en el rango 6:


○ Letra = 0
■ Imprime la posición 0 de la variable Python: P
○ Letra = 1
■ Imprime la posición 1 de la variable Python: y
○ Letra = 2
■ Imprime la posición 2 de la variable Python: t
○ Letra = 3
■ Imprime la posición 3 de la variable Python: h
○ Letra = 4
■ Imprime la posición 4 de la variable Python: o
○ Letra = 5
■ Imprime la posición 5 de la variable Python: n
● Fin del bucle

Que código más efectivo y breve, ¿verdad?. Pues aún se puede hacer más corto.

El bucle f​ or​ admite muchas formas como instrucción de búsqueda. Pongamos algunos
ejemplos:

for​ letra ​in​ range ​[​0​,​ ​1​,​ ​2​,​ ​3​,​ ​4​,​ ​5​]:
​print​ ​(​palabra ​[​letra​]​ )
for​ letra ​in​ ​"Python":
​print​ ​(​letra)
for​ letra ​in​ palabra:
​print​ ​(​letra)

Los tres bucles hacen exactamente lo mismo. En el primero están enumeradas las
posiciones de cada letra de la palabra Python (cosa que no tiene mucho sentido a no ser
que sepamos qué palabra vamos a deletrear). El segundo deletrea el ​string​ que situemos en
la condición del ​for​, cosa que nos obliga a ceñirnos a un único string, y el tercero recorre la
variable ​palabra​ e imprime cada elemento que contenga (al cual llamamos l​ etra​).

No vamos a hablar mucho más por ahora de los bucles ​for​, iremos utilizándolos a lo largo
del curso en otras ocasiones. Ahora toca hacer una prueba: intenta reproducir la cuenta
atrás que hicimos con un bucle w ​ hile​ utilizando ahora un bucle ​for​ tras preguntar al usuario
por la cantidad de la cuenta atrás.

23
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link] Tema 3: Elementos de control

Instrucciones de código usadas

#Intentar ejecutar un código y evitar un error


​try:
​#código
​except:
​#código
#Código que se ejecuta si se cumple una condición (condicional)
​if​ comparacion:
​#código
​elif​ comparacion:
​#código
​else:
​#código
#Código que se repita mientras se cumpla una condición (while)
​while​ comparacion:
​#código
#Código que se repita una serie de veces (for)
​for​ repeticiones:
​#código
#Establecer un rango de datos
range​(​datos)
#Instrucciones de comparación de valores
​#Igualdad
​==
​#Mayor que, menor que, mayor o igual que, menor o igual que
>
<
​>=
<=
​#Desigualdad
​!=
#Importar biblioteca
​import​ biblioteca
#Usar elemento de biblioteca
elemento​.​biblioteca​()
#Importar parte de una biblioteca
​from​ biblioteca ​import​ parte
#Usar una posición de un string
​string​[​posicion]
#Longitud de un string
len​(​string)

24
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 3: Elementos de control

Reto
Realiza un programa que realice una cuenta atrás de una cantidad de segundos introducida
por el usuario. Dicho programa deberá contar cuántos minutos quedan a no ser que quede
menos de un minuto, que contará segundo a segundo. Así mismo, deberá obligar al usuario
a introducir un número como input.

25
TEMA 4
Listas, Tuplas y Diccionarios

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

ÍNDICE

Listas 2

Tuplas 9

Diccionarios 10

Recorriendo listas y diccionarios 12

Instrucciones de código usadas 15

Reto 1 16

Reto 2 16

1
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Listas
Imagina que queremos almacenar una cantidad algo grande de variables, por ejemplo, los
nombres de un grupo de personas. Podríamos guardarlos como ​nombre1 = ... , nombre2 = ….
, nombre3 = … o
​ bien podríamos buscar si hay algún tipo de elemento que nos permita
almacenar una serie de datos juntos bajo un mismo nombre.

Existe una estructura para almacenar un conjunto de datos, llamada​ lista​, vamos a aprender
a usarla.

Crear una lista es muy sencillo. Sólo tenemos que darle un nombre e indicar a Python que
dicho nombre se corresponde con una lista. Podemos declararla con contenido...

nombres ​=​ ​[​"Pedro"​,​ ​"Juan"​,​ ​"Ana"]

… o declararla vacía...

nombres ​=​ ​[​]

… en cuyo caso tendremos que introducir el contenido de la misma posteriormente.

Una vez hemos declarado la lista podemos introducir nuevos elementos en la lista de
diversas maneras, de momento vamos a usar una función de las listas que introduce un
nuevo elemento al final de la misma:

nombres ​=​ ​[​"Pedro"​,​ ​"Juan"​,​ ​"Ana"]


nombres​.​append​(​"Maria")

El comando ​append​ sitúa el nuevo elemento tras los ya presentes en la lista. Si no hubiese
ninguno sería el nuevo elemento sería el primero. Para incluirlo hay que hacerlo nombrando
la lista y un punto previo a a
​ ppend​. Veamos el código anterior ejecutado por terminal:

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Si observas, el nombre introducido en la lista (​“Maria”​) aparece en último lugar al imprimir la


lista.

A la acción de modificar una lista cambiando alguno o todos sus elementos se le denomina
mutar una lista​.

Una vez que tenemos una lista creada podemos acceder a cualquiera de los elementos que
contiene indicando el índice que ocupa, siendo el 0 el primer elemento, el 1 el segundo y así
sucesivamente:

nombres ​=​ ​[​"Pedro"​,​ ​"Juan"​,​ ​"Ana"​,​ ​"Maria"]


print​(​nombres​[​1​]​)

¿Y qué pasa si queremos saber la posición de uno de los nombres? Basta con indicar que
queremos conocerla con el comando index:

nombres ​=​ ​[​"Pedro"​,​ ​"Juan"​,​ ​"Ana"​,​ ​"Maria"]


print​(​nombres​.​index​(​"Pedro))

Trabajando por terminal o IDLE bastaría con poner n​ [Link](“Pedro”)​, no necesitamos


imprimirlo para que muestre el valor que ocupa el elemento “Pedro”.

Si intentamos mostrar la posición de un elemento que no está en la lista obtendremos un


error que nos indica que el elemento no está en la lista.

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Vamos a usar una lista para hacer un programa. Prueba el siguiente código guardándolo en
un archivo .py

nombres ​=​ ​[​]


cantidad_nombres ​=​ input​(​"¿Cuántos nombres quieres introducir en la
lista?: ")
cantidad_nombres ​=​ ​int​(​cantidad_nombres)
for​ numero ​in​ range​(​cantidad_nombres​):
numero_texto ​=​ str​(​numero ​+​ ​1)
nombre_elegido ​=​ input​(​"Nombre número "​+​numero_texto​+​": ")
nombres​.​append​(​nombre_elegido)
print​(​nombres)

¿Ya has visto cómo funciona? La mayoría de los elementos ya han sido explicados en los
temas pasados (bucle for, input, int, print…). La idea es poder almacenar el número de
nombres que el usuario desee. Para mejorar el script habría que añadir algún código para
que el usuario sólo pueda introducir un número al principio para indicar cuántos nombres
tendrá la lista, evitando así el error.

Una vez tenemos creada una lista podemos sustituir cualquiera de sus elementos por uno
nuevo simplemente declarando en qué lugar queremos introducir el nuevo elemento. Si
declaro un nuevo contenido para uno de los índices de la lista, éste sustituirá al contenido
existente.

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

En el ejemplo anterior se sustituye el índice 1 (segundo elemento) de una lista por un nuevo
contenido y se muestra cómo, efectivamente, ha variado.

Si no hubiese ningún contenido en ese índice (y por tanto, no existiese), Python nos dará
error:

Al intentar guardar un nuevo elemento (​“Rodrigo”​) en la lista nombres obtenemos un error,


pues no existe el índice o posición 3 de la misma. Sí, hay tres elementos, pero el primer
elemento es el índice 0, el segundo es el índice 1 y el tercero es el índice 2.

Para obtener el número de elementos que contiene una lista no tenemos más que usar el
comando l​ en​ igual que con los strings.

Podemos mutar una lista introduciendo un nuevo valor sin cambiar ninguno de los que ya
contenía. Para ello podemos decirle a Python dónde queremos insertar el nuevo elemento y
el programa desplazará todos los que existían de ese índice en adelante una posición.

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Para insertar un valor debemos usar la función ​insert​ e indicar, entre paréntesis, en qué
posición queremos incluir un valor y cual es el valor que queremos introducir. Al igual que
con ​append​ se debe unir al nombre de la lista separándolos con un punto:

nombres ​=​ ​[​"Maria"​,​ ​"Juan"​,​ ​"Pedro"]


nombres​.​insert​(​1​,​ ​"Alfredo")

Veamos cómo funciona el código anterior:

Como ves, el índice 1 se encuentra ocupado por Alfredo pero el resto de elementos
continúan en la lista.

De la misma forma podemos eliminar un elemento desplazando todos los siguientes una
posición a la izquierda con el comando ​remove​. A diferencia del comando i​ nsert​, con ​remove
tengo que indicar qué elemento quiero eliminar:

También podemos comprobar si un elemento está dentro de una lista:

Esta estructura se puede usar dentro de cualquier condicional o bucle:

if​ ​"Maria"​ ​in​ nombres:


​print​ ​(​"Maria está en la lista nombres")

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Una lista puede contener cualquier tipo de valores dentro: números decimales, números
enteros, strings e incluso otras listas.

Por último vamos a ver cómo ​ordenamos una lista​ en orden creciente o decreciente. Para
ordenar una lista los valores que contiene deben ser del mismo tipo, si no Python no sabrá
cómo ordenar los elementos que contiene (por ejemplo strings y números enteros).

Para ordenar una lista usaremos el comando ​.sort( )​ como apéndice del nombre de la lista:

nombres ​=​ ​[​"María"​,​ ​"Pedro"​,​ ​"Alfredo"​,​ ​"Juan"]


nombres​.​sort​(​)
print​(​nombres)

Veamos cómo se ejecuta el código anterior y cómo, efectivamente, ordena una lista:

En la primera impresión de la lista los nombres no están ordenados. En la segunda aparecen


ordenados alfabéticamente.

Para ordenarlos de forma descendente o en alfabeto inverso debemos usar un parámetro en


la función ​sort( )​ que no es más que activar el modo inverso:

nombres ​=​ ​[​"María"​,​ ​"Pedro"​,​ ​"Alfredo"​,​ ​"Juan"]


nombres​.​sort​(​reverse ​=​ ​True)
print​(​nombres)

Podemos ver cómo se ordenan de forma inversa en la siguiente imagen:

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

De momento vamos a dejar aquí las listas, aunque seguiremos usándolas en otros temas.

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Tuplas
Las tuplas son un tipo de lista un poco especial, no mutable (es decir, no se puede modificar
lo que contienen). Se podría decir que son iguales que las listas pero no podemos alterar su
contenido. Las tuplas se declaran con paréntesis (recuerda que en las listas se usaban
corchetes).

nombres ​=​ ​(​"Ana"​,​ ​"Maria"​,​ ​"Rodrigo")

Para leer el contenido de la tupla podemos acceder por el índice que ocupa aquello que
necesitemos de la misma, recordando que el primer elemento es el 0. Se escribe igual que
una lista:

nombres ​=​ ​(​"Ana"​,​ ​"Maria"​,​ ​"Rodrigo")


print​(​nombres​[​1​]​)

No vamos a profundizar en ellas en este tema, pero es bueno conocer su existencia pues se
usan en diferentes ocasiones, especialmente cuando necesitamos hacer comparativas
entre diferentes tuplas de forma que los términos de la misma sean inmutables.

Un ejemplo de lo anterior son los vectores, un vector siempre tiene un par de coordenadas
(x, y) y si queremos comparar vectores necesitamos que la coordenada x sea la primera y la
y la segunda, por ello se usan tuplas.

También serviría de ejemplo estructuras que almacenen una fecha (día, mes y año) o una
hora (horas, minutos y segundos). Siempre tendrán el mismo formato y no queremos que
cambien bajo ningún concepto de orden.

Por ahora basta con saber que la tupla es una lista que no se puede modificar.

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Diccionarios
Los diccionarios son una estructura que almacena elementos a los que se les da un nombre
o clave (en inglés key). De esta forma, en lugar de acceder al elemento por medio del índice
que ocupa se accede a él por el nombre que tiene. Podemos definir un diccionario como un
conjunto de parejas clave - valor (key - value) donde la clave es el nombre que se le da a un
valor.

Los valores de un diccionario pueden tener cualquier forma: números, strings, listas...
Veamos un diccionario sencillo:

pronombres ​=​ ​{​"yo"​ ​:​ ​"I"​,​ ​"tú"​ ​:​ ​"You"​,​ ​"él"​ ​:​ ​"He"}

Como puedes ver, el diccionario se crea usando llaves y dentro de ellas situaremos cada
pareja clave - valor con dos puntos entre la clave y el valor, utilizando una coma para separar
cada pareja.

Para acceder a cada valor debemos escribir el siguiente código:

pronombres ​=​ ​{​"yo"​ ​:​ ​"I"​,​ ​"tú"​ ​:​ ​"You"​,​ ​"él"​ ​:​ ​"He"}
print​ ​(​pronombres​[​"yo"​]​)

Usamos la clave del diccionario para mostrar el valor:

Para añadir nuevas parejas clave - valor al diccionario sólo tenemos que indicarlo de la
siguiente forma:

pronombres​[​"ella"​]​ ​=​ ​"She"

Veamos cómo, con el comando anterior, la clave se ha añadido imprimiendo el diccionario:

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Como puedes observar se ha añadido la clave “​ ella”​ con el valor “​ She”​ aunque al imprimir el
diccionario vemos que los elementos que lo componen están desordenados.

En realidad ordenar un diccionario es complicado y no tiene sentido hacerlo ya que se trata


de una estructura de almacenamiento a la que accederemos mediante una clave para que
Python muestre el valor asociado. La posición que ocupa la clave no nos interesa
demasiado.

Así mismo, podemos eliminar cualquier clave - valor del diccionario con la siguiente
instrucción:

pronombres ​=​ ​{​"yo"​ ​:​ ​"I"​,​ ​"tú"​ ​:​ ​"You"​,​ ​"él"​ ​:​ ​"He"}
del​ pronombres​[​"Yo"]

Como ves la clave ​“Yo”​ de la lista mostrada en la imagen se ha borrado con el comando d
​ el​.

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Recorriendo listas y diccionarios


Algo habitual es querer recorrer los elementos de una lista o diccionario para compararlos
con un valor o mostrarlos. Para ello usaremos un bucle for.

Empecemos con las listas. Prueba el siguiente código guardándolo en un script y abriéndolo
por terminal o en la IDLE:

notas ​=​ ​[​4​,​ ​3​,​ ​2​,​ ​7​,​ ​6​,​ ​8​,​ ​5​,​ ​10​,​ ​3​,​ ​8]
suspensos ​=​ 0
aprobados ​=​ 0
for​ nota ​in​ notas:
​if​ nota ​<​ ​5:
suspensos ​=​ suspensos ​+​ 1
​elif​ nota ​>=​ ​5:
aprobados ​+=​ 1
suspensos ​=​ str ​(​suspensos)
aprobados ​=​ str ​(​aprobados)
print​ ​(​"Hay "​+​suspensos​+​" suspensos.")
print​ ​(​"Hay "​+​aprobados​+​" aprobados.")

En el for se declara una variable denominada n ​ ota​ que almacenará un elemento de la lista
notas​ en cada iteración. En la primera será un 4, luego será un 3, luego un 2, luego un 7 y así
sucesivamente.

Fíjate en las dos formas en las que se incrementan las variables suspensos y aprobados.
Ambas hacen exactamente lo mismo, podemos incrementar una variable asignándole su
valor + 1 o podemos incrementarla con la expresión += 1, significan exactamente lo mismo.

Una vez que probéis el código debería salir lo siguiente:

Ahora te toca practicar a tí. Añade una instrucción para que el código anterior, además de
darnos los aprobados y los suspensos, nos dé el porcentaje de aprobados y la nota media.
Para la nota media tendremos que crear una nueva variable que almacene la suma de todos
los elementos (cosa que podemos hacer al irse ejecutando el for) y el porcentaje de

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

aprobados se puede realizar al final introduciendo una nueva variable que almacene la
fórmula que es necesaria para calcular el porcentaje pedido.

¿Conseguido? Perfecto.

Vamos a ver ahora cómo recorremos un diccionario:

La primera forma de recorrer un diccionario es recorriendo las claves.

print​ ​(​"Vamos a traducir algunos pronombres al inglés:")


pronombres ​=​ ​{​"yo"​ ​:​ ​"I"​,​ ​"tú"​ ​:​ ​"You"​,​ ​"él"​ ​:​ ​"He"​,​ ​"ella"​ ​:​ "
​ She"}
for​ clave ​in​ pronombres:
​print​ ​(​"La traducción de "​+​clave​+​" es: "​+​pronombres​[​clave​])

Pruébalo guardándolo como script antes de seguir.

El código utiliza la clave del diccionario tanto para imprimirla tal cual como para buscar el
valor asociado e imprimirlo.

Como habrás podido comprobar, el código anterior nos muestra cada uno de los elementos
de la lista.

También podemos recorrer el diccionario con la instrucción ​.items( )​ como apéndice del
nombre del diccionario. Esta instrucción nos permite almacenar tanto la clave como el valor
en una variable. Veamos el mismo código anterior con esta instrucción, pruébalo
guardándolo en un script:

print​ ​(​"Vamos a traducir algunos pronombres al inglés:")


pronombres ​=​ ​{​"yo"​ ​:​ ​"I"​,​ ​"tú"​ ​:​ ​"You"​,​ ​"él"​ ​:​ ​"He"​,​ ​"ella"​ ​:​ "
​ She"}
for​ clave​,​ valor ​in​ pronombres​.​items​():
​print​ ​(​"La traducción de "​+​clave​+​" es: "​+​valor)

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 4: Listas, tuplas y diccionarios

Como verás, hace exáctamente lo mismo que el código anterior.

Hay muchas otras opciones con listas y diccionarios a la hora de recorrerlos y mostrarlos,
pero de momento nos vamos a quedar aquí, es mejor afianzar esto antes de seguir
profundizando en opciones más enrevesadas.

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Instrucciones de código usadas

#Crear una lista


lista ​=​ ​[]
#Introducir un nuevo elemento en la lista
lista​.​append​(​elemento)
#Acceder a un elemento de la lista
lista​[​indice]
#Conocer la posición de un elemento de la lista
lista​.​index​(​elemento)
#Insertar un elemento en la lista, desplazando los existentes
lista​.​insert​(​indice​,​elemento)
#Borrar un elemento de una lista
lista​.​remove​(​elemento)
#Comprobar si un elemento está en una lista
elemento ​in​ lista
#Ordenar una lista alfabéticamente o de forma creciente
lista​.​sort​()
#Ordenar una lista de forma decreciente o alfabéticamente inversa
lista​.​sort​(​reverse​=​True)
#Declarar una tupla
tupla ​=​ ​()
#Declarar un diccionario
diccionario ​=​ ​{}
#Introducir un nuevo valor del diccionario mediante la clave
diccionario​[​clave​]​ ​=​ valor
#Borrar una clave-valor del diccionario mediante la clave
​del​ diccionario​[​clave]
#Comando para recorrer las parejas clave-valor de un diccionario
​for​ clave​,​ valor ​in​ diccionario​.​items​():

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 4: Listas, tuplas y diccionarios

Reto 1
Crea un script que busque, hasta el número que el usuario indique, los números primos y los
vaya imprimiendo. Para ello te doy las siguientes pistas:

● Un número primo sólo se puede dividir entre 1 y sí mismo, por lo que cualquier otra
división dará decimales.

● Para saber si un número es primo basta con dividirlo entre todos los números primos
menores que ese número, si el resultado de esas divisiones tiene resto (es decir, ​% !=
0​) ese número es primo.

Reto 2
Crea un script que te dé la traducción de un color al inglés, a petición del usuario. El script
debe contener al menos 10 posibles traducciones que serán indicadas como posibilidades
al usuario (naranja, rojo, amarillo…). Usa un diccionario para almacenar las traducciones.

16
TEMA 5
Escribir y leer un archivo de texto

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

ÍNDICE

Escribir en un archivo 2

Leer un archivo 13

Instrucciones de código usadas 20

Reto 1 21

Reto 2 21

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Escribir en un archivo
Todos los scripts que hemos hecho hasta ahora tienen un pequeño hándicap. Todo cambio
en el programa que se realiza durante la ejecución del mismo (valores añadidos a listas o
diccionarios, variables, etc) se pierden una vez cerramos el programa.

Hay muchas maneras de guardar estos cambios y de volver a utilizarlos una vez se vuelve a
ejecutar el programa. Vamos a ver una forma de escribir en un archivo de texto y de leer
posteriormente el contenido del archivo.

De la misma forma que imprimimos valores de nuestros scripts, podemos guardar en


archivos información con cualquier extensión. El proceso de guardado y reutilización del
archivo para futuras ejecuciones del script no es complejo, pero si tiene muchas
posibilidades así que vamos a empezar con algo asequible y tras ello se puede ir iterando y
mejorando el uso de estas funciones de Python.

Para cualquier acción que requiera usar un archivo (ya sea escribir en el mismo o leer del
mismo) vamos a tener que, en primera instancia, abrirlo. Si le indicamos a Python que
queremos abrir un archivo, Python buscará el archivo indicado en la ubicación donde está el
script que está ejecutando y, de no existir dicho archivo, creará uno con el nombre indicado.

Al abrirlo, así mismo, debemos indicar en qué modo lo abre, pues Python tiene varias
posibilidades en esta línea:

● Abrirlo en modo lectura.

● Abrirlo en modo edición o escritura al final del mismo.

● Abrirlo en modo escritura desde cero, borrando lo que contiene.

Empecemos con el modo escritura, ya que es lo que inicialmente vamos a necesitar. Voy a
reutilizar un código del tema pasado para tal fin:

nombres ​=​ ​[​]


cantidad_nombres ​=​ input ​(​"¿Cuántos nombres quieres introducir en la
lista?: ")
cantidad_nombres ​=​ ​int​ ​(​cantidad_nombres)
for​ numero ​in​ range​(​cantidad_nombres​):
numero_texto ​=​ str​(​numero ​+​ ​1)
nombre_elegido ​=​ input​(​"Nombre número "​+​numero_texto​+​": ")
nombres​.​append​(​nombre_elegido)
print​ ​(​nombres)

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Recuerda que dicho programa nos permitía almacenar nombres en una lista. Vamos ahora a
hacer que el script, al finalizar, almacene los nombres en un archivo para poder tenerlos
guardados. Para ello tendremos que hacer una secuencia de tres acciones muy sencillas:

1. Abrir el archivo en modo escritura.

2. Escribir la información deseada en el archivo.

3. Cerrar el archivo.

Es importante siempre cerrar un archivo tras haber terminado de usarlo o podemos tener
problemas de acceso a la información que contenga si no lo hacemos.

Veamos cómo sería el código para guardar la lista nombres:

nombres = []
cantidad_nombres = input ("¿Cuántos nombres quieres introducir en la
lista?: ")
cantidad_nombres = int (cantidad_nombres)
for numero in range(cantidad_nombres):
numero_texto = str(numero + 1)
nombre_elegido = input("Nombre número "+numero_texto+": ")
[Link](nombre_elegido)
print (nombres)
archivo ​=​ open​(​"[Link]"​,​"w")
for​ nombre ​in​ nombres:
archivo​.​write ​(​nombre + ​"\n"​)
archivo​.​close​(​)

Como ves, es sencillo. Debemos indicar a Python que abra un archivo y guardamos el
archivo abierto bajo un nombre, en nuestro caso a ​ rchivo​ (a efectos prácticos podemos decir
que está utilizando una variable para ubicar el archivo abierto). Posteriormente indicamos
que queremos que el archivo se abra en modo ​“w”​, es decir, modo escritura (​write e​ n inglés).

Tras abrir el archivo indicamos a Python lo que queremos almacenar en el archivo con la
función .​ write​. En nuestro caso recorremos la variable n
​ ombres​ con un ​for​ y vamos
guardando cada elemento que contiene en el archivo. El comando ​\n ​indica un salto de
carro, es decir, que separe los elementos en líneas diferentes.

Tras ello indicamos que queremos cerrar el archivo con la función ​.close( )

Veamos su ejecución guardando tres nombres:

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Hasta aquí no hay ninguna diferencia aparente con el código del tema anterior, pero veamos
qué ha pasado en mi escritorio:

Se ha generado un archivo .​ txt ​llamado n


​ ombres. ​Dicho archivo debería contener los
nombres introducidos en la lista del script, veamos que contiene abriéndolo:

Efectivamente, se han guardado los nombres que pusimos en la lista. Prueba todo lo
anterior en tu equipo antes de seguir.

Python no permite almacenar una lista directamente, sólo permite almacenar strings, por
ello hemos recorrido la lista para almacenar sus elementos, que eran strings. Pero si
tenemos una lista que contiene otro tipo de datos o bien queremos guardar la lista entera
debemos convertirla en string previamente. Veamos cómo sería:

nombres = []
cantidad_nombres = input ("¿Cuántos nombres quieres introducir en la
lista?: ")

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

cantidad_nombres = int (cantidad_nombres)


for numero in range(cantidad_nombres):
numero_texto = str(numero + 1)
nombre_elegido = input("Nombre número "+numero_texto+": ")
[Link](nombre_elegido)
print (nombres)
archivo = open("[Link]","w")
nombres ​=​ str​(​nombres)
archivo​.​write​(​nombres)
[Link]()

El único cambio consiste en convertir la lista ​nombres​ a string y posteriormente la


imprimimos en el archivo. Una vez guardado y ejecutado vuelve a crear un archivo, pero
fijaros en la estructura que tiene ahora la información que contiene:

Como puedes ver, al convertir a string una lista, Python mantiene todas las partes de su
estructura (los corchetes, las comillas, las comas…). Por lo que puede ser una forma de
almacenar los datos algo más incómoda para trabajar posteriormente con ellos.

Nos quedamos con la opción de escritura de elementos por líneas y vamos a ver cómo
podríamos seguir escribiendo más nombres en un archivo ya creado. La opción para escribir
nuevos nombres requiere que aprendamos a abrir archivos en modo escritura tras el
contenido del archivo. Ese modo se denomina como ​“a”​ en vez de ​“w”​.

Si queremos añadir texto deberíamos dar al usuario la opción de decidir si quiere seguir
añadiendo nombres o empezar de nuevo la lista. Observa este código a ver si entiendes
todas sus partes:

nombres ​=​ ​[]


intencion ​=​ input ​(​"¿Quieres introducir más nombres en la lista
existente o quieres \n empezar una nueva lista? (1: Más nombres, 2:
Nueva lista): ")
cantidad_nombres ​=​ input​(​"¿Cuántos nombres quieres introducir en la
lista?: ")
cantidad_nombres ​=​ ​int​(​cantidad_nombres)
for​ numero ​in​ range​(​cantidad_nombres​):
numero_texto ​=​ str​(​numero​+​1)
nombre_elegido ​=​ input​(​"Nombre número "​+​numero_texto​+​": ")
nombres​.​append​(​nombre_elegido)

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

print​(​nombres)
if​ intencion ​==​ ​"​1​":
archivo ​=​ open​("​nombres​.​txt​","​a​")
​for​ nombre ​in​ nombres:
archivo​.​write ​(​nombre)
archivo​.​close​(​)
elif​ intencion ​==​ ​"​2​":
archivo ​=​ open​("​nombres​.​txt​","​w​")
​for​ nombre ​in​ nombres:
archivo​.​write ​(​nombre)
archivo​.​close​(​)

Simplemente preguntamos inicialmente si queremos escribir en un archivo nuevo (da igual


que exista, el comando “​ w”​ sobreescribe todo el contenido) o bien escribir al final de un
archivo existente. Tras elegir que opción queremos hacemos una cosa u otra en función de
la respuesta.

Prueba el script anterior las veces que quieras, aquí tienes una captura de la prueba del
mismo para crear una nueva lista primero y luego guardar nuevos nombres sobre la misma:

Y aquí el contenido del archivo de texto creado:

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

¿Ya lo has probado? ¡Perfecto! Con las nociones que posees del tema anterior puedes
recorrer cualquier lista o diccionario y guardarlo en un archivo en cualquiera de las dos
formas que hemos visto. También puedes guardar el contenido de cualquier variable, e
incluso podrías terminar siempre un programa preguntando con un ​input “¿Hay algo que
quieras guardar?”​ y guardar aquello que el usuario escriba.

Es posible que te preguntes para qué iba alguien querer hacer algo tan enrevesado para
reproducir una función directa de un archivo de texto, es decir, en un archivo de texto puedes
guardar los nombres que quieras directamente… Bueno, la gracia viene cuando introduces
las opciones de Python para que lo que almacenes tenga una verdadera utilidad.

Pongamos un ejemplo: quiero asignar un número a cada uno de los miembros de un grupo
de personas. Podría simplemente introducirlas aleatoriamente en una lista y el número que
le corresponde es el índice que ocupan en la lista (o bien el índice + 1 por aquello de que
nadie tenga el número 0). Tras realizar la lista aleatoria se guarda en un archivo y así la
tenemos para cuando queramos mirarla.

Veamos cómo sería ese programa para una lista de 5 personas. Lo primero que tenemos
que aprender es a generar números aleatorios y para ello importaremos una nueva librería:
random​:

import​ random

A continuación vamos a generar una lista de tantos números aleatorios como necesitemos.
Para ello podemos preguntar al usuario cuantos nombres quiere introducir aleatoriamente
en una lista y utilizar esa información:

import random
cantidad ​=​ input​(​"¿Cuántos nombres quieres introducir aleatoriamente en
la lista?: ")
cantidad ​=​ ​int​(​cantidad)

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Ya sabes cómo conseguir que el script pregunte una y otra vez al usuario si, al intentarlo, la
respuesta dada no puede ser convertida en ​int​ por no ser un número entero.

Ahora vamos con el código para generar números aleatorios que no se repitan. Vamos a
describirlo con lenguaje humano y posteriormente vemos cómo se dice en lenguaje Python:

Genera un número aleatorio entre 1 y la cantidad de nombres que tendrá la lista. A


continuación genera un nuevo aleatorio con la misma instrucción que no sea el primero.
Posteriormente genera un tercero que no sea ninguno de los dos ya creados y así hasta crear
tantos números aleatorios como nombres vaya a haber en la lista.

Para Python esto se dice de una forma un poco diferente, pero lo único nuevo sería saber
cómo se genera un número aleatorio. La instrucción para generar aleatorios es
[Link]​ seguida de dos parámetros que indican entre qué dos valores debe estar el
aleatorio: ​[Link](a,b)​, siendo a y b dichos valores, ambos incluidos.

Sigamos pues con nuestro script. Como tenemos que generar tantos números como
personas queramos en la lista usaremos un f​ or​:

import random
cantidad = input("¿Cuántos nombres quieres introducir aleatoriamente en
la lista?: ")
cantidad = int(cantidad)
for​ numero ​in​ range​(​cantidad​):
aleatorio ​=​ random​.​randint(​1​,​cantidad)
​print​(​aleatorio)

Prueba el script anterior para que veas su funcionamiento. Como ya dijimos anteriormente,
ten cuidado de no tener ningún archivo llamado random en el directorio donde se encuentre
tu script. Prueba introduciendo un número en torno a 10.

Aquí dejo la captura de pantalla de la ejecución del programa para 10 números:

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Como verás ha elegido 10 números aleatoriamente, pero algunos se repiten. Para que no se
repita ​podemos ir metiéndolos en una lista​ y, al generar uno nuevo, comprobamos si está en
la lista y si es así generamos uno nuevo, en caso contrario lo introducimos en la lista:

import random
cantidad = input("¿Cuántos nombres quieres introducir aleatoriamente en
la lista?: ")
cantidad = int(cantidad)
aleatorios ​=​ ​[]
for numero in range(cantidad):
aleatorio = [Link](1,cantidad)
​while​ aleatorio ​in​ aleatorios:
aleatorio ​=​ random​.​randint​(​1​,​cantidad)
aleatorios​.​append​(​aleatorio)
​print(aleatorio)

Como puedes ver, simplemente creamos un aleatorio y comprobamos si está en la lista


aleatorios​ y mientras así sea seguimos generando números aleatorios. Una vez no se
cumpla esta premisa pasaremos a almacenar el número en la lista a​ leatorios​ e imprimirlo.

Pruébalo, aquí tienes la captura que certifica su funcionamiento:

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Volvamos a nuestro programa. Ahora que tenemos esa lista de aleatorios sólo tenemos que
generar la otra lista, la de nombres que hay que organizar aleatoriamente.

import random
cantidad = input("¿Cuántos nombres quieres introducir aleatoriamente en
la lista?: ")
cantidad = int(cantidad)
aleatorios = []
for numero in range(cantidad):
aleatorio = [Link](1,cantidad)
while aleatorio in aleatorios:
aleatorio = [Link](1,cantidad)
[Link](aleatorio)
nombres ​=​ ​[]
for​ i ​in​ range ​(​cantidad​):
nombreNumero ​=​ str​(​i​+​1)
nombre ​=​ input​(​"Nombre "​+​nombreNumero​+​": ")
nombres​.​append​(​nombre)
print(aleatorios)
print​(​nombres)

Intenta entender el código anterior y pruébalo hasta que tengas claro cómo está
funcionando.

Aquí tienes una captura de su ejecución:

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Si observas la captura puedes ver que tenemos dos listas, una con números y otra con
nombres. Ahora lo más sencillo sería vincular ambas listas de manera que el índice 0 de una
lista se asigne al índice 0 de la otra. Podemos hacer un diccionario en el cual la clave sea el
nombre y el valor sea el número:

import random
cantidad = input("¿Cuántos nombres quieres introducir aleatoriamente en
la lista?: ")
cantidad = int(cantidad)
aleatorios = []
for numero in range(cantidad):
aleatorio = [Link](1,cantidad)
while aleatorio in aleatorios:
aleatorio = [Link](1,cantidad)
[Link](aleatorio)
nombres = []
for i in range(cantidad):
nombreNumero = str(i+1)
nombre = input("Nombre "+nombreNumero+": ")
[Link](nombre)
print(aleatorios)
print(nombres)
diccionario ​=​ ​{}
for​ i ​in​ range​(​len​(​aleatorios​)):
diccionario​[​nombres​[​i​]]​ ​=​ aleatorios​[​i]
print​(​diccionario)

Una vez más, prueba el código guardándolo como script y asegúrate de entender cómo
funciona. Es importante tener claro esto antes de pasar al siguiente punto. Dejo una vez más
una captura de su ejecución para 4 nombres:

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Si ya has comprendido el código anterior llega el momento de que intentes guardar en un


archivo el diccionario que hemos generado con el script. Recuerda guardarlo como string
antes. Ahora si empieza a tener algo de sentido este script, ¿verdad? Guardamos un
diccionario con números aleatorios y lo tenemos para cuando queramos revisar qué número
tenía asignado cada nombre.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Leer un archivo
Vamos ahora a ver cómo podemos sacar información de un archivo. El proceso es sencillo,
simplemente tenemos que indicar a Python que queremos abrir el archivo en modo lectura
(​“r”​) e indicar que queremos leerlo. Python automáticamente guardará el contenido del
archivo como un string. Veamos cómo abrir el archivo creado anteriormente para guardar
nombres:

archivo ​=​ open​(​"[Link]"​,​"r")


contenido ​=​ archivo​.​read​(​)
print​ ​(​contenido)
archivo​.​close​(​)

Guarda el anterior código como script y ejecútalo. Asegúrate de que exista el archivo
“[Link]” e
​ n la ruta donde guardes el script. Si no fuese así crea uno con una lista de
nombres (con un nombre en cada línea).

Si tratamos de abrir un archivo que no existe Python nos dará error. Al guardar en archivo sí
crea uno en caso de no existir, pero esto no ocurre a la hora de abrir un archivo no existente:

También se puede imprimir directamente el contenido del archivo, sin guardarlo:

archivo ​=​ open​(​"[Link]"​,​"r")


print​(​archivo​.​read​()​)
archivo​.​close​(​)

Cuidado al abrir archivos que contengan tildes o símbolos no anglosajones desde el IDLE,
puede ocurrir que se produzcan errores. En general, como indicamos en el primer tema, no
es buena práctica usar cualquier tipo de caracteres que no sean anglosajones (tildes,
interrogaciones y admiraciones iniciales, etc).

Otra forma de abrir un archivo es leerlo línea a línea, el código sería el siguiente:

archivo ​=​ open​(​"[Link]"​,​"r")

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

for​ linea ​in​ archivo:


​print​(​linea)
archivo​.​close​(​)

Prueba el código para que veas cómo hace lo mismo que el anterior, si bien el espacio entre
las líneas al imprimirlas es doble.

Podemos utilizar el código anterior para ir almacenando el contenido de cada línea en una
lista:

archivo ​=​ open​(​"[Link]"​,​"r")


nombres ​=​ ​[​]
for​ linea ​in​ archivo:
nombres​.​append​(​linea)
archivo​.​close​(​)
print​(​nombres)

Parece que el anterior código debería funcionar sin problemas. Pruébalo como script antes
de seguir.

El código anterior está funcionando correctamente, pero tiene un pequeño problema...

… al final de cada línea del archivo de texto hay un salto de carro y como Python es muy
obediente lo ha incluido como parte de cada nombre con lo cual la lista ​nombres​ tiene que
ser depurada. Esto es algo habitual al incorporar caracteres de texto de un archivo a un
programa, generalmente tendremos que eliminar algunos caracteres o bien sustituirlos por
otros.

Veamos cómo podemos eliminar ese incómodo salto de carro (​\n​):

archivo = open("[Link]","r")
nombres = []
for linea in archivo:
linea ​=​ linea​.​replace​("​\n​","")
​[Link](linea)
[Link]()
print(nombres)

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

La función ​replace​ nos permite, en un string, sustituir unos caracteres por otros. En mi
programa estoy sustituyendo el salto de carro por nada (poner dos dobles comillas indica
que quieres poner lo que contienen las dobles comillas en un string, y como no contienen
nada, no pondremos nada).

Prueba el código anterior, si no lo entiendes bien pruébalo incluyendo algún carácter entre
las segundas dobles comillas, por ejemplo un signo de admiración:

archivo = open("[Link]","r")
nombres = []
for linea in archivo:
linea ​=​ linea​.​replace​("​\n​","!")
​ [Link](linea)
[Link]()
print(nombres)

Si vemos la ejecución del programa anterior nos daremos cuenta que ha sustituido el salto
de carro por una admiración:

Perfecto, ya hemos conseguido leer un archivo. Ahora vamos a ver otro problema que
podemos encontrarnos.

¿Qué ocurre si hemos guardado una lista como tal directamente en el archivo? Si recordáis,
al principio del tema veíamos este caso:

Si incorporamos esa lista al programa tendremos que ver cómo sustituimos más cosas, no
sólo el salto de carro. Vamos a crear el archivo de texto que contenga esa información y
vemos cómo podemos ir trabajando ese string para convertirlo en una lista.

Crea un archivo n
​ [Link]​ con una lista de tres nombres como la de arriba y abrela con el
script creado anteriormente antes de seguir. No pongas tilde en María en caso de estar
usando la IDLE.

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Aquí tenéis la captura de lo que está ocurriendo ahora:

Menudo follón. Tenemos una lista que contiene un único elemento lleno de comas, comillas,
etc. Además, las comillas se han convertido en comillas iniciales y finales… Esto nos va a
llevar un rato.

Empecemos eliminando varias cosas que no necesitamos:

archivo = open("[Link]","r")
nombres = []
for​ linea ​in​ archivo:
linea ​=​ linea​.​replace​("​\n​","")
linea ​=​ linea​.​replace​("[","")
linea ​=​ linea​.​replace​("]","")
linea ​=​ linea​.​replace​(""","")
linea ​=​ linea​.​replace​(""","")
nombres​.​append​(​linea)
[Link]()
print(nombres)

Puede parecer confuso porque este editor de texto interpreta los caracteres, a ver si
poniendo captura de un editor de código lo tenéis más claro:

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

Prueba a guardar el código como un script y ejecutarlo para ver qué ocurre. Cuidado con las
comillas, es complicado poner unas comillas en un editor de código, lo más fácil a veces es
copiarlas de algún sitio y pegarlas porque el editor, al escribirlas con el teclado, las pone
como comillas rectas.

¿Ya lo has probado? El resultado deberías ser el siguiente:

Parece que ya tenemos una lista al uso, pero hay que tener cuidado porque las apariencias
engañan. Si te fijas, los nombres están todos englobados bajo unas únicas comillas simples,
esto quiere decir que todo ello es un único elemento de la lista. Las listas guardan cada
elemento (en caso de ser un string) englobado en comillas, nuestra lista debería tener un
aspecto similar a este:

["​Alfredo​","​Maria​","​Juan​"]

Para ello vamos a usar un último elemento que parte los strings por un caracter concreto
que tendremos que indicar, convirtiéndolos en listas con tantos elementos como los que
queden al partir el string:

archivo = open("[Link]","r")

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

nombres = []
for linea in archivo:
linea = [Link]("\n","")
linea = [Link]("[","")
linea = [Link]("]","")
linea = [Link](""","")
linea = [Link](""","")
linea ​=​ linea​.​split​(",")
​[Link](linea)
[Link]()
print(nombres)

Prueba el código anterior, debería salirte algo similar a ésto:

El comando ​.split​ parte un string por el caracter indicado, eliminándolo. Si indicamos a


Python que parta por las comas, Python crea una lista de tantos elementos como comas
haya mas uno, ya que la primera coma que sustituimos nos dará una lista de 2 elementos y
posteriormente cada nueva coma añade un nuevo elemento.

Por lo tanto pasamos a tener una lista dentro de nuestra lista. Para evitar este efecto sólo
tendríamos que ir recorriendo la lista generada e introduciendo sus elementos en nuestra
lista ​nombres​:

archivo = open("[Link]","r")
nombres = []
for linea in archivo:
linea = [Link]("\n","")
linea = [Link]("[","")
linea = [Link]("]","")
linea = [Link]("”","")
linea = [Link]("“","")
linea = [Link](",")
​for​ elemento ​in​ linea:
nombres​.​append​(​elemento)
[Link]()
print(nombres)

18
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto

¡Hecho! guárdalo en un script y ejecútalo intentando entender todo lo que ha ocurrido antes
de continuar.

Aquí tienes una captura de cómo nuestro archivo ha sido, por fin, incorporado como lista a
un script de Python:

Ahora toca trabajar para afianzar todo lo visto en este tema.

19
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 5: Escribir y leer un archivo de texto

Instrucciones de código usadas

#Abrir un archivo en modo escritura, borrando el contenido


archivo ​=​ open​(​"[Link]"​,​"w")
#Escribir contenido en un archivo
archivo​.​write​(​contenido)
#Cerrar un archivo
archivo​.​close​()
#Abrir un archivo en modo escritura tras el contenido existente
archivo ​=​ open​(​"[Link]"​,​"a")
#Importar biblioteca para generar aleatorios
​import​ random
#Crear un número aleatorio entre dos valores y guardarlo en una variable
variable ​=​ random​.​randint​(​a​,​b)
#Abrir un archivo en modo lectura
archivo ​=​ open​(​"[Link]"​,​"r")
#Leer el contenido de un archivo
archivo​.​read​()
#Sustituir caracteres de un string
​string​.​replace​(​"caracter_antiguo"​,​"caracter_nuevo")
#Partir un string por un caracter concreto
​string​.​split​(​"caracter")

20
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 5: Escribir y leer un archivo de texto

Reto 1
Trata de crear un script que guarde una lista de nombres en un archivo ya existente que
contenga una lista, leyendo previamente la lista. Inicialmente tendremos que abrir el archivo
con cuidado de que, en caso de no existir, Python nos dará un error (prueba con un t​ ry -
except​).

El script nos tendrá que dar la opción de utilizar los nombres existentes en la lista y seguir
incorporando nuevos o bien eliminarlos todos y empezar de cero.

Reto 2
Crea un script que te permita ir almacenando en un archivo una lista de la compra. Utiliza un
diccionario para almacenar cada artículo que hay que adquirir y la cantidad necesaria
(tendrás que ir preguntando al usuario y generar dos listas, una de artículos y otra de
cantidades). El usuario debería poder elegir entre introducir un nuevo artículo o terminar la
lista. Una vez terminada la lista habrá que guardarla en un archivo de texto en un formato
legible (un artículo por línea, por ejemplo).

21
TEMA 6
Funciones

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

ÍNDICE

Funciones 2

Funciones con retorno 7

Funciones con parámetros 10

Instrucciones de código usadas 17

Reto 18

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Funciones
Llegados a este punto vamos a hacernos una pregunta: si hay una instrucción que se repite
muchas veces en un programa… ¿no podría escribirlo una única vez y que el programa sepa
lo que tiene que hacer cada vez que toque? Algo así como lo que ocurre cuando usas una
biblioteca (recordad que hemos usado la biblioteca t​ ime​ y la biblioteca ​random​).

Pues sí, podemos utilizar una función de Python que nos permite almacenar el código que
necesitemos ejecutar y aplicarlo a cualquier parte de nuestro programa. Esta función lo que
hace es encapsular una fracción de código y, cuando nosotros le digamos, la utiliza en aquel
punto del script que sea necesario.

Aprendamos pues a crear funciones, estructuras de código que se pueden reutilizar a lo


largo de un programa las veces que necesitemos. Para crear una función hay que definirla:

def​ miPrimeraFuncion​():

Una vez que hemos definido nuestra función sólo tenemos que crear el código que
queremos almacenar en la función, por ejemplo:

def miPrimeraFuncion():
​print​(​"Ou Yeah!")

Posteriormente podremos llamar a la función en cualquier punto de un programa


simplemente mencionándola:

def miPrimeraFuncion():
print("Ou Yeah!")
miPrimeraFuncion​(​)
miPrimeraFuncion​(​)
miPrimeraFuncion​(​)

Aquí tienes una captura de cómo se utiliza por terminal:

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

¡Fantástico! Vamos a darle uso. Guarda el siguiente programa como script y ejecútalo por
terminal o IDLE:

terminamos ​=​ 0
#Creo mi función
def​ funcionSuma​():
​#Pregunto los números a sumar
numero1 ​=​ input​(​"Primer numero: ")
numero2 ​=​ input​(​"Segundo numero: ")
​#Los convierto en entero:
numero1 ​=​ ​int​(​numero1)
numero2 ​=​ ​int​(​numero2)
​#Sumo los números y los imprimo
suma ​=​ numero1​+​numero2
​print​(​suma)
while​ terminamos ​==​ ​0:
​print​(​"Nuestras opciones:")
​print​(​"1. Realizar una suma")
​print​(​"2. Terminar")
pregunta ​=​ input​(​"¿Qué quieres hacer? (1 o 2): ")
​if​ pregunta ​==​ ​"1":
​#Llamo a la función
funcionSuma​()
​elif​ pregunta ​==​ ​"2":
​print​ ​(​"Adiós")
terminamos ​=​ 1

Si lo ejecutas obtendrás lo siguiente:

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

¡Perfecto! Hemos conseguido sumar dos números y hacerlo las veces que haga falta. Ahora
bien, a veces querremos usar el resultado de la ejecución de la función fuera de la misma,
además de imprimirlo. En nuestro ejemplo anterior, sin ir más lejos, puede que en otra parte
posterior de nuestro script tengamos que utilizar la suma que hemos realizado.

Vamos a incluir una línea que imprima el valor que tiene la variable ​suma​ cuando queramos
salir del programa:

terminamos = 0
def funcionSuma():
numero1 = input("Primer numero: ")
numero2 = input("Segundo numero: ")
numero1 = int(numero1)
numero2 = int(numero2)
suma = numero1+numero2
print(suma)
while terminamos == 0:
print("Nuestras opciones:")
print("1. Realizar una suma")
print("2. Terminar")
pregunta = input("¿Qué quieres hacer? (1 o 2): ")
if pregunta == "1":
funcionSuma()
elif pregunta == "2":
​#Tratamos de imprimir la variable suma propia de la función
​print​(​suma)
​ print("Adiós")
terminamos = 1

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Aquí tenéis el resultado de ejecutarlo:

Vaya, no está saliendo la cosa como esperábamos. Al presionar el 2 el script se finaliza, sí,
pero no me muestra el valor de la variable suma que era 5, me dice que la función suma está
en… un número algo complejo (​0x1003c2bf8​).

Este ejercicio que acabamos de hacer es muy importante y además nos ha llevado de lleno
a uno de los problemas de Python para la gente que ha programado en otros lenguajes: el
ámbito de las variables.

Las variables se crean en un ámbito. Si están creadas en el programa general (lo que hemos
hecho hasta ahora) s​ e pueden usar en ese ámbito ​y ​se pueden leer desde otros ámbitos,
pero no modificarlas.

Un ámbito es un espacio de código, está delimitado. Para entenderlo podemos poner un


ejemplo: piensa en un edificio de viviendas. Cada propietario tiene su casa, es su ámbito y
sólo él puede usar todo lo que en ella se encuentra puede ser usado. Ahora bien, cada
propietario tiene también acceso a las zonas comunes (pasillos, ascensor, parking…). Las
cosas que allí se encuentran son accesibles por todos los propietarios ya que es un ámbito
global, pero no pueden ser modificadas por un propietario ya que no son exclusivas del
mismo.

Si una variable está creada en un ámbito concreto (como el ámbito de una función), sólo
existe en ese ámbito. Se crea con el ámbito y se destruye al acabar este. Por ello, toda
variable creada en una función no puede ser utilizada fuera de la función a no ser que
indiquemos que esa variable será g ​ lobal. ​Las variables usadas en la función anterior son
locales​, es decir, se crean con la función y tienen vida en su ejecución, desapareciendo tras
ello.

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Podemos, a nuestra voluntad, indicar que en un ámbito vamos a usar una variable global.
Para ello tenemos que indicar al principio de una función que vamos a crear una variable
pero que queremos que permanezca, es decir, que sea global, lo cual se hace simplemente
poniendo ​global​ seguido del nombre de la variable:

terminamos = 0
def funcionSuma():
​#Creo mi variable global
​global​ suma
​ numero1 = input("Primer numero: ")
numero2 = input("Segundo numero: ")
numero1 = int(numero1)
numero2 = int(numero2)
suma = numero1+numero2
print(suma)
while terminamos == 0:
print("Nuestras opciones:")
print("1. Realizar una suma")
print("2. Terminar")
pregunta = input("¿Qué quieres hacer? (1 o 2): ")
if pregunta == "1":
funcionSuma()
elif pregunta == "2":
print(suma)
print("Adiós")
terminamos = 1

Si pruebas el código anterior verás que, efectivamente, está devolviendo el valor de la


variable suma antes de terminar.

Ahora bien, el problema de las variables globales es que muchas veces perdemos su rastro,
permanecen creadas en programas muy extensos y no las usamos más o bien cambiamos
su valor en determinados sitios del programa sin saber dónde se está cambiando y pueden
llevarnos a errores. No es una práctica recomendable en programación en Python, por lo que
existe una forma más sencilla de conseguir que el resultado de una función pueda ser
utilizado fuera del ámbito de la misma: ​las funciones con retorno.

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Funciones con retorno


Las funciones con retorno se ejecutan igual que las funciones que ya hemos visto y, al final
de su ejecución, nos entregan todo aquello que le pidamos que nos entreguen, es decir, nos
retornan valores​ que podemos almacenar y usar.

Para que una función se convierta en una función con retorno simplemente tengo que
terminar con un r​ eturn​ e indicar qué quiero que la función me devuelva. En nuestro caso
necesitamos que nos devuelva la suma de n ​ umero1 y​ ​numero2​. Eso sí, es importante saber
que e
​ l valor que retorna la función debe ser almacenado en una variable​ si queremos
usarlo.

Para ello, a la hora de llamar a la función, la llamaremos dentro del valor de una variable (por
ejemplo ​suma = funcionSuma( )​ ):

terminamos = 0
def funcionSuma():
numero1 = input("Primer numero: ")
numero2 = input("Segundo numero: ")
numero1 = int(numero1)
numero2 = int(numero2)
​#Devuelvo la suma de los números
​return​ numero1​+​numero2
while terminamos == 0:
print("Nuestras opciones:")
print("1. Realizar una suma")
print("2. Terminar")
pregunta = input("¿Qué quieres hacer? (1 o 2): ")
if pregunta == "1":
​"""Llamamos la función suma y almacenamos el retorno en la
variable suma"""
suma ​=​ funcionSuma​()
elif pregunta == "2":
print(suma)
print("Adiós")
terminamos = 1

Guarda el código anterior y ejecútalo como script desde Terminal o IDLE.

Como habrás podido comprobar, sale exactamente lo mismo que con la variable global,
pero es una mejor práctica, ya que la variable se usa en su ámbito y nos devuelve un valor
que nosotros podemos almacenar cómo y dónde queramos.

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

La realidad es que el programa anterior es poco útil, una suma es algo que es casi más
sencillo hacer directamente que ponerlo en una función, pero podemos realizar funciones
para diferentes opciones que sí requieren códigos más complejos y ahorramos un proceso
tedioso, sobre todo si la función se repite muchas veces a lo largo del código.

Una función con retorno nos puede devolver los valores que queramos, pero sólo tenemos
una opción de retornar un valor, una vez retornamos un valor se acaba la ejecución de la
función. Si queremos retornar v​ arios valores ​lo indicaremos todo dentro del r​ eturn​ y Python
nos ​devolverá una lista​. Cambiemos el ​return​ de nuestra función y veamos qué pasa:

terminamos = 0
def funcionSuma():
numero1 = input("Primer numero: ")
numero2 = input("Segundo numero: ")
numero1 = int(numero1)
numero2 = int(numero2)
​#Devuelvo la suma de los números
​return​ numero1 ​+​ numero2​,​ numero1​,​ numero2
while terminamos == 0:
print("Nuestras opciones:")
print("1. Realizar una suma")
print("2. Terminar")
pregunta = input("¿Qué quieres hacer? (1 o 2): ")
if pregunta == "1":
​ suma = funcionSuma()
elif pregunta == "2":
print(suma)
print("Adiós")
terminamos = 1

Vamos a ejecutar el código anterior:

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Como puedes ver, el script finaliza devolviendo una lista con valores ​(33, 13, 20)​ antes de
despedirse. Como ya sabemos utilizar listas, podemos perfectamente decidir cómo usamos
los valores que devuelve la función, pero es importante tener claro qué valores nos está
devolviendo la función.

Ahora que sabemos utilizar funciones con retorno vamos a ver un paso más en las
funciones: funciones a las que, al llamarlas, le indicamos ciertos parámetros o valores. Por
ejemplo, al llamar a la función suma podríamos indicarle los números que tiene que sumar,
algo así como ​suma (2, 6) p​ ara sumar un 2 y un 6. Dichas funciones se denominan
funciones con parámetros.

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Funciones con parámetros


Si os fijáis, al definir las funciones anteriores teníamos unos paréntesis vacíos detrás: ​def
suma ( )

Entre esos paréntesis podemos indicar valores que deberán ser entregados a la hora de
llamar a la función. En el caso de la suma podemos indicar que cuando queramos hacer la
suma se darán los números a sumar.

En la función podemos determinar tantos parámetros como queramos recibir, si yo quiero


realizar una suma de dos números declararé que van a llegar dos números:

def​ suma​(​numero1​,​numero2)
suma ​=​ numero1​+​numero2
​return​ suma

La función anterior, al ser llamada, sumará los dos parámetros que le llegan entre
paréntesis, a los que llamamos ​numero1 y​ ​ numero2​ en la definición de la función pero que
realmente​ tendrán el valor que declaremos a la hora de llamar a la función​:

def suma (numero1, numero2):


suma = numero1 + numero2
return suma
operacion ​=​ suma​(​2​,​7)
print​(​operacion)

El código anterior tiene definida una función que realiza una suma y posteriormente
llamamos a la función, almacenando el resultado retornado en la variable ​operacion​.

Por experiencia, este proceso es complicado de entender si no tenemos soltura en algún


lenguaje de programación. El asunto es que, al llamar a una función que tiene parámetros,
tenemos que indicar dichos parámetros para que la función se pueda ejecutar. Al definir la
función s
​ uma​ declaramos que va a recibir dos números al ser llamada y que tiene que sumar
dichos números.

En lenguaje humano es fácil de describir este proceso, le estamos diciendo a Python:

“Cuando el usuario lo necesite te va a llamar y te va a dar dos números, tu tienes que sumar
dichos números y darle el resultado de la suma”.

Ahora bien, el proceso se complica un poquito sí en vez de dar dos números al llamar a una
función doy dos variables. Es decir, quiero sumar dos números, pero esos números están

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

dentro de dos variables (imagina que queremos un programa en el cual el usuario pueda
indicar qué números quiere sumar, como pasaba en el ejemplo de la función con retorno).

Veamos cómo quedaría el código:

def suma(numero1,numero2):
suma = numero1+numero2
return suma
print​ ​(​"Vamos a sumar dos números")
a ​=​ ​int​(​input​(​"¿Cual es el primer número?: "​))
b ​=​ ​int​(​input​(​"¿Cual es el segundo número?: "​))
operacion ​=​ suma​(​a​,​b)
print(operacion)

Guarda el código anterior como script y ejecútalo antes de seguir.

Aquí tienes la captura del programa ejecutado:

Vamos a estructurar cómo sucede el script:

1. El script indica que vamos a sumar dos números.

2. Pregunta el primer número y guarda el valor contestado en la variable a


​ .

3. Pregunta el segundo número y guarda el valor contestado en la variable b


​ .

4. Llama a la función ​suma​ indicando como parámetros ​a​ y b


​ ​ e indica que el resultado
debe almacenarse en la variable o​ peracion​.

5. Al ser llamada, la función s


​ uma​ debe recibir dos valores, que dentro de la función
serán llamados ​numero1​ y n ​ umero2​. Los números recibidos son dos variables (​a​ y b
​ )​ ,
lo cual quiere decir que la función s
​ uma​ operará con los números que contienen
dichas variables.

6. Imprimimos el valor de la variable ​operacion​, que será el resultado de la suma de las


variables a
​ ​ y ​b​.

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

El proceso de las variables es el siguiente:

La función espera n
​ umero1​ → n
​ umero1 ​recibe ​a​ → ​a​ vale 127 → ​numero1​ pasa a valer 127

Espero que haya quedado claro, no tengas problema en repasarlo con calma, es importante
para el futuro asentar este proceso.

Vamos a ver algo un poco más “útil” que una simple suma. Veamos una función para
determinar la media:

def​ media​(​numero1​,​numero2​):
suma ​=​ numero1​+​numero2
media ​=​ suma​/​2
​return​ media
media ​=​ media​(​17​,​40)
print​(​media)

Puedes probar el script tras guardarlo.

El resultado del script será ​28,5​, es decir, la media de los números 17 y 40. Ahora bien, las
medias no son siempre de 2 números y tampoco tenemos por qué conocer los números de
los que hay que hacer la media al crear el script… ¿qué tal si vemos cómo puedo hacer una
función que calcule la media sin saber de cuántos números hay que hacerla?

Si, al declarar la función, situamos delante de uno de sus parámetros un asterisco, le


estamos diciendo a Python que va a llegar un ​arbitrario​, que no es más que un conjunto de
números de los que desconocemos su longitud:

def​ media​(*​numeros​):

A la hora de llamar a la función habrá que declarar los números de los que necesitamos
hacer la media:

def media (*numeros):


​#Aquí se incluirá el código necesario para hallar la media
miMedia ​=​ media​(​6​,​7​,​8​,​1​,​5​,​1)

El resultado que me devuelva la función m


​ edia​ será guardado en la variable m
​ iMedia.

Los parámetros arbitrarios se utilizan como si fuesen tuplas, se pueden recorrer para ver sus
valores con un bucle ​for​ y se puede ver cuántos datos contiene con la función l​ en​.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

def media(*numeros):
a ​=​ 0
​for​ numero ​in​ numeros:
​#Recorro el arbitrario y voy almacenando el valor acumulado
a ​=​ a​+​numero
​"""Divido la suma de todos los números que contiene el arbitrario
entre su longitud"""
media ​=​ a​/​len​(​numeros)
​return​ media
#Aplico la función a unos números concretos
miMedia = media(5,7,9,1,2,8)
miMedia ​=​ str​(​miMedia)
print​(​"La media es "​+​miMedia)

Puedes probar el código anterior guardándolo como script y ejecutándolo:

Habría que utilizar la función de Python para redondear el resultado a dos o tres decimales,
pero por lo demás, tenemos una media.

Para recoger todo lo tratado de las funciones veamos el siguiente esquema:

● Si quiero una función que repita un código que únicamente imprime un valor, puedo
usar una f​ unción​.

● Si quiero una función que me dé un valor para usar fuera de la misma, es decir, en
cualquier punto del programa, usaré una ​función con retorno​.

● Si quiero que la función, al ser llamada, ejecute su código con unos valores que
variarán según cuando sea llamada utilizaré una f​ unción con parámetros​. Dicha
función puede ser con retorno o sin retorno, en función de lo que necesitamos.

● Por último, si la cantidad de valores variables que necesitará la función es también


desconocida crearemos una f​ unción con parámetros arbitrarios​.

Veamos una última posibilidad en las funciones con parámetros y retorno. Imagina que
queremos hallar la media de una serie de números que debe decidir el usuario. Podríamos
construir el siguiente programa:

1. El programa pregunta al usuario de cuántos números necesita calcular la media.

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

2. A continuación va preguntando cada número e introduciéndolo en una lista.

3. Cuando tenemos la lista completa llamaremos a una función que realice la media
con los valores de la lista.

Vamos a ver primero el programa para guardar los números que quiera el usuario:

cantidad ​=​ input​(​"¿De cuántos valores necesitas hacer la media?: ")


cantidad ​=​ ​int​(​cantidad)
valores ​=​ ​[​]
for​ i ​in​ range​(​cantidad​):
i ​=​ str​(​i​+​1)
valor ​=​ input​(​"Valor número "​+​i​+​": ")
​#Convertimos a float por si el usuario introduce un número decimal
valor ​=​ ​float​(​valor)
valores​.​append​(​valor)
print​(​valores)

Guarda el código anterior como script y ejecútalo para ver qué está ocurriendo, aunque
deberías tener claro cómo va a funcionar llegados a este punto.

Una vez lo tengas claro vamos a crear la función que reciba esa lista y la recorra y haga la
media. Es sencillo, de la misma forma que puedo enviar datos por parámetros puedo enviar
listas. Una vez la recibo, tengo que recorrerla y realizar la media de todos sus elementos:

1. El programa recibe la lista

2. La recorre y va acumulando la suma de sus valores en una variable

3. Divide el valor acumulado en la variable entre el número de elementos de la lista

4. Devuelve el valor conseguido

¿Crees que eres capaz de hacerlo sin ver cómo se hace? Intenta crear esa función antes de
seguir, si te genera problemas sigue leyendo para ver cómo se haría:

def​ media​(​valores​):
a ​=​ 0
​for​ i ​in​ valores:
a ​=​ a​+​i
media ​=​ a​/​len​(​valores)
​return​ media

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

La función recibe un parámetro llamado v​ alores​ que, en el caso de nuestro programa, será
una lista. A continuación creamos la variable ​a​ para ir guardando el valor de la suma de los
valores que tiene nuestra lista. Una vez hemos recorrido la lista ​valores e​ ntera dividimos la
suma de su contenido (​a)​ entre el número de valores que tiene la lista (​len (valores) ​) y
guardamos el resultado en la variable ​media​, devolviendo ese valor como retorno al
programa.

Ahora sólo queda unir los ejemplos anteriores y llamar a la función m


​ edia​ dando como
parámetro la lista donde hayamos guardado los números e imprimir el resultado. El
programa completo quedaría así:

def media(valores):
a = 0
for i in valores:
a = a+i
media = a/len(valores)
return media
cantidad = input("¿De cuántos valores necesitas hacer la media?: ")
cantidad = int(cantidad)
valores = []
for i in range(cantidad):
i = str(i+1)
valor = input("Valor número "+i+": ")
valor = float(valor)
[Link](valor)
miMedia ​=​ media​(​valores)
miMedia ​=​ str​(​miMedia)
print​(​"La media es "​+​miMedia)

Aquí dejo una captura de pantalla de la ejecución del código con varios números para que se
vea cómo funciona:

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Y con ésto podemos dar por concluido el tema de funciones. Con el tiempo irás
descubriendo muchas más opciones y utilidades de las funciones, pero de momento tienes
una buena base para utilizarlas.

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Instrucciones de código usadas

#Definir una función


​def​ funcion​():
#Llamar a una función para que se ejecute
funcion​()
#Crear una variable global
​global​ variable
#Función con retorno
​def​ funcion​():
​#Código
​return​ valor
#Función con parámetros
​def​ funcion​(​parametros​):
#Función con parámetros arbitrarios
​def​ funcion​(*​arbitrarios)

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones

Reto
Crea un script en el cual el usuario pueda pedir al programa combinaciones aleatorias para
jugar a euromillones (un juego de azar europeo). El script debe cumplir con la siguiente serie
de requisitos:

1. Cada combinación para euromillones debe tener cinco números entre el 1 y el 50 y


dos estrellas (otros dos números) del 1 al 12.

2. El programa preguntará al inicio al usuario cuántas combinaciones de euromillones


quiere crear y las imprimirá separadas y con alguna descripción del tipo C
​ ombinación
1:

3. El programa debe preguntar al usuario si quiere generar más combinaciones o


terminar el script tras cada proceso de generación de combinaciones.

4. La generación de combinaciones debe estar en una función con parámetros y


retorno.

18
TEMA 7
Clases

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

ÍNDICE

Programación orientada a objetos 2

Clases 3

Creando una clase 4

Creando el constructor 5

Creando métodos 11

Utilizando clases 14

Instrucciones de código usadas 17

Reto 18

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Programación orientada a objetos


Tras todo lo aprendido en los seis capítulos anteriores podemos empezar a hablar de la
programación orientada a objetos​. Este tema va a ser tratado únicamente en este capítulo y
tiene una gran relevancia, pero al mismo tiempo requiere ciertos conocimientos de
programación y no se puede llegar al verdadero potencial, aunque sí se puede vislumbrar y
trataré de que lo consigas ver. Intenta a lo largo del capítulo entender cómo la programación
orientada a objetos puede ser de ayuda para usarla en el futuro.

Comencemos, imagina que quieres hacer un juego de batallas en una tierra fantástica. En
dicho juego hay un montón de cosas que tienes que crear: elfos, enanos, humanos, orcos,
caballos, espadas, hachas… Pues bien, todas esas cosas que deberías crear para el juego
son llamadas, en programación, ​objetos​. Por lo tanto, a partir de ese momento, al ir creando
el juego empezarás a enfocar tu programación a los objetos, es decir, necesitarás
programar qué hará cada uno de los humanos (ya que cada uno será un objeto), cada elfo,
cómo interactuarán, qué aspecto tendrán, que tamaño…

Pues bien, todo ello, así, de forma muy resumida, es la programación orientada a objetos.
Dicha programación se enfoca a algo más que variables, listas y diccionarios, se enfoca a
objetos completos que tienen sus propias variables, sus propias listas…

Ahora que entendemos qué es un objeto, vamos a centrarnos en ellos. Un objeto se puede
describir (¿cómo es?) y puede hacer cosas (¿qué habilidades tiene?). Pongamos, siguiendo
con el ejemplo, que quiero crear un elfo. El elfo tendrá un tamaño, un peso, una fuerza… es
decir, s
​ e puede describir o tiene atributos​. El elfo también podrá correr, saltar… es decir,
podrá realizar acciones​.

● En programación, a los atributos de un objeto los denominaremos p


​ ropiedades.

● Así mismo, a las acciones que puede realizar un objeto las denominaremos
métodos.

Además de todo lo anterior, los objetos se pueden agrupar por tener propiedades y métodos
similares. Sigamos con el ejemplo: un elfo tendrá un nombre, una fuerza, una altura… pero
un humano también tendrá un nombre, una fuerza y una altura. Por ello, a los objetos que
comparten propiedades y métodos se les denominan ​clases.

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Clases
Todos los objetos que comparten propiedades y métodos se pueden construir desde un
mismo ​modelo. ​Imagina que quieres hacer un ejército de elfos, enanos y humanos y
necesitas describir a todos los soldados de una forma un poco genérica, podrías decir que…

● Todos los soldados tienen una raza

● Todos los soldados tienen un nombre

● Todos los soldados poseen una fuerza

● Todos los soldados son capaces de correr a una velocidad

● Todos los soldados tienen un arma

Pues bien, a un modelo que representa a un conjunto de objetos se le denomina c


​ lase.

Recopilemos: una ​clase​ es un modelo que define a una serie de ​objetos​ similares que,
simplificando, se puede decir que son cosas. De esta forma, podemos tener la clase
soldado, que será un modelo para definir a una serie de soldados que tendrán una raza, una
fuerza, podrán correr... También podríamos tener la clase piedra que tiene un tamaño y
puede romper el dedo meñique de los soldados cuando van descalzos.

Vamos a trabajar con el ejemplo de los soldados ya que es habitual en la programación de


videojuegos. Haremos un script que permita crear diferentes soldados que podrían ser
usados en un hipotético juego.

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Creando una clase


En Python, para crear una clase no hay más que indicarlo de la siguiente forma:

class​ ​Soldado:

Si te fijas, al definir la clase, he usado una palabra con la primera letra en mayúscula. Si bien
no es obligatorio, en programación se suelen llamar a las clases con la primera letra en
mayúscula para diferenciarlas de variables, listas o diccionarios.

Con la instrucción anterior estás creando un modelo o esquema de cómo va a ser cualquier
objeto que sea de la clase ​Soldado​. Luego podrás crear tantos objetos ​Soldado​ como
quieras, pero al declarar una clase no creas ningún ​Soldado​, sólo especificas cómo son esos
objetos.

Para llamar a una clase sólo hay que almacenarla en una variable y añadir tras el nombre
unos paréntesis:

#Creo mi primer soldado e indico que es de la clase Soldado


soldado1 ​=​ ​Soldado​()

Es normal, al principio, tener dificultades para entender la diferencia entre una función y una
clase. Una función es un trozo de código que se aloja bajo un nombre para poder ser usado
en cualquier momento. Al llamar a una función, el programa reproduce su código y cuando
termina deja de estar, aunque nos puede entregar valores que sí permanezcan. En cambio,
una clase, al ser llamada, crea un objeto que puede ser almacenado y permanecerá listo
para ser usado en cualquier momento.

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Creando el constructor
Al crear nuestra clase S
​ oldado​ la hemos dejado un poco huérfana de p ​ ropiedades y
métodos​. Veamos cómo podemos definir ese esquema o modelo de S ​ oldado​. Al crear la
clase lo primero que debemos crear es lo que se denomina c ​ onstructor​, que contendrá todo
aquello que deba contener el objeto al ser creado. El constructor se ejecutará
automáticamente al crear un objeto de la clase en la que se encuentra.

Imagina que te toca construir ​Soldados ​y tienes que crearlos en su forma más básica para
ser entrenados y convertidos en verdaderas armas de guerra. En el constructor
introduciremos todos esos atributos que deba tener cada soldado (raza, nombre, vida…).

El constructor hay que definirlo de la misma forma que definíamos las funciones hace unos
capítulos. Para indicar que estamos definiendo el constructor debemos usar _​ _init__​ (con
doble barra baja antes y después de ​init​):

class​ ​Soldado:
​#Definimos el constructor, es decir, la función __init__
​def​ __init__​():

Si recuerdas, en las funciones podíamos pasar parámetros. En el caso de las f​ unciones que
van dentro de una clase​ (y el constructor es una de ellas) también podemos enviar
parámetros, aunque no es obligatorio hacerlo. Eso sí, hay un parámetro que siempre
debemos introducir: ​self​ o, en castellano, yo.

Como hemos dicho antes, el constructor se ejecutará nada más crear un objeto de la clase
que lo contiene, no hace falta llamarlo para que se ejecute, como pasaba con las funciones.

Ahora que ya sabemos lo que es un constructor, vamos a ver cómo lo creamos de forma
que contenga lo necesario para nuestros soldados. Al constructor que creará nuestros
soldados le vamos a pasar dos parámetros: raza y nombre.

class​ ​Soldado:
​#Situamos los parámetros que queremos y el obligado self al principio
​def​ __init__​(​self​,​ nombre​,​ raza​):

Si no lo tienes claro piensa que el objeto, al ser creado, necesita para darle sentido a su
existencia ciertos parámetros básicos. Eso no quiere decir que no se pueda crear un objeto
sin pasar ningún parámetro. Yo podría crear una clase ​Soldado​ en la que, al ser
materializada como objeto (es decir, llamada) todo soldado tuviese la misma vida, nombre y
raza, pero no tiene mucho sentido hacer un ejército de clones y ponerles a todos el mismo

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

nombre. El general iba a tener ciertos problemas en el campamento cuando llamase al


centro de mando a Légolas y viniesen 50.000 Légolas.

Una vez tenemos los parámetros que vamos a pasar a la clase para crear un objeto toca
programar qué hacemos con esos parámetros. En nuestro programa el parámetro n ​ ombre
llegará desde una variable que contenga un nombre para el soldado. Lo mismo ocurrirá con
el parámetro raza, aunque ambos podrían ponerse como strings directamente al crear el
objeto ​Soldado​.

Observa el siguiente código y trata de entenderlo con el párrafo que lo explica tras el mismo:

class​ ​Soldado:
​#Situamos los parámetros que queremos y el obligado self al principio
​def​ __init__​(​self​,​ nombre​,​ raza​):
​self​.​nombre ​=​ nombre

Empecemos con el parámetro n ​ ombre​. Para usar un parámetro y aplicárselo al objeto


debemos usar, de nuevo, s ​ elf​. Vamos a indicar al objeto que, al ser creado, el parámetro que
le llega llamado n
​ ombre​ lo tiene que almacenar en una variable propia llamada n ​ ombre​.

A mí las primeras veces que me enfrenté a este tipo de estructura casi me explota la
cabeza. Con el tiempo la normalizas y te parece de lo más razonable, pero es cierto que
conviene pararse a explicar qué está pasando. Vamos a ver un esquema:

#Creamos un Elfo llamado Eldelbar


nombre ​=​ ​"Eldelbar"
raza ​=​ ​"Elfo"
primer_soldado ​=​ ​Soldado​(​nombre​,​ raza)

Al llamar a S
​ oldado​ primero se ejecuta la función _​ _init__( )​:

def​ __init__​(​self​,​ nombre​,​raza)


​self​.​nombre ​=​ nombre

La cual está recibiendo los siguientes parámetros del programa:

def​ __init__​(​self​,​ ​"Eldelbar"​,​"Elfo")


​self​.​nombre ​=​ ​"Eldelbar"

En la construcción de la clase decimos que al crear un objeto van a llegar dos parámetros,
uno que llamamos n ​ ombre​ y otro que llamamos r​ aza​. Al crear un objeto, n
​ ombre​ tendrá un

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

valor (en nuestro ejemplo ​“Eldelbar”​) que vamos a guardar en la variable n


​ ombre​ p
​ ropia del
objeto​ (que no tiene nada que ver con la variable n
​ ombre​ en la que almacenamos al principio
el nombre ​Eldelbar​.

Bueno, sigamos con nuestro constructor. Una vez tenemos el nombre para nuestro recién
creado ​primer_soldado​ vamos a incorporar la raza también como variable interna del objeto:

class Soldado:
def __init__(self, nombre, raza):
[Link] = nombre
​self​.​raza ​=​ raza

Como verás, el mecanismo es el mismo exactamente que con el nombre. Ya tenemos dos
variables propias del objeto​. Ahora vamos a ver cómo podemos acceder a ellas. Para
acceder a cualquiera de las propiedades de una clase, tenemos que hacerlo con el nombre
con el que se creó el objeto con el siguiente comando:

nombre_objeto​.​nombre

Vamos a ver cómo podríamos crear un soldado llamado Eldelbar e imprimir su nombre y su
raza tras crearlo. En esta ocasión no vamos a pasar los parámetros como variables sino
directamente escribiremos los string que correspondan al nombre y raza al usar la clase
Soldado​. Guarda el siguiente código en un script y ejecútalo desde Terminal o IDLE:

class Soldado:
def __init__(self, nombre, raza):
[Link] = nombre
[Link] = raza
#Creamos el primer objeto soldado
primer_soldado ​=​ ​Soldado​(​"Eldelbar"​,​"Elfo")
#Imprimimos el nombre y raza de nuestro soldado
print​(​primer_soldado​.​nombre)
print​(​primer_soldado​.​raza)

Si todo ha ido correcto deberías haber recibido lo solicitado:

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Ya tenemos unas nociones básicas de clases, ahora bien, el constructor sigue un poco
huérfano. Vamos a incorporar, además de un nombre y una raza, una vida y una velocidad de
movimientos, así como un coste de entrenamiento para incorporarlo a nuestro ejército.

El problema es que un elfo, un humano o un enano no se mueven igual ni tienen la misma


vida (entiéndase vida como capacidad para sobrevivir en una refriega). Intenta entender el
siguiente código antes de continuar:

class Soldado:
def __init__(self,nombre,raza):
[Link] = nombre
[Link] = raza
​if​ raza ​==​ ​"Elfo":
​self​.​vida ​=​ ​80
​self​.​velocidad ​=​ ​10
​self​.​coste ​=​ ​200
​elif​ raza ​==​ ​"Humano":
​self​.​vida ​=​ ​100
​self​.​velocidad ​=​ 7
​self​.​coste ​=​ ​100
​elif​ raza ​==​ ​"Enano":
​self​.​vida ​=​ ​120
​self​.​velocidad ​=​ 3
​self​.​coste ​=​ ​180

Como verás, al crear el constructor hemos pasado dos parámetros que harán al objeto
único, o al menos tendrá el nombre y raza que queramos, podrían ser iguales varios objetos
si como usuarios le damos la misma raza y nombre. Así mismo, tendrá una serie de
propiedades que serán iguales para todos los objetos que tengan una misma raza. Los elfos
tendrán una vida, una velocidad y un coste diferente a los humanos, y los enanos diferente a
elfos y humanos.

Esto pinta bastante bien. Seguro que has jugado a algún juego de estrategia de los antiguos,
en los cuales tenías tres o cuatro tipos de tropas y venga a crear orcos, elfos, o cualquier
fantástica raza. Fíjate que con esta pequeña introducción ya tendríamos para crear
soldados e ir utílizándolos con sus valores internos.

Utilicemos el código anterior para crear un objeto ​Soldado​ con raza E


​ lfo​ e imprimamos,
además de su nombre y raza, su vida, velocidad y coste. Guarda el siguiente código como
script y ejecútalo antes de seguir:

class Soldado:
def __init__(self,nombre,raza):

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

[Link] = nombre
[Link] = raza
if raza == "Elfo":
[Link] = 80
[Link] = 10
[Link] = 200
elif raza == "Humano":
[Link] = 100
[Link] = 7
[Link] = 100
elif raza == "Enano":
[Link] = 120
[Link] = 3
[Link] = 180
#Creamos el primer objeto soldado
primer_soldado = Soldado("Eldelbar","Elfo")
#Imprimimos el nombre y raza de nuestro soldado
print("Nombre:")
print(primer_soldado.nombre)
print("Raza:")
print(primer_soldado.raza)
print​(​"Vida:")
print​(​primer_soldado​.​vida)
print​(​"Velocidad:")
print​(​primer_soldado​.​velocidad)
print​(​"Coste de entrenamiento:")
print​(​primer_soldado​.​coste)
#Veamos de qué tipo es la variable primer_soldado
print​(​type​(​primer_soldado​))

Deberías haber obtenido lo siguiente:

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Si te fijas, al final del todo he impreso el tipo de la variable m


​ i_primer_soldado​, y Python nos
indica que es una variable objeto de la clase ​Soldado​. Es decir, para guardar los objetos que
creamos también usamos variables (al fin y al cabo en algún sitio se tendrá que almacenar
el objeto creado).

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Creando métodos
Ya tenemos claro cómo se puede usar el constructor, ahora vamos a ver cómo podemos
crear m
​ étodos ​para la clase. Por ejemplo, el soldado puede tener un arma, así que vamos a
crear otra función con la misma estructura inicial que _​ _init__​, pero ahora ya podemos darle
el nombre que nos parezca correcto:

class Soldado:
def __init__(self,nombre,raza):
#Todo el contenido ya creado para el constructor
​def​ arma​(​self​,​ arma​):
​self​.​arma ​=​ arma

Es importante incluir, en el constructor, la variable a


​ rma​ como variable propia del objeto,
aunque inicialmente no le demos valor:

class Soldado:
def __init__(self,nombre,raza):
[Link] = nombre
[Link] = raza
​"""Incluyo el arma como variable propia del objeto y valor
inicial vacío"""
​self​.​arma ​=​ ​""
if raza == "Elfo":
[Link] = 80
[Link] = 10
[Link] = 200
elif raza == "Humano":
[Link] = 100
[Link] = 7
[Link] = 100
elif raza == "Enano":
[Link] = 120
[Link] = 3
[Link] = 180

Ahora, al llamar a nuestro objeto del tipo ​Soldado​ podríamos, posteriormente, darle un arma.
Para ello sólo tendríamos que llamar a la función a ​ rma​ indicando que pertenece al objeto
Soldado​. Observa el siguiente código:

mi_primer_soldado = Soldado("Eldelbar","Elfo")

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

mi_primer_soldado​.​arma​(​"Arco")

He creado un objeto S ​ oldado​ llamado ​mi_primer_soldado​ y posteriormente he llamado a la


función a​ rma​ propia de la clase ​Soldado​ indicando por parámetros que el arma será un
“Arco”​.

Ahora podría crear todos los soldados que me diese la gana. Incorporaré la función a
​ rma​ a
la clase ​Soldado​ y crearé unos cuantos soldados:

class Soldado:
def __init__(self,nombre,raza):
[Link] = nombre
[Link] = raza
if raza == "Elfo":
[Link] = 80
[Link] = 10
[Link] = 200
elif raza == "Humano":
[Link] = 100
[Link] = 7
[Link] = 100
elif raza == "Enano":
[Link] = 120
[Link] = 3
[Link] = 180
def arma(self, arma):
[Link] = arma
primer_soldado = Soldado("Eldelbar","Elfo")
mi_primer_soldado.arma("Arco")
#Creamos más soldados
segundo_soldado ​=​ ​Soldado​(​"Bran"​,​"Humano")
segundo_soldado​.​arma​(​"Espada")
tercer_soldado ​=​ ​Soldado​(​"Glóin"​,​"Enano")
segundo_soldado​.​arma​(​"Hacha")

Al ver el ejemplo anterior observarás que crear soldados no tiene misterio, no es más que ir
creando variables y asignarles como valor la clase ​Soldado​ pasando por parámetros lo que
necesita esa clase para materializarse. También podemos (o no) asignarle a cada soldado
su arma con la función creada para la clase S​ oldado​ llamada ​arma​.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

El mundo de la programación orientada a objetos en Python es muy extenso. Podríamos ver


cómo podemos utilizar una clase para construir otro tipo de clase que tiene las mismas
propiedades de la primera y algunas más (a esto se le denomina h​ eredar de una clase​).

Así mismo, podríamos ver más métodos y cómo una clase puede tener dentro otra clase
(por ejemplo la clase ​Soldado​ podría incluir dentro la clase A
​ rmadura​). Pero realmente sería
desviar la atención de lo básico y es preferible asentar un poco más cómo usar una clase.

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Utilizando clases
Ya hemos visto cómo crear soldados, podríamos tener un enorme ejército, el problema es
que deberíamos programar algo del estilo:

mi_primer_soldado ​=​ ​Soldado​(...)


mi_segundo_soldado ​=​ ​Soldado​(...)
mi_tercer_soldado ​=​ ​Soldado​(...)
mi_cuarto_soldado ​=​ ​Soldado​(...)
.
.
.
mi_quincuagesimotercer_soldado ​=​ ​Soldado​(...)
.
.
.
mi_yoquesecuantosmillones_soldado ​=​ ​Soldado​(...)

El código es árduo cuando queremos crear muchos objetos, por lo que tendríamos que
buscar una forma de automatizar la creación de soldados. Podríamos usar un bucle, pero
tenemos un problema: el objeto se crea almacenándolo en una variable y si hacemos algo
así...

i ​=​ 1
while​ i​<=​10000:
soldado ​=​ ​Soldado​(...)
i ​=​ i​+1

… crearíamos 1 solo soldado, y no 10.000, ya que al crear un nuevo objeto y almacenarlo en


la variable ​soldado​ pisaríamos (es decir, reemplazaríamos) el anterior objeto ​Soldado​.

Es normal que surja este problema a la hora de programar si utilizamos clases, siempre hay
un momento en que quieres crear muchos objetos de un mismo tipo y nos encontramos con
que no es fácil automatizarlo, por ello hay que acudir a un ya conocido tipo de variable: l​ as
listas​.

Las listas pueden contener cualquier tipo de variables, incluidas otras listas y, por suerte,
objetos.​ De esta forma, yo puedo ir creando objetos y almacenándolos en listas. Además, en
una lista no hace falta definir cuantos objetos introduciremos, ya que las listas son
mutables​ y podemos ir cambiando su contenido.

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Vamos a utilizar nuestro script generador de soldados ampliándolo para que el usuario
pueda introducir tantos soldados como quiera. Recuerda que al crear un soldado hay que
darle un nombre y una raza. Veamos la estructura (o algoritmo) inicial que necesita nuestro
programa para generar las clases:

● Creamos una lista llamada ​ejercito

● Preguntamos al usuario cuántos soldados quiere crear

● Utilizamos un bucle que se repita tantas veces como soldados haya que crear

● En cada repetición del bucle preguntamos al usuario como quiere llamar al nuevo
soldado y de qué raza será

● Creamos un nuevo objeto con el nombre y raza indicados y lo introducimos al final


de nuestra lista

● Para demostrar que funciona imprimimos el nombre de cada uno de los objetos de la
lista

Intenta, antes de seguir, generar ese script que cree tantos soldados como quiera el usuario
e imprima los nombres dados a los soldados. Utiliza la clase creada anteriormente para este
programa. Una vez lo consigas (o no) podrás ver cómo lo he hecho yo, pero no sigas
leyendo sin intentarlo.

Así lo he hecho yo:

class Soldado:
def __init__(self,nombre,raza):
[Link] = nombre
[Link] = raza
[Link] = ""
if raza == "Elfo":
[Link] = 80
[Link] = 10
[Link] = 200
elif raza == "Humano":
[Link] = 100
[Link] = 7
[Link] = 100
elif raza == "Enano":
[Link] = 120
[Link] = 3
[Link] = 180
def arma(self, arma):

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

[Link] = arma
#Creamos lista ejercito para almacenar los objetos soldado
ejercito ​=​ ​[]
cantidad_soldados ​=​ ​int​(​input​(​"¿Cuántos soldados quieres crear?: "​))
#Recorremos la cantidad de soldados declarada
for​ i ​in​ range​(​cantidad_soldados​):
​#Preguntamos nombre y raza
nombre ​=​ input​(​"Nombre del nuevo soldado: ")
raza ​=​ input​(​"Raza del nuevo soldado (Elfo/Humano/Enano): ")
​#Creamos el nuevo soldado
soldado ​=​ ​Soldado​(​nombre​,​raza)
​#Guardamos el objeto soldado en la lista ejército
ejercito​.​append​(​soldado)
for​ i ​in​ range​(​len​(​ejercito​)):
​#Llamamos a cada objeto por su posición en la lista ejército
​print​(​ejercito​[​i​].​nombre)

Si te fijas, he llamado al ​nombre​ de cada objeto imprimiéndolo desde su ubicación en la


lista. La sentencia ​ejercito[ i ].nombre​ sirve para ubicar cada objeto ​Soldado​ dentro de la lista
ejercito​.

De la misma forma que recorremos la lista para imprimir el nombre de cada objeto,
podríamos recorrerla para utilizarlos con otros fines, veamos algunos ejemplos:

● Utilizar cada objeto de la lista en un ataque a un objeto enemigo.

● Utilizar un objeto aleatorio (random) de la lista para que se enfrente a un enemigo.

● Enfrentar a dos objetos aleatorios de nuestra lista.

● Ver el coste de entrenamiento de todos los objetos introducidos en la lista.

● Ver la vida total de nuestro ejército.

● Encontrar el objeto con mayor o menor vida de la lista si esta va cambiando durante
un juego.

Como veréis, podríamos hacer múltiples cosas en un hipotético juego que introdujese
nuestro script como parte de su funcionamiento.

Pero, para nuestros conocimientos actuales, es suficiente con este documento para
entender de qué va esto de programar pensando en objetos y crear clases para poder
generar objetos basados en una estructura común.

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Instrucciones de código usadas

#Crear una clase


​class​ ​Clase:
#Utilizar una clase
objeto ​=​ ​Clase​()
#Definir el constructor de una clase
​def​ __init__​(​self​,​parametros​):
#Usar una variable propia de un objeto
objeto​.​variable
#Definir un método de una clase
​def​ nombre​(​parametros​):

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases

Reto
Utilizando el programa ya creado que genera soldados a petición del usuario, crea una
variable que almacene un valor de m
​ onedas​ o ​dinero​ disponible y ve restando de dicha
cantidad el coste de entrenamiento de cada soldado. El script debe informar si nos hemos
quedado sin monedas para entrenar más soldados.

18
TEMA 8
Python en un entorno con salida
gráfica (Processing)

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

ÍNDICE

Primer programa en Processing 2

Creando animaciones 6

Ámbito de una variable 10

Cambios en el movimiento 13

Instrucciones de código usadas 16

Reto 1 17

Reto 2 17

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Primer programa en Processing


Hasta ahora hemos estado trabajando con Python en scripts que ejecutaban un código con
salida textual, es decir, sin gráficos. Los dos últimos capítulos de este curso los vamos a
dedicar a programar con Python y salida gráfica.

Para ello vamos a usar un programa denominado Processing, que ya instalaste en la unidad
1. No es un programa que se use en el entorno profesional para crear scripts de Python con
salida gráfica, pero es muy útil para aprender y hacer nuestras primeras animaciones y
juegos.

Para usar P
​ rocessing, t​ enemos una gran ayuda con su página web en la que hay una
sección referencia con todas las instrucciones de código soportadas y ejemplos de cada
una de ellas:

[Link]

En cualquier momento que no recuerdes cómo usar una función o quieras avanzar más allá
de lo planteado puedes acudir al enlace anterior y ver cómo se podría hacer.

Una vez que ya habéis instalado Processing y estáis en el editor de código en Python, vamos
a ver cómo creamos nuestro primer programa, que va a ser un ​cuadrado centrado en el área
de visualización.

Para ello vamos a ver primero cómo se ejecuta un programa de Python para Processing, ya
que difiere un poquito con lo que hemos visto hasta ahora.

En Processing vamos a ​programar en bucle​ y no secuencialmente. Esto quiere decir que


nuestro programa, sin tener que indicarle nada, se va a repetir una y otra vez. Hasta ahora
nuestros programas se ejecutaban secuencialmente, aunque a veces teníamos bucles ​while
o f​ or​ que repetían una serie de veces una instrucción.

Ahora vamos a tener inicialmente siempre dos funciones ya creadas (recuerda que para
crear funciones usábamos la instrucción ​def​). La función s
​ etup​ y la función d
​ raw​.

En la función s
​ etup​ vamos a poner todo aquello que define nuestro programa y que
queremos que se haga una sola vez al principio del mismo, como por ejemplo el tamaño de
la pantalla que queremos para nuestro script gráfico o el color de fondo que va a tener esa
pantalla.

En el d
​ raw​ vamos a poner esas instrucciones que queremos que se repitan una y otra vez,
como por ejemplo dibujar una pelota y moverla en una dirección poco a poco.

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Todo esto va a quedar mucho más claro a lo largo del tema, pero vamos a ver cómo sería
esa estructura ya escrita en Processing:

Una vez escrito el código prueba con el siguiente programa y ejecútalo en Processing. Para
ejecutarlo tendrás que darle al botón de play que hay encima del nombre del archivo.

def​ setup​():
size​(​600​,​400)
def​ draw​():
rect​(​300​,​200​,​20​,​20)

Si lo ejecutas deberías conseguir lo siguiente:

Como podrás ver, al ejecutar un código en Processing se muestra, si el código es correcto y


así lo indica, una ventana emergente del tamaño que hemos indicado, que es el área de

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

visualización. Esta pantalla en ocasiones puede quedar tras el editor de código, si no la ves
prueba a moverlo para ver si realmente está escondida.

El código es sencillo, hemos indicado lo siguiente:

size​(​600​,​400)

Creamos una ventana de tamaño 600 píxels de ancho por 400 píxels de alto. El punto de
partida (es decir, el punto 0, 0) es la esquina superior izquierda. Esto quiere decir que las
dimensiones en x crecen hacia la derecha y en y hacia abajo.

rect​(​300​,​200​,​20​,​20)

Dibujamos un rectángulo en la posición 300 a lo ancho (es decir, en el eje x) y 200 a lo alto
(es decir, en el eje y). El rectángulo tendrá 20 píxels de ancho y 20 píxels de alto.

En el caso del rectángulo, las dimensiones se cuentan tanto para la posición como para el
tamaño desde la esquina superior izquierda del mismo.

Cambia las medidas de la pantalla y del rectángulo y prueba con ello a ver cómo cambia la
imagen.

Una cosa algo complicada para mucha gente es interiorizar que en Processing las medidas
verticales, es decir, el eje y, crece hacia abajo y decrece hacia arriba. En nuestro ejemplo y =
0 es la parte de arriba, en cambio y = 400 es la parte de abajo de la pantalla.

Prueba el siguiente código para ver algunos cambios:

def setup():
size(600,400)
background​(​255)
def draw():
fill​(​0​,​0​,​255)
​rect(300,200,20,20)

Como habrás podido comprobar, ahora el fondo de la ventana es blanco y el rectángulo es


azul. También, como podrás ver, estamos llamando todo el rato a funciones, algunas sin
parámetros y otras con parámetros:

background​(​255)

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Esta función cambia el color del fondo de la ventana. Está utilizada en escala de grises,
siendo 0 negro y 255 blanco.

fill​(​0​,​0​,​255)

Esta función cambia el relleno de lo que tenga debajo. Está utilizada con colores R ​ , G, B​, es
decir, red, green, blue (o rojo, verde y azúl en castellano). Cada uno de ellos toma valores
desde 0 hasta 255, siendo 0 la ausencia de ese color y 255 el máximo posible. Si jugamos
con diferentes combinaciones veremos diferentes colores, prueba a cambiar los tres
números de dentro del paréntesis.

Tres ceros indican el negro y tres 255 indican el blanco.

Para cambiar las líneas del borde de una figura hay que usar el comando ​stroke​:

stroke​(​0​,​0​,​255)

Processing incluye un asistente para generar colores R,G,B, sólo tienes que ir al menú
Herramientas y seleccionar Selector de colores…

En la misma podemos seleccionar colores y en el lateral derecho veremos la combinación


R,G,B con la que se corresponde el color seleccionado.

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Creando animaciones
Ahora bien, la diferencia entre lo que hemos hecho hasta ahora y un programa de diseño
gráfico (o un simple p​ aint​) no es muy grande. Ya que podemos usar código lo suyo sería
generar un programa que no se pudiese reproducir con un programa de diseño gráfico.

Vamos a ver cómo con código podemos hacer cosas ya algo más interesantes. Empecemos
haciendo que, en la zona del bucle (​draw​) el cuadrado vaya cambiando de posición en cada
iteración. Para ello vamos a utilizar una opción de Processing directa que genera números
aleatorios: random.

Recuerda que en Python hasta ahora para usar un ​random​ teníamos que importar una
biblioteca. En Processing viene incorporada ya que es habitual generar números aleatorios.
Vamos, simplemente, a poner en la posición del ​rect​ que aparezca aleatoriamente en
posiciones dentro del valor de nuestro área de visualización.

Para elegir un número aleatorio tengo dos opciones:

random​(​300)
random​(​100​,​300)

La primera opción genera un número aleatorio desde 0 hasta 300. El cero no hace falta
indicarlo.

La segunda opción genera un aleatorio entre 100 y 200.

Prueba el siguiente código:

def setup():
size(600,400)
background(255)
def draw():
fill(0,0,255)
rect​(​random​(​600​),​random​(​400​),​20​,​20)

Interesante, ¿verdad?:

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Verás que los rectángulos azules se generan bastante rápido. Vamos a hacer un simple
cambio para que veas una diferencia muy importante. Prueba el siguiente código:

def setup():
size(600,400)
def draw():
background​(​255)
​ fill(0,0,255)
rect(random(600),random(400),20,20)

Ahora sólo hay un cuadrado que cambia de posición a toda velocidad. Este pequeño cambio
produce un efecto muy importante. Cuando usamos la función b ​ ackground​ estamos
pidiendo a Processing que limpie la pantalla y ponga un color. Si lo ponemos en el s
​ etup
pondrá ese color sólo una vez, en el momento en que llegue a esa instrucción.

En cambio, al ponerlo al principio del d


​ raw​, el fondo se pondrá del color indicado cada vez
que volvamos a iniciar una iteración del bucle, por ello el rectángulo anteriormente dibujado
desaparece y sólo tenemos uno.

Es importante tener esto claro, vamos a probar algún cambio más, para que entiendas la
importancia de dónde sitúo yo la instrucción de código. Intenta descubrir la diferencia entre
estos dos códigos.

Código 1:

def​ setup​():
background​(​255)
size​(​600​,​400)
def​ draw​():
fill​(​0​,​0​,​255)
rect​(​random​(​600​),​random​(​400​),​20​,​20)

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Código 2:

def​ setup​():
background​(​255)
size​(​600​,​400)
def​ draw​():
rect​(​random​(​600​),​random​(​400​),​20​,​20)
fill​(​0​,​0​,​255)

¿Has visto la diferencia? Hay que prestar atención. En el primer código generamos
cuadrados azules que van llenando la pantalla y en el segundo también… pero hay uno que
es blanco.

Y hay uno que es blanco porque el relleno (​fill​) indica que quieres rellenar una figura de un
color, pero rellena la figura que tiene a continuación. Por ello, el primer rectángulo que
creamos se crea sin un relleno, por lo que sale blanco (color por defecto). A continuación el
programa encuentra un ​fill​ y posteriormente vuelve a empezar con un ​rect​, que ya sí es azul…

Por último antes de continuar, podemos utilizar random allá donde queramos, incluso en los
colores de rellenos. Prueba el siguiente código:

def setup():
background(255)
size(600,400)
def draw():
fill​(​random​(​255​),​random​(​255​),​random​(​255​))
​rect(random(600),random(400),random(10,60),random(10,60))

Una auténtica obra de arte, ¿verdad?

Ahora que ya has trabajado con un rectángulo vamos a aprender a dibujar una
circunferencia:

def setup():
background(255)
size(600,400)
def draw():
fill​(​0​,​200​,​200)
ellipse​(​300​,​200​,​40​,​40)

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

En el caso de la e
​ llipse​ los dos primeros parámetros indican dónde sitúa el programa el
centro de la misma y los dos últimos cuánto miden sus diámetros de ancho y de alto. Si
ponemos dos valores iguales tendremos un círculo y si ponemos dos diferentes tendremos
una elipse.

Ahora que tenemos una circunferencia vamos a intentar que se mueva por la pantalla.
Empecemos haciendo algo sencillo: el círculo debe moverse desde la parte izquierda hacia
la derecha. Para ello vamos a dar un primer paso, observa y prueba el siguiente código:

def setup():
background(255)
size(600,400)
def draw():
posicionX ​=​ ​20
posicionY ​=​ ​200
fill(0,200,200)
ellipse​(​posicionX​,​posicionY​,​40​,​40)

Perfecto, ahora tenemos la posición de la elipse guardada en variables, una para X y otra
para Y. El siguiente paso sería ir cambiando el valor de la variable p
​ osicionX​ para que el
círculo fuese cambiando de posición. Observa y prueba el siguiente código:

def setup():
background(255)
size(600,400)
def draw():
posicionX = 20
posicionY = 200
fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
posicionX ​=​ posicionX ​+​ 1

En el bucle (​draw​) estamos creando una variable con un valor y estamos usando esa
variable para la posición del círculo. Posteriormente estamos sumando 1 a la variable
posicionX​ con la intención de mover el círculo. El problema es que ​draw​ es un bucle y una
vez que termina vuelve a empezar y vuelve a declarar la variable ​posicionX​ con el valor que
tenía inicialmente, por lo que nunca moveremos nuestra e ​ llipse​.

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Ámbito de una variable


Nos viene perfecto el ejemplo anterior para ver cómo podemos utilizar variables en
diferentes ámbitos. Necesitamos declarar la variable ​posiciónX f​ uera del ámbito ​draw​ y
cambiar el valor dentro del ámbito d
​ raw​:

posicionX ​=​ ​20


posicionY ​=​ ​200
def setup():
background(255)
size(600,400)
def draw():
fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
posicionX = posicionX + 1

Ahora ya tenemos las variables fuera del ámbito ​draw​, vamos a ver qué ocurre, prueba el
código anterior:

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Resulta que tenemos un error, tenemos las variables creadas antes de definir nuestros dos
ámbitos (​setup y​ ​draw​) y luego queremos usarlas desde el ámbito ​draw​ y Processing nos
dice: l​ ocal variable “posicionX” referenced before assignment.

Dicho en castellano: has intentado usar la variable p


​ osicionX​ antes de su asignación (es
decir, de su creación).

Vamos a dejar claro cómo podemos usar las variables en Python:

● Las variables pueden ser locales y globales. Si no se indica nada las variables son
locales.

● Una variable local puede ser leída desde cualquier ámbito y se puede utilizar su valor,
pero no puede cambiarse su valor.

● Una variable global puede ser usada y cambiada desde cualquier ámbito, pero hace
falta indicar que queremos usar la variable global.

En nuestro código el problema es que no hemos indicado que queremos, en el ​draw​, utilizar
dos variables globales, por lo que Python, al usar la expresión p
​ osicionX = posicionX + 1
interpreta que dicha variable es local y trata de buscar su valor en ese ámbito, cosa
imposible porque no se trata de una variable local.

Para solucionarlo basta con indicar en un ámbito que queremos usar una variable global. En
nuestro caso basta con indicar, antes de utilizarla, que al mencionar la variable p
​ osicionX
nos estamos refiriendo a una variable global (​global posicionX​):

posicionX = 20
posicionY = 200
def setup():
background(255)
size(600,400)
def draw():
​global​ posicionX
​fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
posicionX = posicionX + 1

Prueba el código anterior antes de seguir.

Como habrás podido comprobar, el círculo se mueve, pero deja rastro. ¿Por qué puede ser?
Pista: tiene que ver con b
​ ackground​. ¿Se te ocurre una solución?

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Efectivamente, basta con cambiar dónde situamos el fondo, prueba a cambiar


background(255) ​al ámbito d
​ raw​ a ver si así se soluciona.

Ya está solucionado. Ahora sólo hay un último problema. El movimiento del círculo continúa
aunque llegue al final del área de visualización y no sería mala idea conseguir que el círculo
se dé la vuelta al llegar al final.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Cambios en el movimiento
Para conseguirlo vamos a utilizar también una variable global para la cantidad de píxeles
que movemos la circunferencia (en el ejemplo era 1):

posicionX = 20
posicionY = 200
movimiento ​=​ 1
def setup():
size(600,400)
def draw():
background(255)
global posicionX
​global​ movimiento
​fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
posicionX ​=​ posicionX ​+​ movimiento

Prueba el código anterior y verás que funciona exactamente igual que el primero.

Ahora sólo queda incluir, al final del programa, un condicional que haga que si el círculo va a
salirse del área de visualización en vez de sumar la variable m
​ ovimiento​ se empiece a restar
o bien que ​siga sumándola pero la variable pase a ser negativa.

Para realizar el condicional hay que pensar un poquito en dónde están los bordes del área de
visualización y dónde está situado el círculo (en su centro). Ésto hace que tengamos que
jugar con el radio del círculo para simular el rebote. Lo vas a entender a la hora de ejecutar el
próximo código, intenta entenderlo:

posicionX = 20
posicionY = 200
movimiento = 1
def setup():
background(255)
size(600,400)
def draw():
background(255)
global posicionX
global movimiento
fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
​posicionX = posicionX + movimiento

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

​if​ posicionX ​>​ 6


​ 00:
movimiento = ​ ​ ​-​movimiento

Como habrás visto el círculo rebota más allá del borde. Esto ocurre porque la ​posicionX​ del
círculo está en su centro y le hemos dicho que rebote si su centro está más allá de la
posición 600 en x.

Antes de seguir te lanzo unos retos:

● Intenta que el círculo se mueva más rápido.

● Intenta que el círculo rebote justo en el borde.

● Intenta que el círculo también rebote en el borde izquierdo.

¿Lo has conseguido? Si no es así enseguida podrás ver el código, pero antes un apunte: al
ancho del área de visualización se le llama w
​ idth​ y al alto h
​ eight.

Veamos cómo hacemos todas las cosas anteriormente mencionadas:

posicionX = 20
posicionY = 200
movimiento ​=​ 3
def setup():
background(255)
size(600,400)
def draw():
background(255)
global posicionX
global movimiento
fill(0,200,200)
ellipse(posicionX,posicionY,40,40)
posicionX = posicionX + movimiento
​if​ posicionX ​>​ width​-​20​ ​or​ posicionX ​<​ ​20:
movimiento ​=​ ​-​movimiento

Para que el círculo se mueva más rápido: ​movimiento = 3 o


​ cualquier otro valor.

Para que el círculo rebote justo en el borde hay que restarle el radio en el condicional: w
​ idth -
20

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Para que rebote en ambos bordes hay que incluir un o ​ r​ en el i​ f​ con la condición para que
rebote el círculo en la izquierda (​posicionX < 20​, siendo 20 el resultado de sumar a 0 el radio
del círculo).

Ahora que ya hemos conseguido nuestra primera secuencia en movimiento vamos a ver
cómo podría hacer que este código fuese más funcional utilizando más variables y menos
números en los parámetros:

posicionX = 20
posicionY = 200
movimiento = 3
def setup():
background(255)
size(600,400)
def draw():
background(255)
global posicionX
global movimiento
diametro ​=​ ​40
​fill(0,200,200)
ellipse​(​posicionX​,​posicionY​,​diametro​,​diametro)
​ posicionX = posicionX + movimiento
​if​ posicionX ​>​ width​-​diametro​/​2​ ​or​ posicionX ​<​ diametro​/​2:
​movimiento = -movimiento

Utilizar variables y no magnitudes directamente en las funciones ayuda a parametrizarlas, es


decir, conseguir que puedas cambiar todo el programa únicamente cambiando el valor de
una variable. Con el programa anterior podemos hacer que la elipse sea más grande o más
pequeña o que el tamaño del área de visualización crezca o decrezca sin que la
funcionalidad del mismo se vea afectada.

Llegados a este punto puedes realizar tus actividades.

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Instrucciones de código usadas

#Función inicial setup


​def​ setup​():
#Función inicial bucle
​def​ draw​():
#Tamaño del área de visualización en píxeles
size​(​ancho​,​alto)
#Dibujar un rectángulo
rect​(​posicion_en_x​,​posicion_en_y​,​ancho​,​alto)
#Fondo del área de visualización
background​(​color)
#Relleno de uno o varios elementos
fill​(​color)
#Color del borde de un elemento
stroke​(​color)
#Generar valores aleatorios desde cero hasta un valor
random​(​valor)
#Generar valores aleatorios entre dos valores
random​(​valor1​,​ valor2)
#Dibujar una elipse
ellipse​(​posicion_en_x​,​posicion_en_y​,​diametro_en_x​,​diametro_en_y)
#Ancho del área de visualización
width
#Alto del área de visualización
height

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica

Reto 1
Consigue que el círculo de la actividad anterior se desplace según una dirección no
horizontal (es decir, que cambie su posición en x e y) y que rebote en los cuatro bordes.

Reto 2
Consigue que el círculo sea algo más visual: un muñeco de nieve, por ejemplo. Debes dibujar
con círculos y rectángulos y tener en cuenta que todos deben tener en su posición la misma
variable para que pueda moverse. A dicha variable se le puede sumar algún valor:

ellipse​(​posicionX​,​posicionY​-​30​,​30​,​30)
ellipse​(​posicionX​,​posicionY​,​40​,​40)

17
TEMA 9
Creando un videojuego

Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

ÍNDICE

Nuestro primer programa gráfico interactivo 2

Operaciones booleanas 4

Dibujando una raqueta 7

Controlando la raqueta 11

Movimiento manteniendo la tecla pulsada 13

Movimiento con cada pulsación de la tecla 16

La pelota rebota en la raqueta 20

Puntuación 24

Game over 30

Mejorando el juego 31

Instrucciones de código usadas 32

Reto 33

1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Nuestro primer programa gráfico interactivo


Este tema va a ser el que más se parezca a una guía paso por paso para conseguir un
programa, es decir, unas instrucciones que, si son seguidas, dan un resultado. Se trabajan
muchos conceptos y es necesario hacerlo de esta forma pero, como siempre, tendrás una
serie de preguntas a lo largo del documento y, además, un reto final que hará que tengas
que poner de tu parte.

Al finalizar el capítulo anterior terminamos consiguiendo que una esfera rebotase por las
paredes de una pantalla. A continuación tienes un código que consigue dicho efecto.
Deberías haberlo conseguido con los retos del tema anterior, pero mira el código a
continuación y pruébalo en Processing para asegurarte que funcione:

"""Declaramos listas globales para la posicion y el movimiento posicion


sera una lista de dos elementos, uno para la posicion en x y otro para
la posicion en [Link] sera otra lista de dos elementos, uno para
el movimiento en x y otro para el movimiento en y"""
posicion ​=​ ​[​20​,​ ​200]
movimiento ​=​ ​[​3​,​ ​2]
#definimos funcion setup con tamaño de pantalla
def​ setup​():
size​(​600​,​400)
#definimos funcion draw con fondo amarillo
def​ draw​():
background​(​227​,​220​,​7)
​#declaramos las listas globales que vamos a usar
​global​ posicion
​global​ movimiento
​#variable con tamaño del diametro de la esfera
diametro ​=​ ​30
​#rellenamos la elipse de azul
fill​(​14​,​82​,​175)
​#declaramos la posicion inicial de la elipse y su tamaño
ellipse​(​posicion​[​0​],​posicion​[​1​],​diametro​,​diametro)
​#iniciamos el movimiento en cada iteración para x e y
posicion​[​0​]​ ​=​ posicion​[​0​]​ ​+​ movimiento​[​0]
posicion​[​1​]​ ​=​ posicion​[​1​]​ ​+​ movimiento​[​1]
​#condicional para producir el rebote horizontal
​if​ posicion​[​0​]​ ​>​ width ​-​ diametro​/​2​ ​or​ posicion​[​0​]​ ​<​ diametro​/​2:
movimiento​[​0​]​ ​=​ ​-​movimiento​[​0]
​#condicional para producir el rebote vertical
​if​ posicion​[​1​]​ ​>​ height ​-​ diametro​/​2​ ​or​ posicion​[​1]
​ ​ ​<​ diametro​/​2:
movimiento​[​1​]​ ​=​ ​-​movimiento​[​1​]

2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Voy a hacerte un par de aclaraciones sobre el texto, para que puedas entender ciertas cosas
que igual se te escapan:

Tanto para la posición como para el movimiento (​posicion​ y m​ ovimiento​) he usado dos
listas. Ambas variables deben tener un valor para la coordenada X y otro para la coordenada
Y. En el caso de ​posicion​ esos dos valores indican dónde debe el programa situar la esfera
en cada iteración. En el caso de ​movimiento​ el valor de cada coordenada es cuánto se debe
mover la esfera en cada dirección, en X (horizontal) y en Y (vertical).

Podría haber declarado varias variables para el mismo efecto, algo del estilo:

posicion_en_X ​=​ ​20


posicion_en_Y ​=​ ​200
movimiento_en_X ​=​ 3
movimiento_en_Y ​=​ 2

Pero la realidad es que es bastante más cómodo declarar estas variables como listas:

posicion ​=​ [
​ ​20​,​ ​200]
movimiento = ​ ​ ​[​3​,​ ​2]

Una vez tengo las listas creadas para acceder a sus valores y modificarlos sólo tendré que
tener cuidado al llamarlas indicando a qué índice quiero acceder. Tenemos el índice 0 para
el primer valor y el índice 1 para el segundo, de ahí que para sumar a la posición el
movimiento utilicemos la siguiente expresión:

posicion​[​0​]​ =
​ ​ posicion​[​0​]​ +​ ​ movimiento​[​0]
posicion​[​1​]​ =​ ​ posicion​[​1​]​ +​ ​ movimiento​[​1]

La nueva posición para cada índice será igual a la que tenía previamente sumándole el
movimiento.

3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Operaciones booleanas
Otra cosa que he utilizado y es tremendamente útil es una operación booleana denominada
or.

La operación o ​ r​ se engloba dentro de una serie de operaciones simples que se pueden


introducir en la comprobación de cualquier condicional o bucle. Se denominan operaciones
booleanas por provenir del Álgebra de Boole, nombre recibido en honor al matemático
George Boole.

El álgebra de Boole trabaja con conjuntos, dichos conjuntos para nuestro caso, al tratarse de
un sistema binario, se componen de dos estados → 1 y 0 o True y False.

Para comprender las operaciones booleanas primero vamos a profundizar un poquito más
en las comparaciones que estamos haciendo en los condicionales y bucles. Vamos a llamar
a estas comparaciones e ​ ventos ​(aunque el nombre evento en programación no se usa para
esto, pero nos viene bien usarlo ahora).

El resultado de los eventos siempre va a ser T


​ rue​ o ​False​. Si el evento es correcto, el
resultado es ​True​ y si no es F
​ alse​:

De esta forma, tenemos que entender que cualquier comparación que hagamos resultará en
un valor binario.

Las operaciones booleanas que vamos a usar son muy sencillas. Las usaremos para
combinar varias comprobaciones. Por ejemplo, en nuestro caso, hemos usado una
comprobación doble para saber si la pelota se está saliendo por la parte derecha del área de
visualización o se está saliendo por la izquierda.

Veamos dicho código:

4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

if​ posicion​[​0​]​ ​>​ width ​-​ diametro​/​2​ ​or​ posicion​[​0​]​ ​<​ diametro​/2
​ :
movimiento​[​0​]​ ​=​ ​-​movimiento​[​0]

En este código tenemos dos eventos:

● El primero que la posición del centro de nuestra elipse sea mayor al ancho de
nuestro área de visualización menos el radio de la elipse.

● El segundo que la posición del centro de nuestra elipse sea menor a cero más el
radio de nuestra elipse.

Para los radios usamos la variable diámetro divida entre 2.

En la comprobación doble hemos usado un o ​ r, l​ o cual indica que efectuaremos el código


que contiene el ​if​ si se cumple cualquiera de las dos comprobaciones (de ahí o ​ r​ → sí se
cumple esto o
​ r​ esto otro…).

Las comprobaciones boolenas que vamos a usar con más frecuencia son dos:

#para actuar si se cumplen dos eventos:


if​ evento1 ​and​ evento2:
actuo
#para actuar si se cumple uno de los dos eventos:
if​ evento1 ​or​ evento2:
actuo

Resumiendo:

● Usaré ​and​ cuando quiera que un código se ejecute al cumplirse dos eventos.

● Usaré ​or​ cuando quiera que un código se ejecute cuando se cumpla al menos un
evento de una serie de ellos (también se ejecuta si se cumplen dos o más eventos).

Hay un tercer operador booleano que se puede usar y sirve para cambiar el valor de una
variable booleana o una comprobación. Dicho operador es ​not​ y nos permite convertir en
False​ una variable con valor T
​ rue​.

Veamos un pequeño ejemplo de todo lo anterior:

5
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

El primer ​if​ no se cumple porque no son ​True​ los dos eventos y se ha usado un a​ nd.​ En el
caso del segundo, al usar un ​or​, basta con que uno de los eventos tenga el valor ​True​ y se
cumple. Por último, en el tercero usamos un ​and​ pero invertimos con un ​not​ el valor del
segundo evento, que era ​False​, por lo que se cumple también.

Llegados a este punto podemos seguir con nuestro juego.

6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Dibujando una raqueta


Vamos a crear un juego sencillo en el cual manejemos una raqueta (un rectángulo que hará
las veces de raqueta) con algunas teclas del teclado y tendremos que evitar que la pelota
choque con la pared en la que se encuentre la raqueta. Es decir, un pong de toda la vida.

Lo primero será diseñar un rectángulo de las proporciones adecuadas. Para crear un


rectángulo, como vimos en el tema anterior, sólo debemos saber su posición tanto en X
como en Y y su tamaño tanto en X como en Y:

rect ​(​posicionX​,​ posicionY​,​ tama​ñ​oX​,​ tama​ñ​oY)

Lo ideal sería referenciar tanto el tamaño como la posición a unas variables para poder
modificar el aspecto del rectángulo con un simple cambio. En un pong, la raqueta sólo se
mueve verticalmente, por lo que el valor de su posición en X no hace falta referenciarlo a
nada, si bien el de Y va a tener que ir cambiando y para ello debe estar referido al contenido
de una variable. Intenta comprender el siguiente código antes de seguir:

dimensionX ​=​ ​15


dimensionY ​=​ dimensionX ​*​ 6
posicionY ​=​ height​/​2​ ​-​ dimensionY​/2
rect ​(​20​,​ posicionY​,​ dimensionX​,​ dimensionY)

7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Si introduces el código anterior en el código de la pelotita rebotando por las paredes, dentro
del ​draw​, verás el resultado.

La p
​ osicionY​ está rectificada para que sea justo la mitad de la altura del área de
visualización (​height​). Para ello hay que darle el valor de h
​ eight/2​ y a ese valor restarle la
mitad de la propia altura del rectángulo, es decir, d ​ imensionY/2​.

Prueba el código anterior metiéndolo justo debajo de la ​ellipse​ en el programa que hacía
rebotar a la pelotita por las paredes.

El resultado debería ser el siguiente:

Obviamente, si la pelota toca la raqueta no se ve inmutada por ello y sigue su camino, pero
ya tenemos una raqueta. Los colores pueden no ser tus preferidos, pero están elegidos para
ir acorde con los colores del logo de Python (con el acierto que quieras otorgarme).

Ahora que ya tenemos la raqueta, vamos a pensar en cómo podríamos moverla con las
flechas del teclado.

Para empezar tendremos que pensar en si las variables de posición de la raqueta están bien
puestas en la función ​draw. E
​ sa función se ejecuta muchas veces por segundo y cada vez
que se ejecute tomará todo el código que contenga y lo ejecutará, por lo que si la variable
posicionY​ de la raqueta está declarada con un valor en el d
​ raw​ no podremos mover la
raqueta.

El problema es que yo no puedo poner p ​ osicionY​ como global porque está referida a
variables que se declaran en el ​draw.​ Hagamos una cosa, crearemos una variable global con
valor 0 y meteremos la declaración de la variable ​posicionY e​ n un condicional, dicho

8
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

condicional se cumplirá sólo la primera vez porque dentro del mismo a la variable global le
cambiaremos el valor a 1. Observa el siguiente esquema de lo comentado:

variable ​=​ 0
def​ setup​():
size​(​600​,​400)
def​ draw​():
​global​ variable
​global​ posicionY
​if​ variable ​==​ ​0:
posicionY ​=​ height​/​2​ ​-​ dimensionY​/2
variable ​=​ ​1

El código sería algo así, de esta forma sólo entraremos en la declaración de la variable
posicionY​ la primera vez que se ejecute el d ​ raw. ​Este truco es muy usado en código para
conseguir que un bucle tenga un evento o instrucción que sólo se ejecute una única vez. La
variable ​posicionY​ debe ser mencionada como global en el draw ya que se le asignará un
valor en el ámbito de un i​ f​ para ser usada fuera del mismo.

Cuando usamos el valor de una variable que sólo toma una serie concreta de estados (la
nuestra toma 2 estados) y la usamos para un condicional estamos realizando una m​ áquina
de estados.

Hay que indicar, también, que la variable ​posicionY​ es llamada en el d


​ raw c
​ omo global, ya
que ha sido declarada en un ámbito y Python no puede usarla si no lo indicamos.

Cambiemos el código del juego introduciendo lo anterior y veamos si funciona, prueba a


cambiarlo sin mirar el código siguiente y luego comprueba si es correcto. Si te atascas
puedes mirarlo a continuación, estás comentados los cambios en esta ocasión para su
mejor comprensión, en las sucesivas veces los comentarios no aparecerán por ahorro de
espacio, si te atascas vuelve a este programa para recordar para qué servía cada cosa:

posicion = [20, 200]


movimiento = [3, 2]
#Declaramos variable para la máquina de estados
primera_vez ​=​ 0
def setup():
size(600,400)
def draw():
background(227,220,7)
global posicion
global movimiento
​#Declaramos las variables globales que vamos a usar

9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

​global​ primera_vez
​global​ posicionY
​diametro = 30
fill(14,82,175)
ellipse(posicion[0],posicion[1],diametro,diametro)
​ dimensionX = 15
dimensionY = dimensionX * 6
​"""Condicional que declara la variable primera_vez en la primera
iteración"""
​if​ primera_vez ​==​ ​0:
posicionY ​=​ height​/​2​ ​-​ dimensionY​/2
primera_vez ​=​ 1
rect ​(​20​,​ posicionY​,​ dimensionX​,​ dimensionY)
​ posicion[0] = posicion[0] + movimiento[0]
posicion[1] = posicion[1] + movimiento[1]
if posicion[0] > width - diametro/2 or posicion[0] < diametro/2:
movimiento[0] = -movimiento[0]
if posicion[1] > height - diametro/2 or posicion[1] < diametro/2:
movimiento[1] = -movimiento[1]

¿Ya lo probaste y entendiste? Podemos seguir entonces.

10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Controlando la raqueta
¡Bueno! Ya tenemos lo necesario para ver cómo podemos controlar la raqueta al presionar
una tecla. Para ello vamos a crear una función que se se ejecute cuando presionemos una
tecla y, en función de la tecla, la raqueta subirá o bajará.

Dicha función viene incluida por defecto en Processing, aunque hay que declararla, pero no
hace falta llamarla, digamos que son llamadas automáticamente al producirse un evento (de
la misma forma que definimos el d ​ raw​ y el ​setup​ pero no los llamamos).

def​ keyPressed​():
​global​ posicionY
​if​ keyCode ​==​ UP:
posicionY ​=​ posicionY ​-​ ​15

La función creada se activa cuando es presionada una tecla, sea cual sea. Una vez llamada
habrá que indicar con qué tecla queremos que se produzca un efecto. Algunas teclas
especiales tienen un código para ser llamadas. El código de la flecha hacia arriba del
teclado es ​UP​ y se indica como k​ eyCode == UP. S ​ i queremos usar teclas de texto normal no
hace falta decir ​keyCode​ y basta con decir ​key​:

#Tecla especial del teclado:


keyCode ​==​ UP
#Tecla de texto:
key ​==​ ​"​a"

Como verás, al presionar la flecha U


​ P​ estamos restando 15 unidades a la p
​ osicionY​, lo cual
tiene lógica si recordamos que en Processing las magnitudes en Y crecen hacia abajo. Son
15 unidades porque tras probar he considerado que esa cantidad hacía que el movimiento
fuese el adecuado en velocidad.

Prueba el código anterior situándolo al final de todo el programa para ver si funciona la tecla
arriba (UP) antes de continuar.

¿Ya lo has probado? Si es así te puedes haber dado cuenta de varias cosas:

● Si dejo la tecla presionada es posible que notes que el tiempo de espera entre la
primera vez que se mueve y el resto de veces que se mueve es diferente.

● Al llegar arriba nuestra raqueta no se detiene y desaparece del área de visualización.

11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

El asunto de repetirse más lenta la segunda vez que las veces sucesivas es una cuestión de
cómo está configurado el teclado. Los teclados suelen tener un retardo en la repetición, aquí
tenéis el ejemplo para Mac, en Preferencias del Sistema:

En el caso de un Mac, por muy rápido que se ponga la repetición sigue habiendo cierto
retardo, cosa que no es funcional. Por ello hay que tomar una decisión:

1. Si queremos que el objeto se mueva de forma continua con la tecla presionada


tendremos que cambiar la forma de hacerlo…

2. …. o bien simplemente hacemos que el objeto se mueva una vez por cada vez que se
presione una tecla, aunque esté presionada mucho tiempo.

12
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Movimiento manteniendo la tecla pulsada


Para el caso 1 tendríamos simplemente que conseguir que al presionar la tecla deseada una
variable global tome un valor concreto y en el ​draw​ hacemos que el objeto se mueva de
forma continua mientras esa variable tiene el valor concreto.

Por ponerlo en modo esquema:

arriba ​=​ 0
def​ draw:
​global​ arriba
​if​ arriba ​==​ ​1:
posicionY ​=​ posicionY ​-​ 3
def​ keyPressed​():
​if​ keyCode ​==​ UP:
arriba ​=​ 1

Intenta introducir el código anterior en el programa, sustituyendo a las partes creadas para
la función ​keyPressed( ) y​ pruébalo. Recuerda poner la variable ​arriba​ en el comienzo del
programa.

Si te fijas, estoy restando 3 unidades a la variable p


​ osicionY​ porque de esta forma la raqueta
se mueve mucho más rápido.

Ahora sólo quedaría ver la forma en la que podemos detener la raqueta, tanto al llegar arriba
como al soltar la tecla ​UP​.

Para conseguir que se detenga al llegar arriba basta con indicar que sólo reste a p ​ osicionY​ si
el rectángulo no ha llegado arriba, lo cual es el valor 0, por lo que bastará con añadir un a​ nd
en el ​if​ que hace subir la raqueta:

arriba = 0
def draw:
global arriba
​if​ arriba ​==​ ​1​ ​and​ posicionY ​>​ ​0:
​posicionY = posicionY - 3
def keyPressed():
if keyCode == UP:
arriba = 1

13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Pruébalo para ver si realmente no consigues subir la raqueta más allá del área de
visualización.

Para el evento que se produce al soltar una tecla usaremos la función ​keyReleased( ) q
​ ue
funciona igual que la anterior, solo que entra en acción cuando una tecla deja de estar
presionada, de forma que:

def​ keyReleased​():
​if​ keyCode ​==​ UP:
arriba ​=​ 0

Con esa función pararemos la raqueta al soltar la tecla U


​ P​. Prueba a incluirla en el código. A
continuación pondré cómo quedaría todo el código con la tecla ​DOWN​ incluida, pero intenta
hacerlo antes de ver cómo sería. Si no lo consigues míralo en el código completo que hay a
continuación:

#Declaro todas las variables simultáneamente


posicion​,​movimiento​,​primera_vez​,​arriba​,​abajo ​= [​20​,​200​],[​3, ​ ​2​],​0​,​0​,0
def setup():
size(600,400)
def draw():
background(227,220,7)
​global​ posicion​,​ movimiento​,​ posicionY​,​ primera_vez​,​ arriba​,​ abajo
​diametro = 30
fill(14,82,175)
ellipse(posicion[0],posicion[1],diametro,diametro)
dimensionX = 15
dimensionY = dimensionX*6
if primera_vez == 0:
posicionY = height/2 - dimensionY/2
primera_vez = 1
rect (20, posicionY, dimensionX, dimensionY)
posicion[0] = posicion[0] + movimiento[0]
posicion[1] = posicion[1] + movimiento[1]
​if posicion[0] > width - diametro/2 or posicion[0] < diametro/2:
movimiento[0] = -movimiento[0]
if posicion[1] > height - diametro/2 or posicion[1] < diametro/2:
movimiento[1] = -movimiento[1]
​#movemos la raqueta si hay que hacerlo
​if​ arriba ​==​ ​1​ ​and​ posicionY ​>​ ​0:
posicionY ​=​ posicionY ​-​ 3
​elif​ abajo ​==​ ​1​ ​and​ posicionY ​<​ height ​-​ dimensionY:
posicionY ​=​ posicionY ​+​ 3

14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

#funcion que activa el movimiento al presionar tecla UP y DOWN


def​ keyPressed​():
​global​ arriba​,​ abajo
​if​ keyCode ​==​ UP:
arriba ​=​ 1
​elif​ keyCode ​==​ DOWN:
abajo ​=​ 1
#funcion que detiene el movimiento al soltar tecla UP y DOWN
def​ keyReleased​():
​global​ arriba​,​ abajo
​if​ keyCode ​==​ UP:
arriba ​=​ 0
​elif​ keyCode ​==​ DOWN:
abajo ​=​ 0

Intenta observar cómo he optimizado la declaración de variables y las indicaciones sobre


variables globales, aunando en una sola línea tanto declaraciones como variables globales
que van a ser usadas:

#declaración conjunta de variables


posicion​,​movimiento​,​primera_vez​,​arriba​,​abajo ​= [​20​,​200​],[​3,
​ ​2​],​0​,​0​,0
#indicación de varias variables globales
global​ posicion​,​ movimiento​,​ posicionY​,​ primera_vez​,​ arriba​,​ abajo

Prueba el código e intenta familiarizarte con él. Hemos ido construyendo todo el código de
forma conjunta a lo largo del tema. Si hay algo que no tengas claro vuelve a mirarlo hasta
que lo entiendas antes de seguir. A continuación vamos a ver cómo hacemos el programa
para que sólo avance una cantidad por cada vez que se presiona la tecla arriba o abajo.

15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Movimiento con cada pulsación de la tecla


Ahora el asunto es jugar con una variable que nos permita hacer el efecto de subir o bajar
una única vez por cada vez que lo presionamos. Esa variable puede llamarse t​ eclaSuelta​. El
movimiento, en esta ocasión, se va a producir en la función ​keyPressed( )​, condicionándolo a
que esté una tecla pulsada y que además la variable t​ eclaSuelta​ tenga el valor T
​ rue​. Si,
vamos a usar una booleana y así te acostumbras a ellas.

De esta forma iniciaremos la variable ​teclaSuelta c


​ on valor T
​ rue​ y al presionar la tecla arriba
moveremos la raqueta una cantidad de píxels:

teclaSuelta ​=​ ​True

def​ keyPressed​():
​global​ teclaSuelta
​if​ keyCode ​==​ UP ​and​ teclaSuelta ​==​ ​True:
posicionY ​=​ posicionY ​-​ ​10
teclaSuelta ​=​ ​False

Para probar el código anterior tendrás que modificar el programa que cambiamos para que
se moviese la raqueta de forma fluida, guárdalo y copia el siguiente y pruébalo:

posicion,movimiento,primera_vez,teclaSuelta=[20,200],[3,2],0,True
def setup():
size(600,400)
def draw():
background(227,220,7)
global posicion, movimiento, variable, posicionY, arriba, abajo
diametro = 30
fill(14,82,175)
ellipse(posicion[0],posicion[1],diametro,diametro)
dimensionX = 15
dimensionY = dimensionX*6
if primera_vez == 0:
posicionY = height/2 - dimensionY/2
primera_vez = 1
rect (20, posicionY, dimensionX, dimensionY)
posicion[0] = posicion[0] + movimiento[0]
posicion[1] = posicion[1] + movimiento[1]
if posicion[0] > width - diametro/2 or posicion[0] < diametro/2:
movimiento[0] = -movimiento[0]
​if posicion[1] > height - diametro/2 or posicion[1] < diametro/2:

16
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

movimiento[1] = -movimiento[1]
#funcion que activa el movimiento al presionar tecla UP
def​ keyPressed​():
​global​ teclaSuelta​,​ posicionY
​if​ keyCode ​==​ UP ​and​ teclaSuelta ​==​ ​True:
posicionY ​=​ posicionY ​-​ ​10
teclaSuelta ​=​ ​False

Al probarlo, verás que la raqueta sube sólo la primera vez que presionamos U ​ P y​ luego deja
de subir. Es obvio que queda programar la función k​ eyReleased( ) ​que vuelva a cambiar la
variable ​teclaSuelta​ a ​True​ cuando soltemos la tecla UP:

def keyPressed():
global teclaSuelta
if keyCode == UP and teclaSuelta == True:
posicionY = posicionY - 10
teclaSuelta = False
def​ keyReleased​():
​global​ teclaSuelta
​if​ keyCode ​==​ UP:
teclaSuelta ​=​ ​True

El código anterior, cada vez que soltamos la tecla U​ P​, cambia el valor de la variable
teclaSuelta​ a T
​ rue​, por lo que podemos hacer subir la raqueta un número de píxels con cada
pulsación de la tecla U ​ P.

Hasta ahora no hemos visto cómo podemos imprimir cosas en Processing. Pues bien,
dentro de la interfaz de Processing hay una Consola, en la parte inferior, que muestra valores
y ahí se mostrará todo lo que queramos imprimir:

17
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

En esa consola, por ejemplo, podemos imprimir el valor que tiene una variable. Prueba a
incluir el siguiente código en las funciones y ejecútalo para que veas que ahí se puede
mostrar el valor de una variable:

def keyPressed():
global teclaSuelta
if keyCode == UP and teclaSuelta == True:
posicionY = posicionY - 10
teclaSuelta = False
​print​(​teclaSuelta)
def keyReleased():
global teclaSuelta
if keyCode == UP:
teclaSuelta = True
​print​(​teclaSuelta)

Ahora simplemente queda, igual que en el caso anterior, hacer que se detenga al llegar
arriba y que baje al presionar la tecla ​DOWN​:

def keyPressed():
global teclaSuelta, posicionY, dimensionY
if keyCode == UP and teclaSuelta == True:
​if​ posicionY ​>​ ​0:
​posicionY = posicionY - 10
teclaSuelta = False
elif keyCode == DOWN and teclaSuelta == True:
​if​ posicionY ​<​ height ​+​ dimensionY:
​posicionY = posicionY + 10
teclaSuelta = False
def keyReleased():
global teclaSuelta
if keyCode == UP or keyCode == DOWN:
teclaSuelta = True

Volvamos a incidir en el ámbito de las variables:

● Al declarar una variable fuera de cualquier ámbito ya es declarada como global.

● Al declarar una variable en un ámbito se destruye al acabar el ámbito a no ser que la


declaremos como global, en cuyo caso podrá ser usada fuera de ese ámbito.

variableGlobal ​=​ ​True


def​ setup​():

18
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

variableGlobal ​=​ ​False


def​ draw​():
​global​ nuevaVariableGlobal
nuevaVariableGlobal ​=​ ​True

La variable declarada en el ámbito ​setup​ no es global porque no se ha indicado y está


declarada dentro de un ámbito. Las otras dos son globales, la primera por dónde está
declarada y la segunda por estar declarada en un ámbito indicando que es global.

Una vez hemos entendido esto último podemos seguir con nuestro programa. Deberías ser
capaz de añadir todo lo planteado al programa general y que funcionase correctamente.
Estamos sumando y restando 10 unidades a la posición de la raqueta con cada pulsación en
las teclas U
​ P ​y D
​ OWN​, quizá te interese que se muevan más rápido o más lento, lo dejo a tu
elección.

Una vez lo has incorporado y has probado las dos opciones, movimiento fluido y movimiento
por pulsaciones, vamos a seguir con el videojuego.

19
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

La pelota rebota en la raqueta


Aquí llegamos a un punto complejo en la creación de todo videojuego que vamos a analizar
brevemente: el choque entre objetos. Los objetos que creamos no siempre tienen una forma
muy definida y es complicado producir un evento que se inicie cuando se tocan, pongamos
un ejemplo:

Si queremos que ocurra algo cuando los dos objetos se toquen tendríamos que definir cada
posible punto del perímetro de cada objeto y hacer comparaciones lógicas entre todos los
puntos, lo cual es muy complejo. Por ello, se suelen simplificar los contornos de los objetos
como distancias desde un punto del mismo.

De esta forma, simplificamos el objeto de cara a interactuar con el mismo. Por eso, en
algunos videojuegos, aunque parezca que estás tocando un objeto no se produce el evento
que debería producirse o al revés, no lo estás tocando pero se inicia el evento.

Para nuestro juego va a ser sencillo, porque simplemente tendremos que seguir el siguiente
esquema para que rebote la pelota al tocar el rectángulo:

20
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

En el dibujo se puede apreciar que para considerar que la pelota ha tocado la raqueta
tendremos que considerar una serie de aspectos:

1. El centro de la pelota debe estar entre la posición superior e inferior de la raqueta


(zona marcada con línea de puntos).

2. La distancia entre el borde derecho de la raqueta y el centro de la pelota debe ser


igual (o menor) al radio de la esfera (o elipse).

En el caso 2 he puesto una distancia igual o menor porque, al ir la esfera moviéndose en


cantidades mayores a 1 puede pasar que en una iteración del bucle ​draw​ aun no haya
tocado la raqueta y en la siguiente ya esté dentro de ella, aunque al ser cantidades pequeñas
visualmente no se aprecia, si que hay que tener en cuenta esa posibilidad a la hora de
programar.

Teniendo en cuenta esos dos efectos veamos cómo podríamos programar el rebote, para
ello debemos tener en cuenta todos los puntos de la raqueta tal como la hemos
programado:

21
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego

Con lo cual, podemos ya definir la situación para la cual la pelota debería cambiar de
dirección, pero tenemos que tener en cuenta una cosa. Comprobaremos primero que la
pelota está a una distancia de la raqueta menor al radio, y si se cumple dicho evento
comprobaremos en ese momento si estamos entre las dos líneas discontinuas del esquema
anterior.

Esto es así porque puede darse la situación que movamos la raqueta tras este chequeo y la
pelota, pese a estar inicialmente fuera de la raqueta, pase a estar dentro (y dentro quiere
decir metida dentro) y el programa la haga rebotar. Por ello sólo podremos hacer que rebote
al tocar la raqueta si se producen ambas situaciones la primera vez que la pelota esté lo
suficientemente cerca de tocar la raqueta.

Prueba a incluir el siguiente código en el programa, al final del ámbito d


​ raw​, y pruébalo.
Intenta conseguir llegar tarde a la pelota y ver qué ocurre cuando llegas tarde por muy poco.

"""Condicional para verificar si la pelota está tocando la raqueta


cumplíendose lo anterior"""
if​ posicion​[​0​]​ ​<=​ ​20​ ​+​ dimensionX ​+​ diametro​/​2:
"""Condicional para verificar si el centro de la pelota está entre los dos
extremos de la raqueta"""
​if​ posicion​[​1​]​ ​>=​ posicionY ​and​ posicion​[​1​]​ ​<=​ posicionY ​+​ dimensionY:
movimiento​[​0​]​ ​=​ - ​ ​movimiento​[0
​ ]

Habrás podido ver que hay que hacer algo para que no ocurra ese efecto por el cual la pelota
está todo el rato cambiando de dirección dentro de la raqueta hasta conseguir salir de ella…
Básicamente hace eso porque le estamos diciendo que cambie de dirección en esa
situación en la cual está por detrás de la raqueta y entre sus extremos verticales.

22
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego

Si lo piensas un poco le hemos dicho que si está por detrás de una posición en X y entre dos
posiciones en Y cambie de dirección, no hemos indicado que eso sólo ocurra cuando esté la
pelota avanzando hacia la pared y no lo haga cuando ya haya rebotado… ¿Se te ocurre
alguna forma de solucionarlo?

Lo más fácil será indicar al programa que sólo cambie de dirección si el m​ ovimiento[0] (​ que
es el movimiento en el eje X) es negativo, es decir, menor que cero. Si es positivo, significará
que la pelota se está trasladando de izquierda a derecha y no necesitamos que rebote en la
raqueta. Para decir que sea negativo usaremos la comparación m ​ ovimiento[0] < 0

def​ draw​():
"""Condicional para verificar si la pelota está tocando la raqueta
cumplíendose lo anterior"""
if​ posicion​[​0​]​ ​<=​ ​20​ ​+​ dimensionX ​+​ diametro​/​2​ ​and​ movimiento[0] ​<​ ​0:
"""Condicional para verificar si el centro de la pelota está entre los dos
extremos de la raqueta"""
​if​ posicion​[​1​]​ ​>=​ posicionY ​and​ posicion​[​1​]​ ​<=​ posicionY ​+​ dimensionY:
movimiento​[​0​]​ ​=​ - ​ ​movimiento​[0
​ ]

Prueba la modificación explicada y mira a ver si todo es correcto. Parece que sí, ¿verdad?

23
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link] Tema 9: Creando un videojuego

Puntuación
Ahora sólo quedaría la puntuación. Cada vez que la pelota toque la pared izquierda debemos
restar una vida a las vidas iniciales que tengamos. Vamos a partir de 5 vidas y crearemos
una variable global llamada v​ idas​ con valor 5.

A continuación tendremos que restarle una vida al programa cada vez que la pelotita toque
la pared izquierda. Fíjate que hemos hecho un evento que haga cambiar de dirección a la
pelotita cada vez que toca un borde lateral, por lo que no podemos simplemente poner que
cuando toque el borde lateral reste una vida, necesitamos indicar que, además de tocar el
borde lateral, tiene que estar la pelotita a la izquierda. ¿Qué tal algo así?

if​ posicion​[​0​]​ ​>​ width ​-​ diametro​/​2​ ​or​ posicion​[​0​]​ ​<​ diametro​/2
​ :
movimiento​[​0​]​ ​=​ ​-​movimiento​[​0]
​if​ posicion​[​0​]​ ​<​ ​100:
vidas ​=​ vidas ​-​ 1

Indicando que la p​ osicion[0]​ sea menor que 100 estamos diciendo que la pelotita tiene que
estar más bien a la izquierda. Debería funcionar, obviamente habrá que crear la variable
vidas​ como global e indicar en el ​draw​ que vamos a usarla. Podemos imprimir el valor de la
variable vidas en la ​Consola​ de momento, intenta conseguirlo antes de seguir.

¿Conseguido? La parte a añadir sería:

vidas ​=​ 5

def​ draw​():
​global​ vidas
​if​ posicion​[​0​]​ ​>​ width ​-​ diametro​/​2​ ​or​ posicion​[​0​]​ <
​ ​ diametro​/​2:
movimiento​[​0​]​ ​=​ ​-​movimiento​[​0]
​if​ posicion​[​0​]​ ​<​ ​100:
vidas ​=​ vidas ​-​ 1
​print​(​vidas)

¿Lo has probado? Deja que vayan bajando las vidas para ver qué ocurre y cómo se muestra
el texto.

Antes de ver qué hacemos con las vidas negativas vamos a mostrar la cantidad de vidas de
una forma un poco más graciosa.

24
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

Lo primero que intentaremos será que no ponga un simple número, queremos un texto en el
cual ponga algo del estilo ​Vidas: X​. El problema ya ha aparecido antes, v​ idas​ es una variable
que contiene un entero (​int​) y no se puede combinar con un string. Intenta pensar cómo la
cambiarías para producir el efecto antes de leer la solución. También ten en cuenta que
vidas debería seguir siendo entero después de imprimirla porque hay que restarle unidades…
¿Lo tienes claro?

vidas = 5
def draw():
global vidas
if posicion[0] > width - diametro/2 or posicion[0] < diametro/2:
movimiento[0] = -movimiento[0]
if posicion[0] < 100:
​vidas = vidas - 1
vidas ​=​ str​(​vidas)
​print​("​Vidas​:​ ​"+​vidas)
vidas ​=​ ​int​(​vidas)

Pruébalo para que veas que funciona y que Python en Processing sigue teniendo las
mismas bases vistas en el resto de temas.

Ahora queda que las vidas se muestren en el área de visualización y no en la C


​ onsola​, así
que vamos a ver cómo podemos escribir texto en el área de visualización. Lo primero de
todo es comprender cómo funciona el código que nos permite mostrar texto:

#Cargamos el tipo de fuente que queremos usar y lo guardamos en una


variable
fuente ​=​ loadFont​(​"[Link]")
"""Llamamos a la función de texto indicando como parámetros el tipo de
texto y el tamaño del mismo"""
textFont​(​fuente​,​30)
#Escribimos el texto que queramos e indicamos en qué posición de la
pantalla aparecerá
text​("​Texto​ a mostrar​",​ posicion_en_X​,​ posicion_en_Y)

Es decir, el proceso tiene tres pasos:

1. Cargamos un tipo de fuente (es decir, un tipo de letra, como los que tiene cualquier
editor de texto).

2. Indicamos que queremos usar ese tipo de fuente y un tamaño como texto.

25
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

3. Indicamos el texto que queremos escribir y su posición.

El único problema es que el tipo de fuente tiene que estar en la carpeta donde esté guardado
nuestro script de Python para Processing. Por suerte Processing tiene una herramienta para
crear archivos de código fuente (con extensión .vlw). Sólo tienes que ir al menú superior
Herramientas​ y seleccionar​ Crear fuente…

Se abrirá una ventana en la que tendremos que elegir un tipo de fuente, un nombre con el
que guardarla y un tamaño:

26
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego

Yo he seleccionado un tipo de fuente similar a las que usaban los videojuegos antiguos y he
seleccionado el tamaño 24. He guardado el archivo como ​[Link]​ y en la carpeta donde
tenía guardado el script aparece lo siguiente:

Se ha creado la carpeta​ data​ y dentro contiene:

27
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego

Intenta comprobar que todo es igual en tu carpeta.

Ahora que ya tenemos el tipo de fuente tenemos que escribir el código en el programa.
Anteriormente estábamos escribiendo el valor de la variable ​vidas​ al restarle una unidad,
pero si queremos escribirla en el área de visualización debemos tener en cuenta que en
cada iteración del bucle ​draw​ s
​ e va a refrescar el fondo​ y por lo tanto lo que escribamos no
va a ser permanente a no ser que lo escribamos cada vez que refresquemos el fondo.

Por ello, el cambio de valor de la variable ​vidas​ seguirá haciéndose en el condicional que
cambia de dirección la pelotita, pero el texto que debe aparecer vamos a escribirlo siempre
al comienzo del d​ raw​:

def​ draw​():
​#Dibujo el color de fondo
background​(​227​,​220​,​7)
​#Indico que voy a usar la variable vidas como global
​global​ vidas
​#Cargo la fuente que voy a usar en la variable fuente
fuente ​=​ loadFont​(​"[Link]")
​"""Llamo a la función textFont indicando como parámentros el tipo de
fuente y el tamaño"""
textFont​(​fuente​,​30)
​#Convierto en string la variable vidas
vidas ​=​ str​(​vidas)
​#Imprimo el texto que quiero mostrar indicando su posición
text​(​"Vidas: "​+​vidas​,​ ​50​,​ ​50)
​#Vuelvo a convertir a entero la variable vidas
vidas ​=​ ​int​(​vidas)

Prueba el código anterior situándolo con el resto de instrucciones ya creadas las veces que
necesites y prueba a crear una nueva fuente y cambiar la posición del texto antes de seguir.

28
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link] Tema 9: Creando un videojuego

Si te fijas, el color del texto es azul pese a no haber indicado nada… Para el color de texto
sigue siendo válido el ​fill​ de la elipse. La primera vez que se ejecuta sale con el color por
defecto y posteriormente se rellena de azul como la pelotita y la raqueta. La primera
ejecución es tan rápida que ese color no se aprecia, aunque lo correcto sería poner el color
de relleno al principio.

Es importante entender que la función t​ extFont​ y la función t​ ext​ deben estar en el mismo
ámbito, si no no funcionará correctamente el código. Al querer imprimir la variable con su
valor actualizado deben estar en el ​draw​. Si el texto fuese fijo y el fondo no cambiase en
cada iteración podrían estar en el s
​ etup.

29
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

Game over
Bueno… ¿qué hacemos cuando la cantidad de vidas llegue a cero? Vamos a hacer algo muy
sencillo pero laborioso:

● Si la cantidad de vidas es mayor que cero ejecuta el código normal.

● Si la cantidad de vidas es igual a cero pon el fondo negro y escribe Game Over.

¿Por qué digo que es laborioso? Pues bien, si queremos introducir en un condicional todo el
código creado tendremos que indentar todo el código que hemos creado dentro del d ​ raw​ y
hay que hacerlo manualmente porque la opción de indentación de Processing no funciona
con selección múltiple muy correctamente.

Teniendo esto claro el código a incluir será:

def​ draw​():
​global​ vidas
​if​ vidas ​>​ ​0:
​#Aquí incluyo todo mi programa
​elif​ vidas ​==​ ​0:
background​(​0)
fill​(​255)
fuente ​=​ loadFont​(​"[Link]")
textFont​(​fuente​,​50)
text​(​"Game over"​,​ ​150​,​ ​200)

Intenta añadir los cambios al programa y ver qué ocurre. Deja que las vidas lleguen a cero. Si
quieres hacer cambios en la parte de ​vidas == 0 y​ ver cómo quedan sin tener que esperar a
que se produzca el evento, cambia la variable vidas a 0 inicialmente para que aparezca
directamente esa parte y poder ir modificando valores y tamaños manualmente.

Bueno, parece que ya tenemos la primera parte de nuestro juego. Como dije al principio iba a
ser un proceso muy guiado porque quería un resultado muy concreto, pero ahora te toca a tí
practicar todo esto haciendo la actividad.

Processing es un simulador, no has realizado un juego que pueda ser ejecutado fuera de
Processing pero si te muestra todas las posibilidades de la programación con Python para
realizar aplicaciones como juegos y cómo es la salida gráfica.

30
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 9: Creando un videojuego

Mejorando el juego
No vamos a realizar más mejoras pero sí que vamos a ver algunas opciones que harían de
nuestro juego más interesante. No nos engañemos, con un poco de práctica puede resultar
imposible perder dado que la pelota va rebotando siempre de la misma forma y a la misma
velocidad:

● La pelota podría ir más rápido según va transcurriendo el tiempo.

● Al rebotar con la raqueta podría cambiar ligeramente el ángulo de rebote de alguna


forma para hacer más difícil el juego.

● Podríamos poner objetos intermedios que hiciesen rebotar la pelota.

● Podríamos hacer que esos objetos se moviesen.

● Podríamos hacer que todo ello ocurriese de forma gradual en niveles.

● Podríamos hacer una puntuación que fuese sumando también por cada vez que
devuelves la pelota con la raqueta.

● Podríamos poner música y efectos.

Como verás, podríamos añadir muchas cosas, es cuestión del interés de cada uno seguir
evolucionando este juego, aunque en la actividad final tendrás que realizar alguna mejora.

31
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego

Instrucciones de código usadas

#Operación booleana que devuelve True si se cumplen dos eventos


evento1 ​and​ evento2
"""Operación booleana que devuelve True si se cumple un evento, otro o
ambos"""
evento1 ​or​ evento2
"""Operación que convierte en False un evento que devuelve True y
viceversa"""
​not​ evento
#Función que se activa al presionar una tecla
​def​ keyPressed​():
#Instrucción para comprobar si una tecla especial está presionada
keyCode ​==​ codigo_de_la_tecla
#Instrucción para comprobar si una tecla está presionada
key ​==​ ​"​tecla"
#Función que se activa al soltar una tecla
​def​ keyReleased​():
#Cargar el tipo de fuente para usarla y aplicarla con un tamaño
fuente ​=​ loadFont​("​fuente_elegida​.​vlw​")
textFont​(​fuente​,​tama​ñ​o)
#Escribir un texto en pantalla
text​(​"Texto a mostrar"​,​ posicion_en_X​,​ posicion_en_Y)

32
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego

Reto
Debes mejorar el juego creado haciendo que puedan jugar dos jugadores. Hemos usado las
flechas para mover la raqueta izquierda y las flechas están a la derecha del teclado. Tendrás
que cumplir con los siguientes criterios:

● Se mostrarán las vidas de ambos jugadores.

● Cuando un jugador pierda se acabará el juego y se indicará qué jugador ha ganado (y


no Game over).

● Cada jugador moverá su raqueta con diferentes teclas. Recuerda que para teclas
especiales usamos ​keyCode y​ para teclas de texto​ key a
​ secas con la letra entre
comillas.

33

También podría gustarte