Manual Introducción Al Lenguaje de Programación Con Python ACT
Manual Introducción Al Lenguaje de Programación Con Python ACT
3. Python................................................................................................................................... 11
1. Thonny .................................................................................................................................. 18
2. Contexto real...................................................................................................................... 24
1. Datos .................................................................................................................................... 30
2. Números ............................................................................................................................. 39
1. Condicionales..................................................................................................................... 59
2. Bucles ................................................................................................................................... 66
1. Listas ..................................................................................................................................... 74
2. Tuplas.................................................................................................................................... 91
3. Diccionarios ........................................................................................................................ 95
1
Capítulo 1: Introducción
Este capítulo es una introducción a la programación para conocer, desde un enfoque
sencillo pero aclaratorio, los mecanismos que hay detrás de ello.
Los ordenadores son dispositivos complejos, pero están diseñados para hacer una cosa
bien: ejecutar aquello que se les indica. La cuestión es cómo indicar a un ordenador lo
que queremos que ejecute. Esas indicaciones se llaman técnicamente instrucciones y
se expresan en un lenguaje. Podríamos decir que programar consiste en escribir
instrucciones para que sean ejecutadas por un ordenador. El lenguaje que utilizamos
para ello se denomina lenguaje de programación.
2
creando con el tiempo lenguajes de programación intermedios que, posteriormente,
son convertidos a código máquina.
1.2 Ensamblador
El primer lenguaje de programación que encontramos en esta «escalada» es
ensamblador. Veamos un ejemplo de código en ensamblador del típico programa que
se escribe por primera vez, el «Hello, World»:
Aunque resulte difícil de creer, lo «único» que hace este programa es mostrar en la
pantalla de nuestro ordenador la frase «Hello, World», pero además teniendo en
cuenta que sólo funcionará para una arquitectura x86.
1.3 C
Aunque el lenguaje ensamblador nos facilita un poco la tarea de desarrollar
programas, sigue siendo bastante complicado ya que las instrucciones son muy
específicas y no proporcionan una semántica entendible. Uno de los lenguajes que
vino a suplir – en parte – estos obstáculos, fue C. Considerado para muchas personas
como un referente en cuanto a los lenguajes de programación, permite hacer uso de
instrucciones más claras y potentes. El mismo ejemplo anterior del programa «Hello,
World» se escribiría así en lenguaje C:
3
1.4 Python
Si seguimos «subiendo» en esta lista de lenguajes de programación, podemos llegar
hasta Python. Se dice que es un lenguaje de más alto nivel en el sentido de que sus
instrucciones son más entendibles por un humano. Veamos cómo se escribiría el
programa «Hello, World» en el lenguaje de programación Python:
¡Pues así de fácil! Hemos pasado de código máquina (ceros y unos) a código Python
en el que se puede entender perfectamente lo que estamos indicando al ordenador.
La pregunta que surge es:
¿cómo entiende una máquina lo que tiene que hacer si le pasamos un programa hecho
en Python (o cualquier otro lenguaje de alto nivel)? La respuesta es un compilador.
1.5 Compiladores
Los compiladores son programas que convierten un lenguaje «cualquiera» en código
máquina. Se pueden ver como traductores, permitiendo a la máquina interpretar lo
que queremos hacer.
4
Figura 1: Esquema de funcionamiento de un compilador. Iconos originales por Flaticon
5
2. Algo de historia
6
Tabla 1: Hitos en la computación
Luego los avances en las ciencias informáticas han sido muy acelerados, se
reemplazaron los tubos de vacío por transistores en 1958 y en el mismo año, se
sustituyeron por circuitos integrados, y en 1961 se miniaturizaron en chips de silicio. En
1971 apareció el primer microprocesador de Intel; y en 1973 el primer sistema operativo
CP/M. El primer computador personal es comercializado por IBM en el año 1980.
7
2.2 De los computadores a la programación
De acuerdo con este breve viaje por la historia, la programación está vinculada a la
aparición de los computadores, y los lenguajes tuvieron también su evolución.
Inicialmente, como ya hemos visto, se programaba en código binario, es decir en
cadenas de 0s y 1s, que es el lenguaje que entiende directamente el computador, tarea
extremadamente difícil; luego se creó el lenguaje ensamblador, que, aunque era lo
mismo que programar en binario, al estar en letras era más fácil de recordar.
Posteriormente aparecieron lenguajes de alto nivel, que en general, utilizan palabras
en inglés, para dar las órdenes a seguir, para lo cual utilizan un proceso intermedio
entre el lenguaje máquina y el nuevo código llamado código fuente, este proceso
puede ser un compilador o un intérprete.
1
Fuente: Universidad Técnica del Norte
8
2.3 Cronología de lenguajes de programación
Desde la década de los 1950 se han sucedido multitud de lenguajes de programación
que cada vez incorporan más funcionalidades destinadas a cubrir las necesidades del
desarrollo de aplicaciones. A continuación, se muestra una tabla con la historia de los
lenguajes de programación más destacados:
2
Fuente: Wikipedia.
9
Tabla 2: Creadores y creadoras de lenguajes de programación
Personaje Aporte
Alan Cooper Desarrollador de Visual Basic
Alan Kay Pionero en programación orientada a objetos. Creador de Smalltalk
Anders Hejlsberg Desarrollador de Turbo Pascal, Delphi y C#
Bertrand Meyer Inventor de Eiffel
Bill Joy Inventor de vi. Autor de BSD Unix. Creador de SunOS, el cual se
convirtió en Solaris
Bjarne Stroustrup Desarrollador de C++
Brian Kernighan Coautor del primer libro de programación en lenguaje C con Dennis
Ritchie y coautor de los lenguajes de programación AWK y AMPL
Dennis Ritchie Inventor de C. Sistema Operativo Unix
Edsger W. Dijkstra Desarrolló la estructura para la programación estructurada
Grace Hopper Desarrolladora de Flow-Matic, influenciando el lenguaje COBOL
Guido van Rossum Creador de Python
James Gosling Desarrollador de Oak. Precursor de Java
Joe Armstrong Creador de Erlang
John Backus Inventor de Fortran
John McCarthy Inventor de LISP
John von Neumann Creador del concepto de sistema operativo
Ken Thompson Inventor de B. Desarrollador de Go. Coautor del sistema operativo Unix
Kenneth E. Iverson Desarrollador de APL. Codesarrollador de J junto a Roger Hui
Larry Wall Creador de Perl y Perl 6
Martin Odersky Creador de Scala. Previamente contribuyó en el diseño de Java
Mitchel Resnick Creador del lenguaje visual Scratch
Nathaniel Rochester Inventor del primer lenguaje en ensamblador simbólico (IBM 701)
Niklaus Wirth Inventor de Pascal, Modula y Oberon
Robin Milner Inventor de ML. Compartió crédito en el método Hindley–Milner de
inferencia de tipo polimórfica
Seymour Papert Pionero de la inteligencia artificial. Inventor del lenguaje de
programación Logo en 1968
Stephen Wolfram Creador de Mathematica
Yukihiro Matsumoto Creador de Ruby
10
3. Python
11
Ventajas
o Alto nivel.
o Multiplataforma. Portable.
o Interpretado.
Desventajas
o Consumo de memoria.
o Desarrollo móvil.
12
3.2 Uso de Python
Al ser un lenguaje de propósito general, podemos encontrar aplicaciones
prácticamente en todos los campos científico-tecnológicos:
o Análisis de datos.
o Aplicaciones de escritorio.
o Concurrencia.
o Criptomonedas / Blockchain.
o Desarrollo de juegos.
o Desarrollo móvil.
o Desarrollo web.
o Inteligencia artificial.
o Machine Learning.
o Programación de redes.
o Propósitos educativos.
o Prototipado de software.
o Seguridad.
o Test automatizados.
13
De igual modo son muchas las empresas, instituciones y organismos que utilizan
Python en su día a día para mejorar sus sistemas de información. Veamos algunas de
las más relevantes:
Existen ránkings y estudios de mercado que sitúan a Python como uno de los lenguajes
más usados y la vez, más amados dentro del mundo del desarrollo de software. En el
momento de la escritura de este documento, la última actualización del Índice TIOBE
es de agosto de 2020 en la que Python ocupa el tercer lugar de los lenguajes de
programación más usados, sólo por detrás de C y Java. Igualmente en la encuesta a
desarrolladores de Stack Overflow hecha en 2020, Python ocupa el cuarto puesto de
los lenguajes de programación más usados, sólo por detrás de Javascript, HTML/CSS
y SQL.
3
Fuente: python.org
14
Tabla 3: Versiones mayores de Python
4
Término que se refiere a los/las desarrolladores/as principales del lenguaje de programación
15
3.4 Zen de Python
Existen una serie de reglas «filosóficas» que indican una manera de hacer y de pensar
dentro del mundo pitónico 5 creadas por Tim Peters, llamadas el Zen de Python y que
se pueden aplicar incluso más allá de la programación:
En su traducción de la Wikipedia:
o La legibilidad es importante.
5
Dícese de algo/alguien que sigue las convenciones de Python
16
o Sin embargo, la practicidad le gana a la pureza.
o A pesar de que esa manera no sea obvia a menos que seas holandés.
o Los espacios de nombres son una gran idea, ¡tengamos más de esos!
17
Capítulo 2: Entorno de desarrollo
Para poder utilizar Python debemos preparar nuestra máquina con las herramientas
necesarias. Este capítulo trata sobre la instalación y configuración de los elementos
adecuados para el desarrollo con el lenguaje de programación Python.
1. Thonny
Cuando vamos a trabajar con Python debemos tener instalado, como mínimo, un
intérprete del lenguaje (para otros lenguajes sería un compilador). El intérprete nos
permitirá ejecutar nuestro código para obtener los resultados deseados. La idea del
intérprete es lanzar instrucciones «sueltas» para probar determinados aspectos.
Pero normalmente queremos ir un poco más allá y poder escribir programas algo más
largos, por lo que también necesitaremos un editor. Un editor es un programa que
nos permite crear ficheros de código (en nuestro caso con extensión *.py), que luego
son ejecutados por el intérprete.
Hay otra herramienta interesante dentro del entorno de desarrollo que sería el
depurador. Lo podemos encontrar habitualmente en la bibliografía por su nombre
inglés debugger. Es el módulo que nos permite ejecutar paso a paso nuestro código y
visualizar qué está ocurriendo en cada momento. Se suele usar normalmente para
encontrar fallos (bugs) en nuestros programas y poder solucionarlos (debug/fix).
18
Thonny es un programa muy interesante para empezar a aprender Python ya que
engloba estas tres herramientas: intérprete, editor y depurador.
1.1 Instalación
Para instalar Thonny debemos acceder a su web y descargar la aplicación para nuestro
sistema operativo. La ventaja es que está disponible tanto para Windows, Mac y Linux.
Una vez descargado el fichero lo ejecutamos y seguimos su instalación paso por paso.
Una vez terminada la instalación ya podemos lanzar la aplicación que se verá parecido
a la siguiente imagen:
Nota: Es posible que el aspecto del programa varíe ligeramente según el sistema
operativo, configuración de escritorio, versión utilizada o idioma (en mi caso está en
inglés), pero a efectos de funcionamiento no hay diferencia.
19
Versiones de Python
Existen múltiples versiones de Python. Desde el lanzamiento de la versión 1.0 en 1994
se han ido liberando versiones, cada vez, con nuevas características que aportan
riqueza al lenguaje:
Nota: Para ser exactos, esta tabla (y en general todo este manual) versa sobre una
implementación concreta de Python denominada CPython, pero existen otras
implementaciones alternativas de Python. A los efectos de aprendizaje del lenguaje
podemos referirnos a Python (aunque realmente estaríamos hablando de CPython).
20
1.2 Probando el intérprete
El intérprete de Python (por lo general) se identifica claramente porque posee un
prompt 6 con tres ángulos hacia la derecha >>>. En Thonny lo podemos encontrar en
el panel inferior, pero se debe tener en cuenta que el intérprete de Python es una
herramienta autocontenida y que la podemos ejecutar desde el símbolo del sistema o
la terminal:
Para hacer una primera prueba del intérprete vamos a retomar el primer programa
que se suele hacer. Es el llamado «Hello, World». Para ello escribimos lo siguiente en
el intérprete y pulsamos la tecla ENTER:
Lo que hemos hecho es indicarle a Python que ejecute como entrada la instrucción
print ('Hello, World'). La salida es el texto Hello, World que lo vemos en la siguiente
línea (ya sin el prompt >>>).
Importante: Los ficheros que contienen programas hechos en Python siempre deben
tener la extensión .py
6
Término inglés que se refiere al símbolo que precede la línea de comandos
7
La carpeta donde se guarden los archivos de código no es crítica para su ejecución, pero sí
es importante mantener un orden y una organización para tener localizados nuestros ficheros
y proyectos
21
Ahora ya podemos ejecutar nuestro fichero helloworld.py. Para ello pulsamos el botón
verde con triángulo blanco (en la barra de herramientas) o bien damos a la tecla F5.
Veremos que en el panel de Shell nos aparece la salida esperada. Lo que está pasando
«entre bambalinas» es que el intérprete de Python está recibiendo como entrada el
fichero que hemos creado; lo ejecuta y devuelve la salida para que Thonny nos lo
muestre en el panel correspondiente.
Name Value
msg 'Hello, World'
22
También existe la posibilidad, a través del depurador, de ir ejecutando nuestro
programa paso a paso. Para ello basta con pulsar en el botón que tiene un insecto.
Ahí comienza la sesión de depuración y podemos avanzar instrucción por instrucción
usando la tecla F7:
23
2. Contexto real
2.1 Python
La forma más habitual de instalar Python (junto con sus librerías) es descargarlo e
instalarlo desde su página oficial:
Anaconda
Otra de las alternativas para disponer de Python es nuestro sistema y que además es
muy utilizada, es Anaconda. Se trata de un conjunto de herramientas, orientadas en
principio a la ciencia de datos, pero que podemos utilizarlas para desarrollo general
en Python (junto con otras librerías adicionales). Existen versiones de pago, pero la
distribución Individual Edition es «open-source» y gratuita. Se puede descargar desde
los siguientes enlaces:
24
o Anaconda 64-bits para Windows
Para gestionar los paquetes que tenemos en nuestro sistema se utiliza la herramienta
pip, una utilidad que también se incluye en la instalación de Python. Con ella podremos
instalar, desinstalar y actualizar paquetes, según nuestras necesidades. A continuación,
se muestran las instrucciones que usaríamos para cada una de estas operaciones:
8
También llamada «vanilla installation» ya que es la que viene por defecto y no se hace ninguna
personalización
25
Si bien con virtualenv tenemos las funcionalidades necesarias para trabajar con
entornos virtuales, destacaría una herramienta llamada virtualenvwrapper que funciona
por encima de virtualenv y que facilita las operaciones sobre entornos virtuales. Su
instalación es equivalente a cualquier otro paquete Python:
26
o $ mkvirtualenv env1: crea un entorno virtual llamado env1
o $ pip install requests: instala el paquete requests dentro del entorno virtual env1
2.4 Editores
Existen multitud de editores en el mercado que nos pueden servir perfectamente para
escribir código Python. Algunos de ellos incorporan funcionalidades extra y otros
simplemente nos permiten editar ficheros. Cabe destacar aquí el concepto de Entorno
de Desarrollo Integrado, más conocido por sus siglas en inglés IDE 9. Se trata de una
aplicación informática que proporciona servicios integrales para el desarrollo de
software.
Podríamos decir que Thonny es un IDE de aprendizaje, pero existen muchos otros.
Veamos un listado de editores de código que se suelen utilizar para desarrollo en
Python:
o Eclipse + PyDev
o Sublime Text
o Atom
o GNU Emacs
o Vi-Vim
9
Integrated Development Environment.
27
Editores o IDEs específicos para Python
o PyCharm
o Spyder
o Thonny
Nota: Aunque su uso está más extendido en el mundo Python, existen muchos otros
«kernels» sobre los que trabajar en Jupyter Notebook.
2.6 WSL
Si estamos trabajando en un sistema Windows 10 es posible que nos encontremos más
cómodos usando una terminal tipo «Linux», entre otras cosas para poder usar con
facilidad las herramientas vistas en esta sección para preparar y gestionar el entorno
de desarrollo Python. Durante mucho tiempo esto fue difícil de conseguir hasta que
Microsoft sacó WSL.
10
Término inglés utilizado para hacer referencia a algoritmos de aprendizaje automático.
11
Proceso específico para un lenguaje de programación que ejecuta instrucciones y actúa como
interfaz de entrada/salida.
28
WSL 12 nos proporciona una consola con entorno Linux que podemos utilizar en
nuestro Windows 10 sin necesidad de instalar una máquina virtual o crear una partición
aparte para Linux nativo. Es importante también saber que existen dos versiones de
WSL hoy en día: WSL y WSL2. La segunda es bastante reciente (publicada a mediados
de 2019), tiene mejor rendimiento y se adhiere más al comportamiento de un Linux
nativo.
4. Finalmente, la instalamos:
En este punto, WSL debería estar instalado correctamente, y debería también aparecer
en el menú Inicio.
12
Windows Subsystem for Linux
29
Capítulo 3: Tipos de datos
Igual que en el mundo real cada objeto pertenece a una categoría, en programación
manejamos objetos que tienen asociado un tipo determinado. En este capítulo se
verán los tipos de datos básicos con los que podemos trabajar en Python.
1. Datos
Los programas están formados por código y datos. Pero a nivel interno de la memoria
del ordenador no son más que una secuencia de bits. La interpretación de estos bits
depende del lenguaje de programación, que almacena en la memoria no sólo el puro
dato sino distintos metadatos.1
Cada «trozo» de memoria contiene realmente un objeto, de ahí que se diga que en
Python todo son objetos. Y cada objeto tiene, al menos, los siguientes campos:
30
1.1 Tipos de datos
A continuación, se muestran los distintos tipos de datos que podemos encontrar en
Python, sin incluir aquellos que proveen paquetes externos:
31
1.2 Variables
Las variables son un concepto clave en los lenguajes de programación y permiten
definir nombres
para los valores que tenemos en memoria y que vamos a usar en nuestro programa.
o Son «case-sensitive» 14. Por ejemplo, thing, Thing y THING son nombres
diferentes. Deben empezar con una letra o un guion bajo, nunca con un dígito.
13
Para ser exactos, sí se pueden utilizar otros caracteres, e incluso emojis en los nombres de
variables, aunque no suele ser una práctica extendida, ya que podría dificultar la legibilidad.
14
Sensible a cambios en mayúsculas y minúsculas.
32
Nota: Por lo general se prefiere dar nombres en inglés a las variables que utilicemos,
ya que así hacemos nuestro código más «internacional» y con la posibilidad de que
otras personas puedan leerlo, entenderlo y – llegado el caso – modificarlo. Es sólo una
recomendación, nada impide que se haga en castellano.
Constantes
Un caso especial y que vale la pena destacar son las constantes. Podríamos decir que
es un tipo de variable pero que su valor no cambia a lo largo de nuestro programa.
Por ejemplo, la velocidad de la luz. Sabemos que su valor es constante de 300.000
km/s. En el caso de las constantes utilizamos mayúsculas (incluyendo guiones bajos si
15
Más información sobre convenciones de nombres en PEP 8.
16
Del término inglés «Python Enhancement Proposals».
33
es necesario) para nombrarlas. Para la velocidad de la luz nuestra constante se podría
llamar: LIGHT_SPEED.
1. n
2. num_elements
3. number_of_elements
4. number_of_elements_to_be_handled
No existe una regla mágica que nos diga cuál es el nombre perfecto, pero podemos
aplicar el sentido común y, a través de la experiencia, ir detectando aquellos nombres
que sean más adecuados. En el ejemplo anterior, quizás podríamos descartar de
principio la opción 1 y la 4 (por ser demasiado cortas o largas); nos quedaríamos con
las otras dos. Si nos fijamos bien, casi no hay mucha información adicional de la opción
3 con respecto a la 2. Así que podríamos concluir que la opción 2 es válida para
nuestras necesidades. En cualquier caso, esto dependerá siempre del contexto del
problema que estemos tratando.
34
1.3 Asignación
En Python se usa el símbolo = para asignar un valor a una variable:
En este caso las tres variables utilizadas en el «lado izquierdo» tomarán el valor 3.
Recordemos que los nombres de variables deben seguir unas reglas establecidas, de
lo contrario obtendremos un error sintáctico del intérprete de Python:
35
Asignando una variable a otra variable
Las asignaciones que hemos hecho hasta ahora han sido de un valor literal a una
variable. Pero nada impide que podamos hacer asignaciones de una variable a otra
variable:
Eso sí, la variable que utilicemos como valor de asignación debe existir previamente,
ya que, si no es así, obtendremos un error informando de que no está definida:
36
Conocer el valor de una variable
Hemos visto previamente cómo asignar un valor a una variable, pero aún no sabemos
cómo «comprobar» el valor que tiene dicha variable. Para ello podemos utilizar dos
estrategias:
Nota: print sirve también cuando estamos en una sesión interactiva de Python («shell»)
37
Ejercicio
1. Asigna un valor entero 2001 a la variable space_odyssey y muestra su valor.
Ampliar conocimientos
o Basic Data Types in Python
o Variables in Python
o Immutability in Python
38
2. Números
En esta sección veremos los tipos de datos numéricos que ofrece Python centrándonos
en booleanos, enteros y flotantes.
2.1 Booleanos
George Boole es considerado como uno de los fundadores del campo de las ciencias
de la computación y fue el creador del Álgebra de Boole que da lugar, entre otras
estructuras algebraicas, a la Lógica binaria. En esta lógica las variables sólo pueden
tomar dos valores discretos: verdadero o falso.
39
La primera variable is_opened está representando el hecho de que algo esté abierto,
y al tomar el valor True podemos concluir que sí. La segunda variable has_sugar nos
indica si una bebida tiene azúcar; dado que toma el valor False inferimos que no lleva
azúcar.
Advertencia: Tal y como se explicó en este apartado, los nombres de variables son
«case- sensitive». De igual modo el tipo booleano toma valores True y False con la
primera letra en mayúsculas. De no ser así obtendríamos un error sintáctico.
2.2 Enteros
Los números enteros no tienen decimales, pero sí pueden contener signo y estar
expresados en alguna base distinta de la usual (base 10).
Literales enteros
Veamos algunos ejemplos de números enteros:
40
Dos detalles a tener en cuenta:
o Python permite dividir los números enteros con guiones bajos _ para clarificar
su lectura/escritura. A efectos prácticos es como si esos guiones bajos no
existieran.
41
Es de buen estilo de programación dejar un espacio entre cada operador. Además,
hay que tener en cuenta que podemos obtener errores dependiendo de la operación
(más bien de los operandos) que estemos utilizando, como es el caso de la división
por cero.
Asignación aumentada
Python nos ofrece la posibilidad de escribir una asignación aumentada mezclando la
asignación y un operador.
Supongamos que disponemos de 100 vehículos en stock y que durante el pasado mes
se han vendido 20 de ellos. Veamos cómo sería el código con asignación tradicional
vs. asignación aumentada:
42
Estas dos formas son equivalentes a nivel de resultados y funcionalidad, pero
obviamente tienen diferencias de escritura y legibilidad. De este mismo modo,
podemos aplicar un formato compacto al resto de operaciones:
Módulo
La operación módulo (también llamado resto), cuyo símbolo en Python es %, se define
como el resto de dividir dos números. Veamos un ejemplo para entender bien su
funcionamiento:
43
Exponenciación
Para elevar un número a otro en Python utilizamos el operador de exponenciación **:
Se debe tener en cuenta que también podemos elevar un número entero a un número
decimal. En este caso es como si estuviéramos haciendo una raíz 17. Por ejemplo:
1
42 = 40,5 = √4 = 2
Hecho en Python:
2.3 Flotantes
Los números en punto flotante 18 tienen parte decimal. Veamos algunos ejemplos de
flotantes en Python.
17
No siempre es una raíz cuadrada porque se invierten numerador y denominador
18
Punto o coma flotante es una notación científica usada por computadores
4
real de la mejor manera posible. Pero también se hace necesario buscar mecanismos
para convertir unos tipos de datos en otros.
Conversión implícita
Cuando mezclamos enteros, booleanos y flotantes, Python realiza automáticamente
una conversión implícita (o promoción) de los valores al tipo de «mayor rango».
Veamos algunos ejemplos de esto:
Conversión explícita
Aunque más adelante veremos el concepto de función, desde ahora podemos decir
que existen una serie de funciones para realizar conversiones explícitas de un tipo a
otro:
45
Para poder comprobar el tipo que tiene una variable podemos hacer uso de la función
type():
Ejercicio
Existe una aproximación al seno de un ángulo � expresado en grados:
���(�) ≈ 4�(180 − �)
40500 − �(180 − �)
o ���(90) = 1,0
o ���(45) = 0,7071067811865475
o ���(50) = 0,766044443118978
Ampliar conocimientos
o The Python Square Root Function
46
3. Cadenas de texto
Para incluir comillas dobles dentro de la cadena de texto no hay mayor inconveniente:
Puede surgir la duda de cómo incluimos comillas simples dentro de la propia cadena
de texto. Veamos soluciones para ello:
47
En la primera opción estamos escapando las comillas simples para que no sean
tratadas como caracteres especiales. En la segunda opción estamos creando el «string»
con comillas dobles (por fuera) para poder incluir directamente las comillas simples
(por dentro). Python también nos ofrece esta posibilidad.
Comillas triples
Hay una forma alternativa de crear cadenas de texto utilizando comillas triples. Su uso
está pensado principalmente para cadenas multilínea:
Importante: Los tres puntos ... que aparecen a la izquierda de las líneas no están
incluidos en la cadena de texto. Es el símbolo que ofrece el intérprete de Python
cuando saltamos de línea.
Cadena vacía
La cadena vacía es aquella que no tiene caracteres, pero es perfectamente válida.
Aunque a priori no lo pueda parecer, es un recurso importante en cualquier código.
Su representación en Python es la siguiente:
3.2 Conversión
Podemos crear «strings» a partir de otros tipos de datos usando la función str():
48
También podemos convertir «strings» a otros tipos de datos:
>>> int('7')
7
>>> float('3.77')
3.77
>>> bool('1')
True
>>> bool('')
False
Nota: Es cuando utilizamos la función print() que vemos el resultado de utilizar los
caracteres escapados.
49
3.4 Más sobre print()
Hemos estado utilizando la función print() de forma sencilla, pero admite algunos
parámetros interesantes:
Línea 4: Podemos imprimir todas las variables que queramos separándolas por comas.
Línea 7: El separador por defecto entre las variables es un espacio, podemos cambiar
el caracter que se utiliza como separador entre cadenas.
Línea 10: El carácter de final de texto es un salto de línea, podemos cambiar el caracter
que se utiliza como final de texto.
Nota: La función input() siempre nos devuelve un objeto de tipo cadena de texto o str.
Tenerlo muy en cuenta a la hora de trabajar con números, ya que debemos realizar
una conversión explícita.
50
3.6 Operaciones con «strings»
Combinar cadenas
Podemos combinar dos o más cadenas de texto utilizando el operador +:
Repetir cadenas
Podemos repetir dos o más cadenas de texto utilizando el operador *:
Obtener un caracter
Los «strings» están indexados y cada caracter tiene su posición propia. Para obtener
un único caracter dentro de una cadena de texto es necesario especificar su índice
dentro de corchetes [...].
51
Nota: Nótese que existen tanto índices positivos como índices negativos para acceder
a cada caracter de la cadena de texto. A priori puede parecer redundante, pero es muy
útil para determinados casos.
Las cadenas de texto son tipos de datos inmutables. Es por ello que no podemos
modificar un caracter directamente:
Truco: Existen formas de modificar una cadena de texto que veremos más adelante,
aunque realmente no estemos transformando el original, sino que se crea un nuevo
objeto con las modificaciones.
19
El término usado en inglés es slice.
52
[:] Extrae la secuencia entera desde el comienzo hasta el final. Es una especia de copia
de toda la cadena de texto.
[start:end:step] Extrae desde start hasta end menos 1 haciendo saltos de tamaño step.
Importante: El troceado siempre llega a una unidad menos del índice final que
hayamos especificado. Sin embargo, el comienzo sí coincide con el que hemos puesto.
20
Término inglés para referirse a algo que ya está incorporado por defecto con el lenguaje de
programación.
53
Dividir una cadena
A contrario que len() algunas funciones son específicas de «strings». Para usar una
función de cadena es necesario escribir el nombre del «string», un punto y el nombre
de la función, pasando cualquier argumento necesario:
Aunque aún no lo hemos visto, lo que devuelve split() es una lista (otro tipo de datos
en Python) donde cada elemento es una parte de la cadena de texto original.
Limpiar cadenas
Cuando leemos datos del usuario o de cualquier fuente externa de información, es
bastante probable que se incluyan en esas cadenas de texto, caracteres de relleno 21 al
comienzo y al final. Python nos ofrece la posibilidad de eliminar estos caracteres u
otros que no nos interesen.
La función strip() se utiliza para eliminar caracteres del principio y final del «string».
También existen variantes de esta función para aplicarla únicamente al comienzo o al
final de la cadena de texto:
Nota: Si no se especifican los caracteres a eliminar, strip() usa por defecto cualquier
combinación de espacios en blanco, saltos de línea \n y tabuladores \t.
21
Se suele utilizar el término inglés «padding» para referirse a estos caracteres.
54
A continuación, vamos a hacer «limpieza» por la izquierda (comienzo) y por la derecha
(final) utilizando la función lstrip() y rstrip() respectivamente:
Importante: La función strip() no modifica la cadena que estamos usando (algo obvio
porque los «strings» son inmutables) sino que devuelve una nueva cadena de texto
con las modificaciones pertinentes.
Realizar búsquedas
Veamos aquellas funciones que proporciona Python para la búsqueda en cadenas de
texto. Vamos a partir de una variable que contiene un trozo de la canción Mediterráneo
de Joan Manuel Serrat:
55
Tanto find() como index() devuelven el índice de la primera ocurrencia de la subcadena
que estemos buscando, pero se diferencian en su comportamiento cuando la
subcadena buscada no existe:
Reemplazar elementos
Podemos usar la función replace() indicando la subcadena a reemplazar, la subcadena
de reemplazo y cuántas instancias se deben reemplazar. Si no se especifica este último
argumento, la sustitución se hará en todas las instancias encontradas:
Mayúsculas y minúsculas
Python nos permite realizar variaciones en los caracteres de una cadena de texto para
pasarlos a mayúsculas y/o minúsculas. Veamos las distintas opciones disponibles:
56
3.7 «f-strings»
Los f-strings aparecieron en Python 3.6 y se suelen usar en código de nueva creación.
Es la forma más potente – y en muchas ocasiones más eficiente – de formar cadenas
de texto incluyendo valores de otras variables.
Para indicar en Python que una cadena es un «f-string» basta con precederla con una
f e incluir las variables o expresiones a interpolar entre llaves {...}.
Supongamos que disponemos de los datos de una persona y queremos formar una
frase de bienvenida con ellos:
57
Los «f-strings» proporcionan una gran variedad de opciones de formateado: ancho
del texto, número de decimales, tamaño de la cifra, alineación, etc. Muchas de estas
facilidades se pueden consultar en el artículo Best of Python3.6 f-strings 22
Ejercicio
Obtenga el número de palabras que contiene la siguiente cadena de texto:
Ampliar conocimientos
o A Guide to the Newer Python String Format Techniques
22
Escrito por Nirant Kasliwal en Medium
58
Capítulo 4: Control de flujo
Todo programa informático está formado por instrucciones que se ejecutan en forma
secuencial de «arriba» a «abajo», de igual manera que leeríamos un libro. Este orden
constituye el llamado flujo del programa. Es posible modificar este flujo secuencial para
que tome bifurcaciones o repita ciertas instrucciones. Las sentencias que nos permiten
hacer estas modificaciones se engloban en el control de flujo.
1. Condicionales
En esta sección veremos la sentencia condicional if y las distintas variantes que puede
asumir, pero antes de eso introduciremos algunas cuestiones generales de escritura de
código.
59
a través de espacios en blanco, preferiblemente 4. 23 En términos técnicos se habla del
tamaño de indentación.
Consejo: Esto puede resultar extraño e incómodo a personas que vienen de otros
lenguajes de programación, pero desaparece rápido y se siente natural a medida que
se escribe código.
1.2 Comentarios
Un comentario es un trozo de texto en tu programa que es ignorado por el intérprete
de Python. Se pueden usar para aclarar líneas de código adyacentes, para dejar notas
recordatorias o cualquier otro propósito.
Los comentarios se inician con el símbolo almohadilla # y desde ese punto hasta el
final de la línea es parte del comentario:
23
Reglas de indentación definidas en PEP 8
60
1.3 Ancho del código
Los programas suelen ser más legibles cuando las líneas no son excesivamente largas.
La longitud máxima de línea recomendada por la guía de estilo de Python es de 80
caracteres.
Sin embargo, esto genera una cierta polémica hoy en día, ya que los tamaños de
pantalla han aumentado y las resoluciones son mucho mayores que hace años. Así las
líneas de más de 80 caracteres se siguen visualizando correctamente. Hay personas
que son más estrictas en este límite y otras más flexibles.
En caso de que queramos romper una línea de código demasiado larga, tenemos dos
opciones:
1.4 La sentencia if
Las sentencia condicional en Python (al igual que en muchos otros lenguajes de
programación) es if. En su escritura debemos añadir una expresión de comparación
terminando con dos puntos al final de la línea. Veamos un ejemplo:
En el caso anterior se puede ver claramente que la condición se cumple y por tanto se
ejecuta la instrucción que tenemos dentro del cuerpo de la condición. Pero podría no
61
ser así. Para controlar ese caso existe la sentencia else. Veamos el mismo ejemplo
anterior pero añadiendo esta variante:
Python nos ofrece una mejora en la escritura de condiciones anidadas cuando nos
aparecen juntos un else y un if. Podemos sustituirlos por la sentencia elif:
24
El anidamiento (o «nesting») hace referencia a incorporar sentencias unas dentro de otras
mediante la inclusión de diversos niveles de profundidad (indentación).
62
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/wd58B4t
Operador Símbolo
Igualdad ==
Desigualdad !=
Menor que <
Menor o igual que <=
Mayor que >
Mayor o igual que >=
A continuación, vamos a ver una serie de ejemplos con expresiones de comparación.
Téngase en cuenta que estas expresiones habría que incluirlas dentro de la sentencia
condicional en el caso de que quisiéramos tomar una acción concreta:
63
Podemos escribir condiciones más complejas usando los operadores lógicos:
o and
o or
o not
Python ofrece la posibilidad de ver si un valor está entre dos límites de manera directa.
Así, por ejemplo, para descubrir si value está entre 5 y 10 haríamos:
Nota:
«Booleanos» en condiciones
Cuando queremos preguntar por la veracidad de determinada variable «booleana» en
una condición, la primera aproximación que parece razonable es la siguiente:
64
Pero podemos simplificar esta condición tal que así:
Hemos visto una comparación para un valor «booleano» verdadero (True). En el caso
de que la comparación fuera para un valor falso lo haríamos así:
Ejercicio
Dada una variable year con un valor entero, compruebe si dicho año es bisiesto o no.
Ampliar conocimientos
65
2. Bucles
Cuando queremos hacer algo más de una vez, necesitamos recurrir a un bucle. En esta
sección veremos las distintas sentencias en Python que nos permiten repetir un bloque
de código.
66
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/dfeqTCZ
https://cutt.ly/wfrKnHl
Como hemos visto en este ejemplo, break nos permite finalizar el bucle una vez que
hemos encontrado nuestro objetivo: el primer múltiplo de 3. Pero si no lo hubiéramos
encontrado, el bucle habría seguido decrementando la variable num hasta valer 0, y la
condición del bucle while hubiera resultado falsa.
Bucle infinito
Si no establecemos bien la condición de parada o bien el valor de alguna variable está
fuera de control, es posible que lleguemos a una situación de bucle infinito, del que
nunca podamos salir. Veamos un ejemplo de esto:
67
El problema que surge es que la variable num toma los valores 1, 3, 5, 7, 9, 11, ... por lo
que nunca se cumple la condición del bucle. Esto hace que repitamos eternamente la
instrucción de incremento.
https://cutt.ly/AfrZroa
Truco: Para abortar una situación de bucle infinito podemos pulsar en el teclado la
combinación CTRL-C. Se puede ver reflejado en el intérprete de Python por
KeyboardInterrupt.
25
Realizar cierta acción varias veces. En este caso la acción es tomar cada elemento.
68
A continuación, un ejemplo en el que vamos a recorrer (iterar) una cadena de texto:
La clave aquí está en darse cuenta de que el bucle va tomando, en cada iteración, cada
uno de los elementos de la variable que especifiquemos. En este caso concreto, letter
va tomando cada una de las letras que existen en word, porque una cadena de texto
está formada por elementos que son caracteres.
https://cutt.ly/Pft6R2e
Nota: La variable que utilizamos en el bucle for para ir tomando los valores puede
tener cualquier nombre. Al fin y al cabo, es una variable que definimos según nuestras
necesidades. Tener en cuenta que se suele usar un nombre en singular.
https://cutt.ly/zfyqkbJ
69
Generar secuencias de números
La función range() devuelve un flujo de números en el rango especificado, sin
necesidad de crear y almacenar previamente una larga estructura de datos. Esto
permite generar rangos enormes sin consumir toda la memoria del sistema.
El uso de range() es similar a los «slices»: range(start, stop, step). Podemos omitir start
y el rango empezaría en 0. El único valor requerido es stop y el último valor generado
será justo el anterior a este. El valor por defecto de step es 1, pero se puede ir «hacia
detrás» con -1.
range() devuelve un objeto iterable, así que necesitamos obtener los valores paso a
paso con una sentencia for ... in 26. Veamos diferentes ejemplos de uso:
Rango: [0, 1, 2]
Rango: [1, 3, 5]
Rango: [2, 1, 0]
26
O convertir el objeto a una secuencia como una lista
70
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/vfywE45
71
72
Lo que está ocurriendo en este código es que, para cada valor que toma la variable i,
la otra variable j toma todos sus valores. Como resultado tenemos una combinación
completa de los valores en el rango especificado.
https://cutt.ly/vfyeWvj
Nota:
o Podemos añadir todos los niveles de anidamiento que queramos. Eso sí, hay
que tener en cuenta que cada nuevo nivel de anidamiento supone un
importante aumento de la complejidad ciclomática de nuestro código, lo que
se traduce en mayores tiempos de ejecución.
Ejercicio
Imprima los 100 primeros números de la sucesión
de Fibonacci:
Ampliar conocimientos
o The Python range() Function
73
Capítulo 5: Estructuras de datos
Si bien ya hemos visto una sección sobre Tipos de datos, podríamos hablar de tipos
de datos más complejos en Python que se constituyen en estructuras de datos. Si
pensamos en estos elementos como átomos, las estructuras de datos que vamos a ver
sería moléculas. Es decir, combinamos los tipos básicos de formas más complejas. De
hecho, esta distinción se hace en el Tutorial oficial de Python. Trataremos distintas
estructuras de datos como listas, tuplas, diccionarios y conjuntos.
1. Listas
Las listas son adecuadas para guardar elementos en un orden concreto. A diferencia,
por ejemplo, de las cadenas de texto, las listas son mutables. Podemos modificar,
añadir o borrar elementos de una lista. Cabe destacar que un mismo valor puede
aparecer más de una vez en una lista.
74
Nota: Una lista puede contener tipos de datos heterogéneos, lo que la hace una
estructura de datos muy versátil.
https://cutt.ly/Ofiiare
1.2 Conversión
Para convertir otros tipos de datos en una lista podemos usar la función list():
Lista vacía
Existe una manera particular de usar list() y es no pasarle ningún argumento. En este
caso estaremos queriendo convertir el vacío en una lista, con lo que obtendremos una
lista vacía:
75
1.3 Operaciones con listas
Obtener un elemento
Igual que en el caso de las cadenas de texto podemos extraer un elemento de una lista
especificando su índice. Veamos un ejemplo:
El índice que usemos para acceder a los elementos de una lista tiene que estar
comprendido entre los límites de la misma. Si usamos un índice antes del comienzo o
después del final obtendremos un error (excepción):
76
Hacer notar que el uso de índices inválidos en el troceado no genera una excepción.
Python trata de ajustarse al índice válido más próximo:
77
Modificando la lista original: Utilizando la función reverse() (nótese que es sin «d» al
final):
27
Cuando hablamos de que una función/método es «destructiva/o» significa que modifica la
lista (objeto) original, no que la destruye.
78
Nota: El índice que especificamos en la función insert() lo podemos interpretar como
la posición delante (a la izquierda) de la cual vamos a colocar el nuevo valor en la lista.
Repetir elementos
Al igual que con las cadenas de texto, el operador * nos permite repetir los elementos
de una lista:
79
Combinar listas
Python nos ofrece dos aproximaciones para combinar listas:
Hay que tener en cuenta que extend() funciona adecuadamente si pasamos una lista
como argumento. En otro caso, quizás los resultados no sean los esperados. Veamos
un ejemplo:
El motivo es que extend() «recorre» (o itera) sobre cada uno de los elementos del
objeto en cuestión. En el caso anterior, al ser una cadena de texto, está formada por
caracteres. De ahí el resultado que obtenemos.
Se podría pensar en el uso de append() para ampliar para combinar listas. La realidad
es que no funciona exactamente como esperamos; la segunda lista se añadiría como
una sublista de la principal:
80
Modificar una lista
Del mismo modo que se accede a un elemento utilizando su índice, también podemos
modificarlo:
Borrar elementos
Python nos ofrece, al menos, cuatro formas para borrar elementos en una lista:
81
Advertencia: Si existen valores duplicados, la función remove() sólo borrará la primera
ocurrencia.
Por su índice (con extracción):: Las dos funciones anteriores del() y remove() efectiva-
mente borran el elemento indicado de la lista, pero no «devuelven» 28 nada. Sin
embargo, Python nos ofrece la función pop() que además de borrar nos «recupera» el
elemento; algo así como una extracción*. Lo podemos ver como una combinación de
acceso + borrado:
Nota: Si usamos la función sin pasarle ningún argumento, por defecto usará el índice
-1, es decir, el último elemento de la lista. Pero también podemos indicarle el índice
del elemento a extraer.
28
Más adelante veremos el comportamiento de las funciones. Devolver o retornar un valor es
el resultado de aplicar una función
82
2. «Reinicializando» la lista a vacío con []:
Nota: La diferencia entre ambos métodos tiene que ver con cuestiones internas de
gestión de memoria y de rendimiento.
Encontrar un elemento
Para conocer el índice que tiene un determinado elemento dentro de una lista
podemos hacer uso de la función index():
Pertenencia de un elemento
La forma pitónica de comprobar la existencia de un elemento (valor) dentro de una
lista, es utilizar el operador in:
83
Nota: El operador in siempre devuelve un valor booleano, es decir, verdadero o falso.
Número de ocurrencias
Para contar cuántas veces aparece un determinado valor dentro de una lista podemos
usar la función count():
84
Hay que tener en cuenta que join() sólo funciona si todos sus elementos son cadenas
de texto:
Truco: Esta función join() es realmente la opuesta a la de split() para dividir una cadena.
Conservando lista original: Mediante la función sorted() que devuelve una nueva lista
ordenada:
85
Iterar sobre una lista
Al igual que hemos visto con las cadenas de texto, también podemos iterar sobre los
elementos de una lista a través de la sentencia for:
Nota: También es posible usar la sentencia break en este tipo de bucles para abortar
su ejecución en algún momento que nos interese.
https://cutt.ly/TfiuIZ0
86
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/lfioilG
Nota: En el caso de que las listas no tengan la misma longitud, la función zip() realiza
la combinación hasta que se agota la lista más corta.
Dado que zip() produce un iterador, si queremos obtener una lista explícita con la
combinación en paralelo de las listas, debemos construir dicha lista de la siguiente
manera:
87
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/pfi5PC5
Nota: A través de Python Tutor se puede ver claramente el motivo de por qué ocurre
esto. Dado que las variables «apuntan» a la misma zona de memoria, al modificar una
de ellas, el cambio también se ve reflejado en la otra.
Una posible solución a este problema es hacer una «copia dura». Para ello Python
proporciona la función copy():
https://cutt.ly/Dfi6oLk
https://cutt.ly/2fiS9Ax
88
1.6 Funciones matemáticas
Python nos ofrece, entre otras 29, estas tres funciones matemáticas básicas que se
pueden aplicar sobre listas.
Por ejemplo, si pensamos en la variable shopping que hemos estado usando y que
representa la lista de la compra, la podríamos dividir en sublistas, cada una de ellas
indicando los productos que vamos a comprar en las secciones del supermercado:
29
Existen multitud de paquetes científicos en Python para trabajar con listas o vectores
numéricos. Una de las más famosas es la librería Numpy.
89
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/dfi7e41
Ejercicio
Lea desde teclado una cadena de texto con números separados por comas. Sin utilizar
las funciones matemáticas, obtenga la media de dichos valores (muestre el resultado
con 2 decimales).
Ejemplo
o Entrada: '32,56,21,99,12,17'
o Salida: 37.50
Ampliar conocimientos
o Linked Lists in Python: An Introduction
90
2. Tuplas
Tuplas de un elemento
Hay que prestar especial atención cuando vamos a crear una tupla de un único
elemento. La intención primera sería hacerlo de la siguiente manera:
91
Realmente, hemos creado una variable de tipo str (cadena de texto). Para crear una
tupla de un elemento debemos añadir una coma al final:
92
2.3 Conversión
Para convertir otros tipos de datos en una tupla podemos usar la función tuple():
Esta conversión es válida para aquellos tipos de datos que sean iterables: cadenas de
caracteres, listas, diccionarios, conjuntos, etc. Un ejemplo que no funciona es intentar
convertir un número en una tupla:
El uso de la función tuple() sin argumentos equivale a crear una tupla vacía:
o reverse()
o append()
o extend()
o remove()
o clear()
o sort()
93
2.5 Desempaquetado de tuplas
El desempaquetado es una característica de las tuplas que nos permite asignar una
tupla a variables independientes:
Intercambio de valores
A través del desempaquetado de variables podemos llevar a cabo el intercambio de
los valores de dos variables de manera directa:
Nota: A priori puede parecer que esto es algo «natural», pero en la gran mayoría de
lenguajes de programación no es posible hacer este intercambio de forma «directa»
ya que necesitamos recurrir a una tercera variable «auxiliar» como almacén temporal
en el paso intermedio de traspaso de valores.
94
3. Diccionarios
o Son mutables con lo que admiten añadir, borrar y modificar sus elementos.
o Las claves deben ser únicas. A menudo se utilizan las cadenas de texto como
claves, pero en realidad podría ser cualquier tipo de datos inmutable: enteros,
flotantes, tuplas (entre otros).
30
Aunque históricamente Python no establecía que las claves de los diccionarios tuvieran que
mantener su orden de inserción, a partir de Python 3.7 este comportamiento cambió y se
garantizó el orden de inserción de las claves como parte oficial de la especificación del lenguaje
31
Véase este análisis de complejidad y rendimiento de distintas estructuras de datos en
CPython.
95
Figura 17: Analogía de un diccionario en Python
Nota: En otros lenguajes de programación, a los diccionarios se les conoce como arrays
asociativos, «hashes» o «hashmaps».
96
En el código anterior podemos observar la creación de un diccionario vacío, otro
donde sus claves y sus valores son cadenas de texto y otro donde las claves y los
valores son valores enteros.
https://cutt.ly/Sfav2Yw
3.2 Conversión
Para convertir otros tipos de datos en un diccionario podemos usar la función dict():
97
Usando get()
Existe una función muy útil para «superar» los posibles errores de acceso por claves
inexistentes. Se trata de get() y su comportamiento es el siguiente:
Línea 11: La clave buscada no existe y nos devuelve el valor que hemos aportado por
defecto.
32
None es la palabra reservada en Python para la «nada». Más información en esta web.
33
Realmente no estamos viendo nada en la consola de Python porque la representación en
cadena de texto es vacía.
98
Al contrario que en las listas, no hay que preocuparse por las excepciones (errores) por
fuera de rango durante la asignación de elementos a un diccionario:
99
Obtener todas las claves de un diccionario: Mediante la función keys():
Nota: Para este último caso cabe destacar que los «items» se devuelven como una lista
de tuplas, donde cada tupla tiene dos elementos: el primero representa la clave y el
segundo representa el valor.
Longitud de un diccionario
Podemos conocer el número de elementos («clave-valor») que tiene un diccionario
con la función len():
10
Iterar sobre un diccionario
En base a los elementos que podemos obtener, Python nos proporciona tres maneras
de iterar sobre un diccionario.
Nota: En este último caso, recuerde el uso de los «f-strings» para formatear cadenas
de texto.
Combinar diccionarios
Dados dos (o más) diccionarios, es posible «mezclarlos» para obtener una combinación
de los mismos. Esta combinación se basa en dos premisas:
34
En este caso «último» hace referencia al diccionario que se encuentra más a la derecha en la
expresión.
10
Python ofrece dos mecanismos para realizar esta combinación. Vamos a partir de los
siguientes diccionarios para ejemplificar su uso:
Nota: Tener en cuenta que el orden en el que especificamos los diccionarios a la hora
de su combinación (mezcla) es relevante en el resultado final. En este caso el orden de
los factores sí altera el producto.
Borrar elementos
Python nos ofrece, al menos, tres formas para borrar elementos en un diccionario:
10
Por su clave (con extracción): Mediante la función pop() podemos extraer un elemento
del diccionario por su clave. Vendría a ser una combinación de get() + del:
10
2. «Reinicializando» el diccionario a vacío con {}:
Nota: La diferencia entre ambos métodos tiene que ver con cuestiones internas de
gestión de memoria y de rendimiento.
Una posible solución a este problema es hacer una «copia dura». Para ello Python
proporciona la función copy():
10
3.5 Construyendo un diccionario
Una forma muy habitual de trabajar con diccionarios es empezar con uno vacío e ir
añadiendo elementos poco a poco. Supongamos un ejemplo en el que queremos
construir un diccionario donde las claves son las letras vocales y los valores son sus
posiciones:
Nota: Hemos utilizado la función enumerate() que ya vimos para las listas en el
apartado: Iterar usando enumeración.
10
Ejercicio
Usando un diccionario, cuente el número de veces que se repite cada letra en una
cadena de texto dada.
Ejemplo
Entrada: 'boom'
Ampliar conocimientos
o Using the Python defaultdict Type for Handling Missing Keys
o Dictionaries in Python
10
4. Conjuntos
Un conjunto en Python se representa por una serie de valores únicos y sin orden
establecido. Lo podríamos ver como un diccionario al que le hemos quitado los valores
y nos hemos quedado sólo con las claves. Mantiene muchas similitudes con el
concepto matemático de conjunto
10
La única opción que tenemos es utilizar la función set():
4.2 Conversión
Para convertir otros tipos de datos en un conjunto podemos usar la función set():
Nota: El hecho de que en los ejemplos anteriores los elementos de los conjuntos estén
ordenados es únicamente un «detalle de implementación» en el que no se puede
confiar.
10
De este hecho se deriva igualmente que no podemos modificar un elemento existente,
ya que no podemos acceder a él. Python sí nos permite añadir o borrar elementos de
un conjunto.
Añadir un elemento
Para añadir un elemento a un conjunto debemos utilizar la función add(). Como ya
hemos indicado, al no importar el orden dentro del conjunto, la inserción no establece
a priori la posición dónde se realizará.
https://tinyurl.com/9folv2v
Borrar elementos
Para borrar un elemento de un conjunto podemos utilizar la función remove().
Siguiendo con el ejemplo anterior vamos a borrar al último «beatle» añadido:
Longitud de un conjunto
Podemos conocer el número de elementos que tiene un conjunto con la función len():
10
Iterar sobre un conjunto
Tal y como hemos visto para otros tipos de datos iterables, la forma de recorrer los
elementos de un conjunto es utilizar la sentencia for:
Consejo: Como en el ejemplo anterior, es muy común utilizar una variable en singular
para recorrer un iterable (en plural). No es una regla fija ni sirve para todos los casos,
pero sí suele ser una buena práctica.
Pertenencia de elemento
Al igual que con otros tipos de datos, Python nos ofrece el operador in para determinar
si un elemento pertenece a un conjunto:
11
Intersección
𝐴𝐴 ∩ 𝐵𝐵 – Elementos que están a la vez en 𝐴𝐴 y en 𝐵𝐵:
Unión
𝐴𝐴 ∪ 𝐵𝐵 – Elementos que están tanto en 𝐴𝐴 como en 𝐵𝐵:
Diferencia
𝐴𝐴 − 𝐵𝐵 – Elementos que están en 𝐴𝐴 y no están en 𝐵𝐵:
Diferencia simétrica
𝐴𝐴 ∩ 𝐵𝐵 – Elementos que están en 𝐴𝐴 o en 𝐵𝐵 pero no en ambos conjuntos:
Ampliar conocimientos
o Sets in Python
11
5. Ficheros
11
Veamos un ejemplo para leer el contenido de un fichero en el que se encuentran las
temperaturas máximas y mínimas de cada día de la última semana. El fichero está en
la subcarpeta (ruta relativa) files/temps.dat y tiene el siguiente contenido:
La función open() recibe como primer argumento la ruta al fichero que queremos
manejar (como un «string») y devuelve el manejador del fichero, que en este caso lo
estamos asignando a una variable llamada f, pero le podríamos haber puesto cualquier
otro nombre.
Nota: Es importante dominar los conceptos de ruta relativa y ruta absoluta para el
trabajo con ficheros. Véase este artículo de DeNovatoANovato.
Hay que tener en cuenta que la ruta al fichero que abrimos (en modo lectura) debe
existir, ya que de lo contrario obtendremos un error:
Una vez abierto el fichero ya podemos proceder a leer su contenido. Para ello Python
nos ofrece la posibilidad de leer todo el fichero de una vez o bien leerlo línea a línea.
read() Devuelve todo el contenido del fichero como una cadena de texto (str):
11
readlines() Devuelve todo el contenido del fichero como una lista (list) donde cada
elemento es una línea:
Importante: Nótese que, en ambos casos, los saltos de línea \n siguen apareciendo en
los datos leídos, por lo que habría que «limpiar» estos caracteres. Para ello es posible
utilizar las funciones ya vistas de cadenas de texto.
Es por ello que Python nos ofrece varias aproximaciones a la lectura de ficheros línea
a línea. La más usada es iterar sobre el propio manejador del fichero:
11
Truco: Igual que pasaba anteriormente, la lectura línea por línea también incluye el
salto de línea \n lo que provoca un «doble espacio» entre cada una de las salidas.
Bastaría con aplicar line.split() para eliminarlo.
Nota: Si bien el fichero en sí mismo se crea al abrirlo en modo escritura, la ruta hasta
ese fichero no. Eso quiere decir que debemos asegurarnos de que las carpetas hasta
llegar a dicho fichero existen. En otro caso obtenemos un error de tipo
FileNotFoundError.
Ahora ya podemos hacer uso de la función write() para que enviar contenido al fichero
abierto. Supongamos que queremos volcar el contenido de una lista en dicho fichero.
En este caso partimos de los códigos IATA de aeropuertos de las Islas Canarias 35.
Nótese:
Línea 7 Cierre del fichero con la función close(). Especialmente en el caso de la escritura
de ficheros, se recomienda encarecidamente cerrar los ficheros para evitar pérdida de
datos.
35
Fuente: Smart Drone
11
Advertencia: Siempre que se abre un fichero en modo escritura utilizando el
argumento 'w', el fichero se inicializa, borrando cualquier contenido que pudiera tener.
En este caso el fichero more-data.txt se abrir en modo añadir con lo que las llamadas
a la función write() hará que aparezcan nuevo contenido al final del contenido ya
existente en dicho fichero.
Línea 1 Apertura del fichero en modo lectura utilizando el gestor de contexto definido
por la palabra reservada with.
Línea 2 Lectura del fichero línea a línea utilizando la iteración sobre el manejador del
fichero.
Línea 3 Limpieza de saltos de línea con strip() encadenando la función split() para
separar las dos temperaturas por el caracter espacio. Ver limpiar una cadena y dividir
una cadena.
11
Nota: Es una buena práctica usar with cuando se manejan ficheros. La ventaja es que
el fichero se cierra adecuadamente en cualquier circunstancia, incluso si se produce
cualquier tipo de error.
Hay que prestar atención a la hora de escribir valores numéricos en un fichero, ya que
el método write() por defecto espera ver un «string» como argumento:
Importante: Para evitar este tipo de errores, se debe convertir a str aquellos valores
que queramos usar con la función write() para escribir información en un fichero de
texto.
Ampliar conocimientos
o Reading and Writing Files in Python
11
Capítulo 6: Modularidad
La modularidad es la característica de un sistema que permite que sea estudiado, visto
o entendido como la unión de varias partes que interactúan entre sí y que trabajan
solidariamente para alcanzar un objetivo común, realizando cada una de ellas una
tarea necesaria para la consecución de dicho objetivo.
Cada una de esas partes en que se encuentre dividido el sistema recibe el nombre de
módulo. Ideal- mente un módulo debe poder cumplir las condiciones de caja negra,
es decir, ser independiente del resto de los módulos y comunicarse con ellos (con
todos o sólo con una parte) a través de entradas y salidas bien definidas. 36
En este capítulo veremos las facilidades que nos proporciona Python para trabajar en
la línea de modularidad del código.
1. Funciones
Hasta ahora todo lo que hemos hecho han sido breves fragmentos de código Python.
Esto puede ser razonable para pequeñas tareas, pero nadie quiere reescribir los
fragmentos de código cada vez. Necesitamos una manera de organizar nuestro código
en piezas manejables.
36
Definición de modularidad en Wikipedia
11
El primer paso para la reutilización de código es la función. Se trata de un trozo de
código con nombre y separado del resto. Puede tomar cualquier número y tipo de
parámetros y devolver cualquier número y tipo de resultados.
Advertencia: Prestar especial atención a los dos puntos : porque suelen olvidarse en la
definición de la función.
o Los nombres de las funciones siguen las mismas reglas que las variables.
11
Como era de esperar, al invocar a la función obtenemos un mensaje por pantalla, fruto
de la ejecución del cuerpo de la función.
Retornar un valor
Las funciones pueden retornar (o «devolver») un valor. Veamos un ejemplo muy
sencillo:
En aquellos casos en los que una función no tenga un return explícito, siempre
devolverá None.
12
1.2 Parámetros y argumentos
Vamos a empezar a crear funciones que reciben parámetros. En este caso escribiremos
una función echo() que recibe el parámetro anything y muestra esa variable dos veces
separada por un espacio:
Cuando llamamos a una función con argumentos, los valores de estos argumentos se
copian en los correspondientes parámetros dentro de la función:
Truco: La sentencia pass permite «no hacer nada». Es una especie de «placeholder».
37
Término para identificar el «algoritmo» o secuencia de instrucciones derivadas del
procesamiento que corresponda.
12
Argumentos posicionales
Los argumentos posicionales son aquellos argumentos que se copian en sus
correspondientes parámetros en orden. Vamos a mostrar un ejemplo definiendo una
función que construye y devuelve un diccionario a partir de los argumentos recibidos:
Argumento Parámetro
Flor de chasna wine
Garbanzas entree
Quesillo dessert
Nota: Una clara desventaja del uso de argumentos posicionales es que se necesita
recordar el significado de cada posición.
12
Argumentos por nombre
Para evitar la confusión que pueden producir los argumentos posicionales, es posible
especificar argumentos usando el nombre de los correspondientes parámetros, incluso
en un orden distinto a cómo están definidos en la función:
Nota: Si se llama a una función mezclando argumentos posicionales y por nombre, los
argumentos posicionales deben ir primero.
12
Importante: Los valores por defecto en los parámetros se calculan cuando se define la
función, no cuando se ejecuta.
1.3 Documentación
Ya hemos visto que en Python podemos incluir comentarios para explicar mejor
determinadas zonas de nuestro código.
Explicación de parámetros
Como ya se ha visto es posible documentar una función utilizando un docstring. Pero
la redacción y el formato de esta cadena de texto puede ser muy variada. Existen
12
distintas formas de documentar una función (u otros objetos) 38 pero vamos a
centrarnos en el modelo NumPy/SciPy.
Veamos un ejemplo:
38
Véase Docstring Formats
12
1.4 Espacios de nombres
Un nombre puede hacer referencia a múltiples cosas, dependiendo de dónde lo
estemos usando. Los programas en Python tienen diferentes espacios de nombres,
secciones donde un nombre particular es único e independiente del mismo nombre
en otros espacios de nombres.
En el siguiente ejemplo se define una variable global (primer nivel) y luego mostramos
su valor directamente y mediante una función:
https://cutt.ly/3fMI8de
Sin embargo, si creamos una variable dentro de la función que también tenga el
nombre animal, realmente estaremos creando una nueva variable distinta de la global:
https://cutt.ly/ifMOeYf
12
Ejercicio
Primera parte
Escriba una función factorial que reciba un único parámetro n y devuelva su factorial.
�! = � · (� − 1) · (� − 2) · . . . · 1
Ejemplo
o Entrada: 5
o Salida: 120
Ampliar conocimientos
o Defining Your Own Python Function
12
2. Módulos
Es una certeza que, antes o después, usaremos código Python en más de un fichero.
Un módulo es simplemente un fichero con código Python. No se necesita hacer nada
especial. Cualquier código Python se puede usar como un módulo en código de
terceros.
arith.py
12
Desde otro fichero - en principio en la misma carpeta - podríamos hacer uso de las
funciones definidas en arith.py.
12
Nota: Nótese que en la línea 3 ya podemos hacer uso directamente de la función
partitus() porque la hemos importado directamente. Este esquema tiene el
inconveniente de la posible colisión de nombres, en aquellos casos en los que
tuviéramos algún objeto con el mismo nombre que el objeto que estamos importando.
2.2 Paquetes
Un paquete es simplemente una carpeta que contiene ficheros .py. Además, permite
tener una jerarquía con más de un nivel de subcarpetas anidadas.
logic.py
13
Línea 2 Punto de entrada de nuestro programa a partir del fichero main.py
Consejo: Suele ser una buena práctica llamar main.py al fichero que contiene nuestro
programa principal.
13
Importante: Si queremos ejecutar este fichero main.py desde línea de comandos,
tendríamos que hacer:
13
o Línea 9: esta condición no se cumple, ya que estamos importando y la variable
especial name no toma ese valor. Con lo cual finaliza la ejecución.
o Línea 11: llamada a la función myfunc() que muestra por pantalla Inside myfunc,
además de invocar a la función hi() del módulo blabla.
Ampliar conocimientos
o Defining Main Functions in Python
13
Contenidos creados por:
Maquetado por:
13