Introducción y instalación de Python
Introducción y instalación de Python
Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación
ÍNDICE
¿Qué es Python? 2
Instalando Python 10
Windows 10
Mac 10
Linux 12
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.
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
Por ello, es importante que interiorices lo que se explica a continuación para no sentirte
angustiado ni decepcionado a lo largo del curso:
● 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.
4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación
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
● Una serie de vídeos de apoyo en los cuales se explican con detenimiento algunos de
los conceptos relevantes del tema tratado.
● 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.
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.
● 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
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.
1. Ir a comprar materiales.
2. Construir la estantería.
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.
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.
8. Colocaré los libros de forma que cada temática esté en una zona de la estantería…
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.
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.
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]
10
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación
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
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:
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:
Por otro lado, para obtener la IDLE de Python 3 tendremos que instalarla igualmente desde
Terminal:
13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 1: Conceptos previos e instalación
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:
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.
[Link]
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.
[Link]
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:
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.
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
Variables 7
Modificando variables 9
Operando variables 10
Profundiza 13
Reto 17
1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables
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:
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
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
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).
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:
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:
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
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:
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.
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.
7
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables
● Variables que contienen números decimales (en Python float, de coma flotante).
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:
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)
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 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:
El resultado es el mismo, pero la suma queda almacenada en una nueva variable por si
queremos usarla más adelante.
Pero, ¿qué ocurre si opero strings?. Dos variables que contienen texto se pueden sumar,
prueba tu mismo el siguiente código:
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...
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
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:
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.
¿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:
11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables
Como habrás podido ver funciona. Otra opción es directamente convertir la variable a entero
en la misma sentencia que el input:
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
13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables
5//2
2
5%2
1
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
round (4.35)
4
14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 2: Input - Output y Variables
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
# 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
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:
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).
2
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control
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
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.
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.
4
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 3: Elementos de control
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.
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.
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:
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
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.
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:
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.
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:
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:
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.
A los condicionales que incluyen varias condiciones se les llama if - else.
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:
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.
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).
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.
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:
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.
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)
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.
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:
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:
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:
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:
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).
Pasemos ahora a ver cómo funciona un bucle for. Prueba el siguiente código guardándolo
en un script:
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.
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.
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”
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
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
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...
… o declararla vacía...
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:
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
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:
¿Y qué pasa si queremos saber la posición de uno de los nombres? Basta con indicar que
queremos conocerla con el comando index:
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
¿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:
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:
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:
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:
Veamos cómo se ejecuta el código anterior y cómo, efectivamente, ordena una lista:
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).
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:
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.
pronombres = {"yo" : "I", "tú" : "You", "él" : "He"}
print (pronombres["yo"])
Para añadir nuevas parejas clave - valor al diccionario sólo tenemos que indicarlo de la
siguiente forma:
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.
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
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.
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.
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:
13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 4: Listas, tuplas y diccionarios
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
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
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.
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:
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:
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:
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.
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( )
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:
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
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:
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()
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:
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:
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.
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)
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.
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
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:
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:
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:
13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 5: Escribir y leer un archivo de texto
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:
Parece que el anterior código debería funcionar sin problemas. Pruébalo como script antes
de seguir.
… 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.
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
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.
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.
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)
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:
19
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link] Tema 5: Escribir y leer un archivo de texto
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
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.
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!")
def miPrimeraFuncion():
print("Ou Yeah!")
miPrimeraFuncion()
miPrimeraFuncion()
miPrimeraFuncion()
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
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
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.
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
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
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
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
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
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.
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:
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.
“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).
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)
11
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones
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)
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?
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:
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)
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.
● 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.
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:
13
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 6: Funciones
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:
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:
¿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.
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
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:
18
TEMA 7
Clases
Curso de Python
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases
ÍNDICE
Clases 3
Creando el constructor 5
Creando métodos 11
Utilizando clases 14
Reto 18
1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases
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.
● 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…
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.
3
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases
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:
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
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
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:
Al llamar a S
oldado primero se ejecuta la función _ _init__( ):
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
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)
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.
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.
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))
9
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 7: Clases
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
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")
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
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:
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
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:
● 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á
● 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.
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)
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:
● 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
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
Creando animaciones 6
Cambios en el movimiento 13
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
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.
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)
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.
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.
def setup():
size(600,400)
background(255)
def draw():
fill(0,0,255)
rect(300,200,20,20)
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.
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…
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.
random(300)
random(100,300)
La primera opción genera un número aleatorio desde 0 hasta 300. El cero no hace falta
indicarlo.
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.
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))
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
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.
● 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
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
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
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.
¿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.
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 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
15
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 8: Python en un entorno con salida gráfica
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
Operaciones booleanas 4
Controlando la raqueta 11
Puntuación 24
Game over 30
Mejorando el juego 31
Reto 33
1
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego
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:
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:
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.
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).
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.
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]
● 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.
Las comprobaciones boolenas que vamos a usar con más frecuencia son dos:
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.
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.
6
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego
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:
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.
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.
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]
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:
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.
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:
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
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.
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
14
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego
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
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
18
Alfredo Sánchez Sánchez
@alfsan04
Curso: Python
[Link]
Tema 9: Creando un videojuego
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
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:
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.
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.
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.
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
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:
27
Alfredo Sánchez Sánchez
@alfsan04 Curso: Python
[Link]
Tema 9: Creando un videojuego
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 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.
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:
● Podríamos hacer una puntuación que fuese sumando también por cada vez que
devuelves la pelota con la raqueta.
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
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:
● 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