Python 2018
Python 2018
net/publication/325387232
CITATIONS READS
0 9,350
1 author:
Pedro Gomis
Universitat Politècnica de Catalunya
100 PUBLICATIONS 401 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Pedro Gomis on 26 May 2018.
Pedro Gomis-Roman
Fundamentos de Programación en Python
2018
Presentación.................................................................................................................................. 1
Tema 1. Introducción. Visión general del mundo de la informática. ............................................ 3
1.1. Computadores: Aspectos históricos.............................................................................. 3
1.2. Computadores. Estructura funcional. ........................................................................... 6
1.3. Codificación de información en computadores ............................................................ 7
1.3.1. Sistema de numeración decimal ........................................................................... 7
1.3.2. Sistema de numeración binario. ........................................................................... 8
1.3.3. Sistemas de numeración de potencias de 2: octal y hexadecimal. ....................... 9
1.3.4. Representación de texto. .................................................................................... 10
1.4. Algoritmos, programas y lenguajes. ............................................................................ 11
1.4.1. Lenguajes compilados e interpretados ............................................................... 12
1.4.2. Lenguaje Python .................................................................................................. 13
1.4.3. Ejemplos clásicos de algoritmos .......................................................................... 15
Tema 2. Tipos de datos simples, expresiones y operaciones elementales ................................. 17
2.1. Tipos de datos .................................................................................................................. 17
2.1.1. Datos simples ............................................................................................................ 18
2.1.2. Datos compuestos o estructurados .......................................................................... 20
2.2. Variables y acción de asignación ...................................................................................... 22
2.3 Expresiones y sentencias. .................................................................................................. 25
2.4. Operadores....................................................................................................................... 26
2.4.1. Operadores aritméticos ............................................................................................ 26
2.4.2. Operadores lógicos.................................................................................................... 27
2.4.3. Operadores relacionales (comparison) ..................................................................... 29
2.4.4. Orden de las operaciones.......................................................................................... 30
2.5. Acciones elementales ....................................................................................................... 31
2.5.1. Lectura de datos ........................................................................................................ 32
2.5.2. Conversión entre tipos de datos ............................................................................... 32
2.5.3. Escritura de datos ...................................................................................................... 33
2.5.4. Comentarios .............................................................................................................. 34
2.6 Tipos de errores (bugs) ..................................................................................................... 35
Ejercicios.................................................................................................................................. 36
Tema 3: Estructuras (Composiciones) Algorítmicas .................................................................... 39
3.1. Estructura secuencial ....................................................................................................... 39
3.2. Estructuras alternativas.................................................................................................... 42
3.2.1. Estructura alternativa simple o condicional .............................................................. 42
3.2.2. Estructura alternativa doble (if-else) ........................................................................ 43
3.2.3. Estructura alternativa múltiple o anidada ................................................................ 44
3.3. Estructuras iterativas........................................................................................................ 46
3.3.1. Secuencia de datos .................................................................................................... 46
3.3.2. Esquemas iterativos .................................................................................................. 46
3.3.3. Estructura iterativa while (mientras) ...................................................................... 47
3.3.4. Estructura iterativa for (desde – hasta, para - en) .................................................. 51
3.3.5. Bucles para efectuar sumatorias ............................................................................... 54
Ejercicios.................................................................................................................................. 56
Tema 4. Programación modular. Funciones, procedimientos y parámetros .............................. 58
4.1. Uso de funciones. Funciones internas y de módulos. ...................................................... 59
4.2. Funciones y procedimientos ............................................................................................ 61
4.3. Diseño de funciones ......................................................................................................... 62
4.3.1. Variables locales y globales ...................................................................................... 63
4.3.2. Paso de parámetros entre el programa y las funciones............................................ 64
4.3.3. Funciones productivas y funciones nulas (procedimientos) ................................ 65
4.3.4. Valores de argumentos por omisión (default) .......................................................... 65
4.3.5. Argumentos de palabra clave (keyword arguments) ................................................ 66
4.3.6. Consideraciones prácticas: uso de programa principal o no .................................... 66
4.3.7 Uso de DOCTEST para probar funciones .................................................................... 67
4.4 Recursividad ...................................................................................................................... 69
4.5 Módulos: integrar funciones en una biblioteca ................................................................ 72
Ejercicios.................................................................................................................................. 74
Tema 5. Tipos de datos estructurados: homogéneos y heterogéneos, dinámicos y estáticos .. 78
5.1. Datos estructurados inmutables (estáticos) .................................................................... 78
5.1.1. Cadena de caracteres (string) ................................................................................... 79
5.1.2. Tuplas ........................................................................................................................ 83
5.1.3. Conjuntos congelados (Frozenset) ............................................................................ 88
5.2. Tipos de datos estructurados mutables (dinámicos) ....................................................... 89
5.2.1. Listas .......................................................................................................................... 89
5.2.2. Comprensiones de listas (list comprenhensions) ...................................................... 97
5.2.3. Copia de listas: superficial y profunda ...................................................................... 99
5.2.4. Vectores y matrices con NumPy.............................................................................. 101
5.2.5. Conjuntos (Set) ........................................................................................................ 104
5.2.6. Diccionarios ............................................................................................................. 104
5.3 Funciones nulas (procedimientos) y paso de parámetros por referencia. ..................... 108
5.4. Ficheros (files) ................................................................................................................ 109
Ejercicios................................................................................................................................ 115
Anexo A ..................................................................................................................................... 122
Glosario ..................................................................................................................................... 125
Bibliografía ................................................................................................................................ 130
Referencias bibliográficas ..................................................................................................... 130
Bibliografía recomendada ..................................................................................................... 131
Programación en Python Introducción
Presentación
¿Qué lenguaje de programación se usará como vehículo para aprender programación en este
texto? Nuestra primera experiencia en el uso de programas informáticos en Ingeniería a
comienzos de los años 70’ del siglo pasado fue con FORTRAN (FORmula TRANslation), lenguaje
desarrollado por IBM y de amplio uso en los comienzos de la era de los computadores digitales
en la solución de problemas de cálculo en ingeniería. Luego, muchas Escuelas de Ingeniería
utilizaron el lenguaje C (o C++) por su buena compatibilidad con las instrucciones próximas al
manejo del microprocesador. Otras Escuelas han usado como lenguajes de introducción a la
programación el Java, que es un lenguaje apreciado por estar orientado a objetos y de amplio
uso en programar applets (pequeñas aplicaciones que se ejecutan en navegadores web), o el
Pascal por su facilidad en el aprendizaje a programar. Siguiendo la idea del Pascal y que la
prioridad cuando se inician estudios de Ingeniería es el aprendizaje de los procesos de la
programación más que especializarse en el lenguaje, muchos cursos de informática o
introducción a la programación han usado un lenguaje algorítmico (genérico) o pseudocódigo
que permita luego su traducción al lenguaje en que se implementará en el computador.
Desde hace varios años, sin embargo, muchas Escuelas o Facultades de ingeniería alrededor
del mundo han introducido el lenguaje Python para enseñar a programar. Python será el
lenguaje utilizado en este texto por ser un lenguaje de alto nivel que simplifica la sintaxis para
escribir programas a partir de unas instrucciones en lenguaje natural o en pseudocódigo.
Python es un lenguaje muy eficiente y ayuda el proceso de aprendizaje de programación por
su claridad en escribir las estructuras algorítmicas, por disponer de una gran cantidad de
módulos o librerías de funciones y porque se programa en un entorno amigable. Así que
podemos enfocarnos en aprender a programar sin perdernos tanto en la sintaxis del lenguaje.
1
Programación en Python Introducción
Este material didáctico y el resto de recursos de aprendizaje disponibles servirán para que el
alumno logre los resultados de aprendizaje previstos:
FUNDAMENTOS DE PROGRAMACIÓN
Computadores: Aspectos históricos y
estructura funcional
VISIÓN GENERAL DEL MUNDO DE LA
Codificación de información
INFORMÁTICA
Algoritmos, programas y lenguajes
Tipos de datos
DATOS SIMPLES, EXPRESIONES Y
Variables y asignaciones
OPERACIONES
Expresiones , sentencias y operadores
Estructura secuencial
ESTRUCTURAS ALGORÍTMICAS Estructuras alternativas
Estructuras iterativas
Ficheros (files)
2
Programación en Python Introducción
La informática es el área del conocimiento que estudia todo lo que hace referencia a la
obtención y procesado de información por medios automatizados, a partir de unos datos
determinados. El origen del término proviene del francés informatique o información
automática, es decir procesado automático de la información por medio de computadoras. En
España, principalmente, se ha utilizado el nombre de informática aunque en América se utiliza
el término computación. En lengua inglesa prevalecen los términos computing, computation y
computer science. Según la Real Academia Española (2014), informática es el “Conjunto de
conocimientos científicos y técnicas que hacen posible el tratamiento automático de la
información por medio de computadoras”1. De forma equivalente, en inglés, computer science
se encarga del estudio de los procesos de información.
Aunque las computadoras analógicas fueron utilizadas el siglo pasado para realizar cálculos
matemáticos con bastante éxito, desde mediados de siglo se impuso el uso de tecnología
digital en el diseño de computadores. Los términos computador o computadora (del latín:
computare, calcular) popularmente usados son válidos ambos, según la Real Academia de la
Lengua (2014). En España desde los años 1960 se difundió más el nombre de ordenador,
probablemente influenciado del francés ordenatour (del latín: ordinator), aunque actualmente
se usan de manera equivalente ‘ordenador’ o ‘computador’.
Desde sus orígenes, el ser humano desarrolló herramientas para aumentar su fuerza física
(palancas, mecanismos, ruedas, etc.) y también aumentar sus habilidades intelectuales. El
lenguaje como forma de comunicación y la escritura para trasmitir en el tiempo y distancia la
información fueron las primeras formas de mejorar sus habilidades intelectuales. Luego, el
cálculo para construir edificaciones, evaluar los movimientos de los cuerpos celestes, etc., fue
un nuevo hito en el desarrollo del ser humano. Así, el hombre buscó herramientas que puedan
incrementar su poder de cálculo. Por ejemplo, en orden cronológico:
El ábaco, que se estima apareció sobre el 2400 A.C. en Babilonia, fue usado por
muchas civilizaciones (India, China, Egipto, Grecia) para realizar cálculos aritméticos. El
nombre actual proviene del griego abax: tabla o rectángulo.
Wilhelm Schickard en el siglo XVII construye la primera máquina de calcular (con
imperfecciones) basada en engranajes de relojería. Blaise Pascal, matemático francés,
construye a los pocos años una segunda máquina mecánica capaz de sumar, restar y
hacer cálculos aritméticos. Se le llamó “máquina aritmética” o “pascalina” y es
considerada un antepasado de los computadores analógicos.
En 1671 Gottfried Wilhelm Leibniz (von) Leibniz, matemático alemán, extendió las
ideas de Pascal y desarrolló una máquina (Stepped Reckoner o máquina de Leibniz) que
incorpora la posibilidad de multiplicar, dividir y sacar raíz cuadrada. Leibniz también
1
Informática (2014). En Real Academia Española, Diccionario de la lengua española (23ª ed.).
Recuperado de: http://dle.rae.es/?id=LY8zQy3
3
Programación en Python Introducción
Alan Turing (1912 – 1954), matemático inglés (figura 1), fue quizás el primer teórico de la
informática y propuso formalismos científicos a los procesos algorítmicos. En 1936 Turing
desarrolló un hipotético computador (un modelo matemático) que contenía una memoria
ilimitada sobre una cinta y un conjunto de pocas instrucciones para grabar y leer ceros y unos
sobre la cinta y moverse sobre ella. La tesis de Turing afirma que si una función es calculable, la
máquina de Turing puede programarse para hacerlo. Alan Turing sentó las bases de los
computadores de propósitos generales, con programas almacenados, en una publicación en
1936. En 1945 Turing trabajó en el desarrollo de un computador digital con programas
almacenados usando tecnología electrónica, publicando ese año sus resultados.
4
Programación en Python Introducción
Figura 1. Memorial a Alan Turing, Sackville Park, Manchester, Inglaterra. Fuente: elaboración propia.
Memoria
Salida Entrada
5
Programación en Python Introducción
La informática se encarga de los procesos de información y las máquinas electrónicas que hoy
en día se encargan de estos procesos son los computadores digitales (ordenadores)2. Cuando
un computador realiza los diferentes pasos de un trabajo dado, se dice que está realizando un
proceso. Los procesos informáticos comprenden básicamente de tres fases: (i) la entrada de
datos, (ii) el procesado donde se tratan los datos mediante una secuencia de acciones
preestablecidas por determinado programa, y (iii) la salida de datos.
1 Acepta entradas. Las entradas pueden ser introducidas por un humano a través de un
teclado, pueden ser recibidas de una red, o ser proporcionadas de forma automática por
medio de sensores conectados a la computadora.
2 Ejecuta un procedimiento automático, es decir, un procedimiento en el que cada paso
puede ser ejecutado sin ninguna acción manual de un humano.
3 Produce salidas. Las salidas pueden ser datos que se muestran a una persona, pero
también podría ser cualquier cosa que afecta al mundo fuera del ordenador, tales como
señales eléctricas que controlan el funcionamiento de un dispositivo.
2
Usaremos indistintamente los nombres “computador” u “ordenador”
3
Memoria no volátil (permanente) de electrónica de estado sólido, basada en tecnología de compuertas
NOR o NAND.
6
Programación en Python Introducción
Todo tipo de información que se quiera procesar en una computadora al final es representada
de forma numérica para luego ser codificada en forma binaria usando bits como unidad básica.
La forma numérica conocida de números naturales, enteros, reales y complejos, así como el
texto de cualquier lenguaje (castellano, inglés, etc.) se representa finalmente en formato
binario para ser procesada por el CPU del computador. Resumimos a continuación los tipos
más usados de representación numérica y caracteres alfabéticos y otros signos de puntuación.
El sistema universal de representación numérica es el decimal, de base 10, que utiliza los
números indio-arábigos introducidos a Europa de la India a través de la región persa y del
actual mundo árabe, y probablemente influenciados por un sistema en base 10 de China. Se
considera al matemático persa Al-Khwarizmi o Al-Juarismi el primero en utilizar la numeración
india decimal para los métodos de cálculo, en sus publicaciones del siglo IX, como el famoso
tratado de álgebra.
Base 10
Conjunto de símbolos: {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9}
El número real 1428,35, su valor es: 1·103 + 4·102 + 2·101 + 8·100 + 3·10-1 + 5·10-2 = 1428,35
N(b= an·bn + an-1·bn-1 + ... + a1·b1 + a0·b0 + a-1·b-1+ ... + a-m·b-m (1)
Los números enteros, es decir, los números naturales más sus negativos y el cero son valores
discretos y se pueden ordenar. Sin embargo los valores continuos, como los números reales,
en general no se pueden representar con exactitud y solo se pueden aproximar en las
computadoras digitales. Aunque si se incrementa suficientemente el número de bits para
representarlos, la aproximación es tan buena como se quiera. La codificación de los reales
sigue unos estándares en los diversos lenguajes que serán comentados en otra sección.
7
Programación en Python Introducción
Base: 2
Conjunto de símbolos: {0, 1}
Ejemplo: El número 11011 en base 2 (binaria) tiene el valor 27 en base decimal, donde el
primer “1” es bit más significativo, y el último el menos significativo
Número: 11011)2
Valor en base 10: 1·24 + 1·23 + 0·22 +1·21 + 1·20 = 16 + 8 + 2 + 1= 27)10
Número: 110,01)2
Valor en base 10: 1·22 + 1·21 + 0·20 + 0·2-1 + 1·2-2 = 4 + 2 + 0,25 = 6,25)10
La conversión de base decimal a binaria se realiza del siguiente modo. Se divide el número N
entre 2 y el cociente se vuelve dividir entre 2 y así sucesivamente. El último cociente y los
restos forman el número binario. Ejemplo:
8
Programación en Python Introducción
denominan byte4. Con un byte podemos representar 256 números diferentes (28), usualmente
los números naturales en el rango [0, 255]. Por ejemplo, el byte 10010111 representa el
número decimal 151:
Binario 1 0 0 1 0 1 1 1
Peso 27 26 25 24 23 22 21 20
Decimal 128 16 4 2 1 Suma = 151
Base: 8
Ejemplo: El número 325 en base 8 (325)8) equivale a 213 en base 10. En base 2 se puede
expresar cada dígito en formato binario. El 3 equivale a 011, 2 equivale a 010 y 5 a 101, así
queda 011010101 en base 2. Su valor en base 10 corresponde al 213:
Base: 16
donde A tiene un peso de 10, B uno de 11, hasta F que tiene un peso de 15.
Ejemplo: El número 35A)16 equivale en decimal al 858. Fácilmente se puede convertir a formato
binario remplazando cada dígito hexadecimal por los 4 bits equivalentes del conjunto de
símbolos (ver tabla 1).
4
El vocablo inglés byte es aceptado por la Real Academia de la Lengua (RAE). El término octeto para
palabras de 8 bits también fue usado en España en el comienzo de la era de la informática.
9
Programación en Python Introducción
En el anexo A se muestra la tabla de caracteres ASCII y una extensión ASCII que utiliza un bit
adicional para definir 128 caracteres adicionales y así poder representar otros signos como,
por ejemplo, vocales acentuadas, la ñ, ç, etc. La 'é' se representa por el binario 10000010,
equivalente al decimal 130 (hexadecimal 82). IBM desarrolló a principio de los años 1980 este
código extendido a 8 bits (se llamó código de página 347) y lo incorporó en los primeros
sistemas operativos de los computadores personales (PC, del inglés personal computer) de la
época; el PC-DOS y MS-DOS (ver Anexo A, tabla A.2). Actualmente en los sistemas operativos
Windows aún se puede generar estos caracteres extendidos. Sobre cualquier editor de texto
mantenga pulsada la tecla ALT y simultáneamente tecleé un número del teclado numérico5
(keypad). Por ejemplo ALT + 164 escribe la ñ o ALT+241 escribe el símbolo matemático ±. Pero
hay que resaltar también que existen muchas otras variantes de código de página ASCII
5
Nuestra experiencia con los primeros computadores personales que llegaban a Latinoamérica a finales
de los años 1980 o escribiendo en español en un país de habla inglesa, teníamos los teclados con la
configuración en inglés. Las vocales acentuadas y la ñ era normal crearlas de esta manera. Por ejemplo,
á con ALT+160.
10
Programación en Python Introducción
extendida como el ISO-8859-1 (Latin1), ISO-8859-15 (Latin9), Windows-1252 etc. La tabla A.3
del anexo A presenta los caracteres de la tabla ISO-8859-1 (Latin1), que está definida a partir
del decimal 160, y del formato Windows-1252, que coincide con la anterior pero define los
caracteres del decimal 128 al 159. Para escribir estos caracteres sobre un editor de texto se
mantiene pulsada la tecla ALT y simultáneamente el número decimal del teclado numérico
pero con 0 delante. Por ejemplo, ALT + 0128 escribe € y ALT + 0241 escribe la ñ.
Aun así, con 8 bits, la codificación de las tablas ASCII y ASCII extendida no es suficiente para
representar la gran cantidad de caracteres y símbolos de todos los alfabetos del mundo. Con el
uso extendido de internet y el diseño de páginas webs se han desarrollado formatos de
codificación de caracteres más universales como el Unicode6, estándar de codificación de
caracteres para múltiples lenguas, así como el UTF-8 (8-bit Unicode Transformation Format) o
el UTF-16.
Adicionalmente, información más compleja que se procesa en una computadora, como por
ejemplo imágenes, grabaciones de audio y video, se codifica también con secuencias de bits,
en distintos formatos. Por ejemplo, imágenes en formatos BMP, JPEG, GIF, TIFF, PNG o DICOM
en imágenes médicas; audio en WAV, MP3, OGG; video en AVI, MOV, MP4, WMV, FLV.
6
http://unicode-table.com/es/ https://en.wikipedia.org/wiki/List_of_Unicode_characters
11
Programación en Python Introducción
Los sistemas operativos (OS, del inglés operating systems) de las computadoras, tablets, o
teléfonos móviles inteligentes (smartphones) son también programas más complejos que
sirven para relacionar la CPU (el µP) con otros programas y el usuario. Están diseñados sobre
los µP de los dispositivos, utilizando sus respectivos lenguajes ensambladores. De esta forma,
el usuario puede desconocer qué tipo de µP tiene su PC o teléfono móvil, sin embargo
interacciona en un ambiente de trabajo igual al trabajar sobre el sistema operativo Windows,
OS X de Mac o Linux en su PC o el sistema operativo Android o iOS en su teléfono móvil o
celular inteligente.
Los lenguajes de programación de alto nivel son, entonces, los que están más cercanos al
lenguaje natural de un humano y para éste no depende en la práctica sobre qué máquina u OS
está trabajando. Por ejemplo, el Python, MATLAB, C++, Java son lenguajes de alto nivel.
Así como los lenguajes naturales (español, inglés, etc.), los lenguajes de alto nivel tienen su
vocabulario, sintaxis y semántica. El vocabulario será todos los elementos propios del lenguaje
como los signos de operaciones aritméticas, lógicas y de relaciones, las palabras propias del
lenguaje para definir estructuras algorítmicas como el if, for, while, etc.
La sintaxis define la forma como se pueden combinar los elementos del lenguaje. Por ejemplo,
x = 3 + 2 es una sintaxis correcta, pero x = 3 2 + no lo es. La semántica se refiere a que
expresiones sintácticamente correctas tengan un resultado correcto. Por ejemplo, x = 7/5 es
correcto sintáctica y semánticamente pero en x = 7/’hola’ aunque la sintaxis permita asignar a
x el resultado de una división, semánticamente sería incorrecto dividir números entre texto. O,
por ejemplo, calcular area = base/altura; el programa calcula un valor que se asigna a
la variable area pero lo que ha calculado es incorrecto pues tendría que haberse multiplicado
base*altura. También una semántica correcta incluye que el programa no se cuelgue
(quede en un bucle infinito) o no dé errores lógicos o de ejecución. Este último sería, por
ejemplo, dividir entre una variable que el programa le asigne el valor 0.
Los programas que escribimos en lenguaje de alto nivel se hacen en un editor de texto y se
llaman código fuente. Al ejecutar nuestro código (corremos el programa, run the program),
dependiendo del tipo de lenguaje, se traducen a lenguaje de máquina mediante dos formas
diferentes: a través de un compilador o de un intérprete.
12
Programación en Python Introducción
Un intérprete, sin embargo, es un programa que lee una a una las instrucciones (sentencias)
del código fuente y las traducen a las apropiadas del lenguaje de máquina. Va traduciendo y
ejecutando las sentencias del programa a medida que las encuentra. Esto los hace más
flexibles y fáciles de depurar pero se pierde velocidad respecto a los programas compilados.
Entre los lenguajes de programación interpretados destacan el Python, Matlab y Ruby.
7
El nombre de Python está influenciado por la comedia británica de la pandilla de amigos de Monty
Python, y parece que el uso de IDLE en lugar de las siglas IDE se debe al personaje Eric Idle.
13
Programación en Python Introducción
Figura 3. Imagen del Shell de Python y cálculo de expresiones aritméticas con el intérprete
El símbolo >>> es el llamado prompt (en español entrada o apunte, aunque en informática se
prefiere el nombre inglés) de Python.
Figura 4. Imagen del editor de Python con ejemplo de código fuente del programa areaTriang.py
Figura 5. Imagen del Shell de Python mostrando resultado del programa areaTriang.py
14
Programación en Python Introducción
La función print de Python escribe el resultado en el Shell del lenguaje de programación (ver
figura 5), no se debe confundir con la acción Print Windows de la pestaña File que envía
todo el contenido a la impresora. Como se muestra en la figura 6, el programa áreaTriang.py
sería más eficiente si puede generalizarse para calcular el área de cualquier triángulo
rectángulo. La función input permite leer del Shell un dato del teclado, que será en formato
texto, luego la función int convierte este dato de texto a número entero.
Figura 6. Imagen del editor de Python del programa areaTriang.py modificado pidiendo datos de entrada
El Python Shell muestra el mensaje de texto de la función input y espera que el usuario
introduzca el número, en este caso 3, que al ser introducido del teclado se interpreta como un
carácter ASCII. La función int lo convierte a un número tipo entero (ver figura 7).
Figura 7. Imagen del Shell de Python mostrando resultado del programa areaTriang.py
Entre los primeros métodos para resolver problemas con una secuencia de instrucciones y
toma de decisiones lógicas para repetir los cálculos de forma iterativa o de bucles se encuentra
el algoritmo de Euclides para hallar el máximo común divisor de 2 números naturales y la
aproximación a la raíz cuadrada de cualquier número real.
El método propuesto por Euclides (siglo III a.C.) para hallar el máximo común divisor (MCD) de
dos números naturales, conocido como algoritmo de Euclides, propone que “dados 2 números
naturales, a y b, comprobar primero si son iguales. Si lo son entonces a es el MCD. Si no son
iguales, entonces probar si a es mayor que b y si lo es restar a a el valor de b, pero si a es
menor que b, entonces restar a b el valor de a. Repetir el procedimiento con los nuevos
valores de a y b”. En los próximos temas realizaremos un programa en Python para este
cálculo y una versión recursiva más eficiente.
15
Programación en Python Introducción
número y que satisface y2 = x. Isaac Newton (siglo XVII) propuso posteriormente un método
general para hallar las raíces de una función no lineal, f(x) = 0.
Estos algoritmos clásicos los realizaremos en lenguaje de programación Python al introducir las
estructuras algorítmicas condicionales y alternativas.
16
Programación en Python Tipos de datos, expresiones, operaciones
En este tema presentaremos algunos conceptos y elementos básicos usados en los lenguajes
de programación en general, aunque se especificarán las características particulares del
lenguaje Python. Trataremos los siguientes conceptos: tipos de datos simples y compuestos,
variables, identificadores, acciones elementales como asignaciones (o referencias a objetos en
Python) y lectura y escritura a través de funciones internas básicas de los lenguajes.
Entero, int
Real, float
Simple
Booleano, bool
Tipos Carácter, char *
de
datos **
tablas, arrays, string
**
estructura, record
Compuesto Py
Tupla, string
(estático, inmutable)
Py
Lista, diccionario, set
(dinámico, mutable)
Figura 8. Tipos de datos. *El tipo de dato carácter no existe en Python, un carácter simple se
representa como cadena de caracteres (string). ** Estructuras compuestas de lenguajes como
C, FORTRAN, Pascal, Matlab, etc. Py: Estructuras compuestas en Python. Fuente: elaboración
propia.
17
Programación en Python Tipos de datos, expresiones, operaciones
Los datos elementales son los datos simples, llamados también escalares por ser objetos
indivisibles. Los datos simples se caracterizan por tener asociado un solo valor y son de tipo
entero, real o de coma/punto flotante (float), booleano y carácter. En Python no existe el tipo
de dato simple carácter. Aunque el dato conste de solo una letra o carácter ASCII se representa
como un dato compuesto de cadena de caracteres (string).
Enteros
En matemáticas los números enteros (integer) son los números naturales, sus negativos y el
cero. Ejemplos de enteros: 5, -20, 0, -104. Los números con parte decimal no se incluyen entre
los enteros, como el 3.4. Los enteros, en la mayoría de lenguajes de programación incluyendo
Python, se definen con la palabra int. Python dispone de una función interna type que
devuelve el tipo de dato dado:
>>> type(7)
<class 'int'>
>>> a = 45
>>> type(a)
<class 'int'>
En C++ o Pascal se usan 4 bytes (32 bits y se reserva un bit para el signo, signed 32-bit) para
enteros estándar (int, integer), representándose en el rango de números:
–2147483648 … 2147483647
Para mayor rango en estos lenguajes se utilizan 8 bytes (signed 64-bit), declarándolos como
long o int64:
–263 … 263–1
A diferencia del C++ o Pascal, en Python los datos de tipo entero se almacenan con “precisión
arbitraria”, es decir se utiliza el número de bytes necesarios para representar el número
entero. Por ejemplo, los números 5 (binario: 101) y 200 (27+26+23, binario: 11001000) se
representan:
>>> bin(5)
'0b101'
>>> bin(200)
'0b11001000'
La función interna de Python bin(N) convierte un número entero a string con el binario
equivalente (0b+binario). Para comprobar el amplio rango de valores en Python, probemos un
valor mayor que 263, como 2220:
>>> 2**220
1684996666696914987166688442938726917102321526408785780068975640576
18
Programación en Python Tipos de datos, expresiones, operaciones
Reales
A diferencia de los enteros que son valores discretos de un número natural a otro, los números
de valores continuos del conjunto de los números reales en Matemáticas son los llamados
reales o de coma/punto flotante8, o simplemente float. No todos los números reales se
pueden representar de forma exacta en informática, debido a que muchos tienen infinitas
cifras decimales. Sin embargo, de acuerdo al nivel de precisión que deseamos se pueden
aproximar lo suficientemente bien estos números. Desde hace varias décadas se ha convenido
el uso de la norma IEEE 754 para representar los números reales o de punto flotante, usando la
notación científica.
Esta notación permite representar los números con una mantisa (dígitos significativos) y un
exponente separados por la letra ‘e’ o ‘E’. Por ejemplo el número 4000 se representa por la
mantisa 4 y el exponente 3, 4e3. Se lee 4 veces 10 elevado a la 3. El número 0.25 se representa
también como 25e-2. También se permite omitir el cero inicial, .25 y el número real 4.0 se
puede introducir como 4. (sin el cero después del punto).
Así, con 64 bits se pueden representar los números (decimales) del ±5.0*10–324 (precisión)
hasta ±1.7 * 10308 (rango). La norma IEEE 754 actualizada en 2008 incorpora el formato
decimal64 que utiliza la base decimal para mejorar los errores de representación binaria
(IEEE Standards Committee, 2008). Python incorpora la función Decimal del módulo decimal
con este fin.
A continuación se muestran varios ejemplos de números reales, el tipo real (float) y un error
típico con representación de punto flotante con base binaria, en el caso del valor 0.1.
>>> 25e-2
0.25
>>> 4e3
4000.0
>>> type(4.)
<class 'float'>
>>> .2e2
20.0
>>> 1.1 + 2.2 # se representa con error en punto flotante binario
3.3000000000000003
8
Aunque en lengua española se usa la coma como separador de la parte entera y fraccionaria,
utilizaremos el punto como separador decimal para seguir el formato de Python y la mayoría de
lenguajes de programación, que usan la forma de la lengua anglosajona.
19
Programación en Python Tipos de datos, expresiones, operaciones
Booleanos
El tipo de dato para representar valores lógicos o booleanos en Python es bool, en Pascal y
C++ se definen como boolean y bool, respectivamente. Los datos booleanos toman el valor
True (1 lógico) o False (0 lógico). El nombre booleano se usa luego que George Boole,
matemático inglés, propusiera en el siglo XIX un sistema algebraico basado en estos dos
valores lógicos y tres operaciones lógicas: “y lógico”, “o lógico” y la negación. Ejemplos:
>>> a = 3 > 2
>>> a
True
>>> type(a)
<class 'bool'>
>>> 4 > 5
False
Carácter
El orden en que se representan sirve para evaluar cuál es mayor que otro, de acuerdo al valor
numérico en que figuran en el código ASCII. Por ejemplo 'b' es mayor que 'a'.
El tipo carácter no está definido en Python. Los caracteres simples se definen igual que un
texto con una sola letra, es decir como una cadena de caracteres (string).
>>> type('a')
<class 'str'>
Se puede observar que el carácter 'a' en Python es de tipo string (str), aunque en otros
lenguajes como Pascal sería de tipo carácter (char).
Los datos compuestos o estructurados comprenden aquellos datos con elementos de valores
de un mismo tipo o de diferentes tipos, que se representan unificados para ser guardados o
procesados. En el tema 5 se describirán los tipos de datos compuestos para manejar arreglos
matemáticos de vectores o matrices y otros conjuntos de valores heterogéneos de números,
texto o booleanos.
20
Programación en Python Tipos de datos, expresiones, operaciones
El tipo de dato string es la estructura básica para manejar texto, que incluye caracteres
alfanuméricos y demás caracteres de la codificación ASCII o UTF-8. Los string en Python se
definen entre comillas simples (' ') o dobles (" "). También se pueden definir entre comillas
triples (""") cuando se tangan múltiples líneas. Por ejemplo,
>>> 'Hola'
'Hola'
>>> b = "Casa de madera"
>>> type(b)
<class 'str'>
>>> type(15)
<class 'int'>
>>> type('15')
<class 'str'>
Los textos 'Hola' o "Casa de madera" son de tipo string en general en todos los lenguajes.
El valor 15 es un número de tipo entero (int), sin embargo, el valor '15' es un string(str). Si
se incluyen comillas (") o comillas simples (') dentro de un string pueden dar resultados
erróneos cuando estos caracteres se usan para delimitar el string. Se puede emplear dentro
del texto aquel carácter que no se ha usado de delimitador:
Sin embargo, en estos casos se puede también usar el carácter barra invertida (\) que sirve de
escape para agregar comillas u otras acciones dentro del string:
El carácter barra invertida (llamado carácter de escape) seguido de n (\n) indica salto a nueva
línea. Se pueden incluir múltiples líneas en un string usando triples comillas """ ... """".
En este caso los fines de línea están incluidos. Los salto a nueva línea se aprecian cuando se
presenten en pantalla con la función interna print():
21
Programación en Python Tipos de datos, expresiones, operaciones
La acción de asignación se usa para darle a una variable un valor determinado. En Python la
acción de asignación de valores a una variable quiere decir que la variable con su nombre
determinado se va a asociar al valor de la derecha de la asignación:
>>> a = 7
El símbolo = indica que el valor 7 se asigna a la variable a. El mismo símbolo se usa en C/C++ o
FORTRAN, pero en Pascal se usa := como asignación. Sin embargo, lenguajes como el R
utilizan el signo <- que refleja mejor la asimetría de esta acción, donde el valor de la derecha se
asigna a la variable de la izquierda.
22
Programación en Python Tipos de datos, expresiones, operaciones
>>> id(7)
1449917120
>>> a = 7
>>> id(a)
1449917120
>>> b = 7
>>> id(b)
1449917120
>>> c = a
>>> id(c)
1449917120
Tanto 7, a, b o c son el mismo objeto y ocupan una posición única de memoria. En este caso la
posición9 1449917120. La variable b al asignarle el mismo valor (y objeto) 7, se referenciará a
la misma posición. Lo mismo si le asignamos a la variable c la variable a; c se referenciará a la
misma posición de 7. Esto hace que Python maneje más eficientemente la memoria pues en
otros lenguajes se triplicaría el uso de ésta al tener tres variables con el mismo valor. Pero
¿qué pasa si usamos el valor 7.0 en lugar de 7?:
>>> x = 7.0
>>> id(x)
1722264
>>> type(x)
<class 'float'>
La variable x estará asociada al objeto 7.0, con identidad 1722264, de tipo float y valor
7.0. Así, los objetos de Python tienen tres características: valor, tipo e identidad. Como se ha
notado, las variables no necesitan que sea declarado su tipo antes de ser usadas, como en
Pascal o C. Pueden incluso cambiar de tipo a lo largo del programa.
>>> 7.0 = x
SyntaxError
>>> x = x + 3
>>> x
10.0
>>> x, y, z = 7, 8.2, 9
9
Este valor es arbitrario. Se puede obtener cualquier otra posición de memoria.
23
Programación en Python Tipos de datos, expresiones, operaciones
Al nombre de una variable lo llamaremos identificador. Pero los nombres de otros elementos
de los programas, como funciones, clases, librerías también tendrán identificadores. Los
identificadores en programación pueden contener letras y números pero deben empezar
siempre con una letra o el carácter guion bajo o subrayado “_”. Aunque los matemáticos
suelen usar nombres con una sola letra para las variables, en programación muchas veces es
preferible utilizar identificadores con nombres que se asocien con su significado. Como, area,
volumen, lead_III, lado2. Hay que hacer notar también que en la mayoría de los
lenguajes, incluyendo Python, los identificadores son sensibles al tipo de letra minúscula-
mayúscula10. Es decir n y N son variables diferentes.
10
Python permite identificadores con vocales acentuadas, como área. Aunque no es recomendable
esta práctica por si se cambia de lenguaje de programación.
24
Programación en Python Tipos de datos, expresiones, operaciones
>>> help("keywords")
False def if raise
None del import return
True elif in try
and else is while
as except lambda with
assert finally nonlocal yield
break for not
class from or
continue global pass
Hay que tener cuidado también con las funciones internas o predefinidas del lenguaje (built-in
functions)11. Si identificamos una variable con el nombre de una función predefinida, ésta
luego no podrá ser llamada pues su identificador se ha sobrescrito con la variable. Por
ejemplo, hemos usado las funciones type para saber el tipo de dato usado. Si a una variable la
identificamos con el nombre type, perdemos esta función en el programa:
>>> type(15)
<class 'int'>
>>> type = "Hola"
>>> type(15)
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
type(15)
TypeError: 'str' object is not callable
>>> 1.5*3/2
2.25
>>> 1.2*x + 3 # El valor de x del ejemplo anterior es 10.0
15.0
>>> 3 > (3.1 + 2)/3
True
Las sentencias o instrucciones son las unidades básicas de los programas (llamados también
en el argot de los programadores, códigos) que produce una acción, como asignar un valor a
una variable, mostrar un resultado, etc. El intérprete de Python ejecuta cada sentencia
produciendo la acción dada.
11
Se pueden consultar la lista actual de funciones internas en:
https://docs.python.org/3.3/library/functions.html
25
Programación en Python Tipos de datos, expresiones, operaciones
>>> 1.5*3/2
>>> y = x/2 + 3 2.25
>>> print(y) >>> print(_)
8.0 2.25
2.4. Operadores
Los operadores son los símbolos que representan las acciones de cálculo. Adicional a las
operaciones clásicas matemáticas, en programación se utilizan operadores lógicos y de
relaciones o comparación. Los operadores los podemos clasificar de 3 tipos: operadores
aritméticos, operadores lógicos o booleanos y operadores relacionales.
Ejemplos:
Los operadores aritméticos que operan sobre un solo operando se llaman unarios: operador
cambio de signo - y operador identidad +. Por ejemplo, -4, +4, --4 equivale a 4.
26
Programación en Python Tipos de datos, expresiones, operaciones
Python incluye sentencias que compactan el operador de asignación con cualquier operador
aritmético. En los casos de incremento o decremento de una variable tenemos,
>>> c += 1 # equivale a: c = c + 1
>>> x += 0.01 # equivale a: x = x + 0.01
>>> d -= 2 # equivale a: d = d – 2
Los demás operadores aritméticos (*, /, //, %, **) también pueden usarse en esta forma
compactada. Pueden incluirse también expresiones como incremento u otra operación:
Los operadores lógicos o booleanos operan sobre tipo de datos booleanos. Estas operaciones
son “y lógico” o conjunción, “o lógico” o disyunción sobre dos operandos y la “negación” que
es un operador unario. En Python las palabras reservadas para estas operaciones son and, or y
not, respectivamente. Recordamos que los valores lógicos en Python son True y False para
los valores cierto (1 lógico) y falso (0 lógico), respectivamente.
27
Programación en Python Tipos de datos, expresiones, operaciones
Por ejemplo,
>>> A = True
>>> type(A)
<class 'bool'>
>>> B = False
>>> A or B
True
En el siguiente cuadro se resumen algunas leyes lógicas de utilidad para tratar expresiones
booleanas. Se pueden demostrar usando la tabla de verdad de cada lado de la igualdad.
not not A = A
A and True = A
A and False = False
A or False = A
A or True = True
not (not A and not B) = A or B
not (not A or not b) = A and B
Aunque no será tratado dentro del tema de este curso, Python y otros lenguajes como el C++
incluyen operadores lógicos sobre números binarios, realizados bit-a-bit. Estos operadores de
bits (bitwise operators) realizan las operaciones lógicas sobre los bits del número binario
equivalente al número decimal introducido. Por ejemplo, el 5)10 equivale a 101 y el 6)10 es 110.
Si realizamos un “y lógico” bit a bit tendremos el binario 100, que equivale a 4 )10. A nivel de
lenguaje de máquina se usa también el operador or exclusivo (xor) que devuelve 1 cuando
solo uno de los operandos es 1. En Python, como en C++, los operadores de bits son12:
12
Para más detalles ver: https://wiki.python.org/moin/BitwiseOperators
28
Programación en Python Tipos de datos, expresiones, operaciones
Son usados para comparar 2 expresiones o valores y el resultado es siempre cierto o falso, es
decir, booleano.
Operadores Relacionales
Matemáticas En Python Significado Ejemplo Resultado
= == Igual a 'a' == 'b' False
≠ != Distinto a 'b' != 'B' True
< < Menor que 7<3 False
> > Mayor que 7>3 True
≤ <= Menor o igual que 7 <= 7 True
≥ >= Mayor o igual que 7 >= 3 True
La expresión (temp >= 37) and (temp <= 42) puede ir sin paréntesis ya que, como
veremos en la siguiente sección, los operadores relacionales tiene mayor prioridad o
precedencia que los booleanos. Python tiene la característica particular que este tipo de
expresión se puede escribir como en notación matemática: 37 <= temp <= 42. Expresiones
del tipo a < b < c en Python significan (a < b) and (b < c), lo cual mejora la
legibilidad del lenguaje.
Los caracteres del alfabeto (sin la ñ) que pertenecen a la tabla ASCII están ordenados. Las
minúsculas del binario equivalente decimal 97 al 122 y las mayúsculas del 65 al 90. Aunque en
Python los caracteres son de tipo string, podemos comparar caracteres y su resultado True o
False se dará de acuerdo a su posición ASCII. Por ejemplo, 'b' > 'a' devolverá True.
Igualmente, 'B' > 'a' devolverá False.
En el siguiente ejercicio buscaremos una expresión que sea cierta cuando, dada una variable
car, ésta sea un símbolo del alfabeto:
29
Programación en Python Tipos de datos, expresiones, operaciones
>>> es_letra = 'a' <= car <= 'z' or 'A' <= car <= 'Z'
>>> es_letra
False
Para resolver expresiones con múltiples operadores, incluyendo diferente tipo de operador,
aritmético, booleano o relacional, se debe seguir un orden de prioridad para realizar primero
una operación y luego otra. En caso de dudas, o para mejorar la legibilidad del programa, es
recomendable que se usen paréntesis. El orden de prioridad o precedencias es diferente de
acuerdo al tipo de lenguaje de programación. En Python las precedencias son similares a C++ y
Matlab.
Por ejemplo, la expresión 7/2*3 calcula primero la división 7 entre 2 y el resultado los
multiplica por 3, resultando 10.5. Si se quiere dividir entre el producto 2*3, hay que
encerrarlos entra paréntesis: 7/(2*3). La asociación por la derecha de la exponenciación se
puede ver en la siguiente expresión 2**4**2 y (2**4)**2.
>>> 2**4**2
65536
>>> (2**4)**2
256
30
Programación en Python Tipos de datos, expresiones, operaciones
Operador Precedencia
() Mayor
** |
+x, -x (identidad, cambio de signo) |
*, /, //, % |
+, - |
==, !=, <, >, <=, >= |
not |
and v
or Menor
Hemos introducido ya una de las acciones elementales de los procesos informáticos como es la
asignación de valores a las variables. Las otras acciones elementales incluyen la lectura de
información para ser procesada a través de variables por el programa y la escritura de datos
en pantalla para mostrar los resultados de estos procesos. Otras formas de entrada y salida de
datos se hacen a través de lectura y escritura de ficheros que se guardan en memoria externa
al procesador central ya sea en medios magnéticos como discos duros o electrónicos de estado
sólido como las memorias flash. En el tema 5 se hace un breve análisis del uso de ficheros.
31
Programación en Python Tipos de datos, expresiones, operaciones
Veamos varios ejemplos de distintos tipos de información, leídos del teclado a través del Shell
de Python:
Como se puede ver las entradas de datos con la función input() hay que convertirlas a los
tipos de datos numéricos adecuados, en caso que se requiera.
Así como la función interna type() devuelve el tipo de dato del valor o variable introducida,
se pueden convertir datos de un tipo a otro, con ciertas restricciones.
La función interna float() devuelve el número real del dato en formato string o entero que
entre a la función. Ejemplos:
>>> float('123')
123.0
>>> float(Edad) # Variable Edad de tipo int del ejemplo anterior
21.0
>>> float('abc')
Traceback (most recent call last):
File "<pyshell#84>", line 1, in <module>
float('abc')
ValueError: could not convert string to float: 'abc'
32
Programación en Python Tipos de datos, expresiones, operaciones
La función int() convierte un string (que sea un número en formato texto) o un real a entero.
En caso de un real, la función lo redondea hacia cero. Ejemplos:
>>> int('123')
123
>>> int(27.8)
27
>>> int(-24.9)
-24
La función bin() representa (en un string) un entero a su equivalente en binario. La función str()
convierte un número a formato string. Ejemplos:
>>> bin(255)
'0b11111111'
>>> bin(256)
'0b100000000'
>>> str(254)
'254'
>>> str(1/3)
'0.3333333333333333'
>>> a = 3.5
>>> b = 15
>>> print('El producto de', a , 'por', b , 'es', a*b)
El producto de 3.5 por 15 es 52.5
>>> print('El producto de '+str(a)+' por '+str(b)+' es '+str(a*b))
El producto de 3.5 por 15 es 52.5
La función print escribe como string todo su argumento (entrada) que puede ser una
secuencia de expresiones separadas por coma. En el primer print del ejemplo anterior se
separa (por defecto u omisión) cada elemento entre las comas por un espacio en blanco. Se
puede notar que están combinados strings, enteros y reales, pero todo es convertido a una
representación de texto. Al finalizar el print se avanza a una nueva línea. De hecho, se puede
usar print() como avance a nueva línea.
33
Programación en Python Tipos de datos, expresiones, operaciones
Existen parámetros de la función print() que indican cómo terminar la escritura (end) y
cómo separar (sep) los elementos del argumento de la función. Cuando se quiera terminar la
función print sin que salte a una nueva línea, y un nuevo print continúe en la misma línea,
se agrega al final el argumento end='' (comillas simples sin espacio entre ellas). Cuando no se
usa el end, se utiliza el valor por omisión de salto a nueva línea, que sería end='\n'. En lugar
de separar las secuencias por espacios en blanco, se puede omitir la separación (sep='') o
colocar el string que se quiera como símbolo separador. El ejemplo de la figura 9 muestra un
programa en su código fuente con diversas opciones del uso de print y el resultado sobre el
Shell:
Figura 9. Imagen del editor de Python con varias opciones de la función print().
Qué!
A B C
A,B,C
ABC
10:27:59
10----27----59
>>>
El formateo clásico de strings usado en muchos lenguajes, como el printf, para mostrar, por
ejemplo, datos numéricos con un número de decimales especificados o un ancho
determinado, se puede hacer en Python con el viejo estilo de printf dentro del print o con
el método de str.format(). La descripción de este formato escapa al alcance de este
manual. El lector interesado puede consultar (Klein, 2016)13 o la web https://pyformat.info/
2.5.4. Comentarios
El lector habrá observado el uso del símbolo # para comentar sentencias o partes del
programa. Los programas largos o incluso cualquier programa realizado algún tiempo atrás
pueden ser complicados de seguir. Es una buena opción comentar en lenguaje natural lo que
las instrucciones del programa están haciendo.
13
http://www.python-course.eu/python3_formatted_output.php
34
Programación en Python Tipos de datos, expresiones, operaciones
En el ejemplo de la figura 10 se ha incluido un string con comillas triples como encabezado del
programa. Algunos entornos de desarrollo de programas en Python, como el Spyder de
Winpython14, incluyen de manera automática este encabezado de inicio en el editor de
programas.
Los errores de programación (conocidos en la jerga informática como bugs) suelen ser de tres
tipos: (i) de sintaxis, (ii) de ejecución y (iii) semánticos. Ejemplos:
Sintácticos:
>>> 4/*8
SyntaxError: invalid syntax
>>> pirnt('Hola mundo!')
Traceback (most recent call last):
File "<pyshell#85>", line 1, in <module>
pirnt('Hola mundo!')
NameError: name 'pirnt' is not defined
De ejecución:
>>> alumnos = 56
>>> grupos = 0
>>> alum_grupo = alumnos/grupos
Traceback (most recent call last):
File "<pyshell#90>", line 1, in <module>
alum_grupo = alumnos/grupos
ZeroDivisionError: division by zero
Semánticos:
>>> base = 4
>>> altura = 2
>>> area = base / altura
>>> print(area)
2.0
14
Winpython: http://winpython.sourceforge.net/
35
Programación en Python Tipos de datos, expresiones, operaciones
Ejercicios
3.Determinar si las expresiones tiene sintaxis correcta. En caso de que sea válida la sintaxis,
determinar su valor, y en el caso contrario justificar el error:
3.1. 1 + 2 * 3 % 2 – 1
3.2. 1 >= 7 % 2
3.3. 1 % 2 > 0.5
3.4. True or not and (2 > 1)
3.5. (7.5 – 3) // 3 == 1.5
3.6. (3 // 2) > (3 % 2) and not True
3.7. (3 // 3 > 3 % 3) or not True
3.8. p == (4 % 3 + 1 > 0) and not p
5.1 5.2
36
Programación en Python Tipos de datos, expresiones, operaciones
5.3 5.4
5.5 5.6
5.7 5.8
5.9 5.10
6. Dadas dos variables reales x e y, escribir una expresión booleana que valide que x está
fuera del intervalo [100, 200] e y está dentro del intervalo (20,40].
7. Sean A, B y C tres variables enteras que representan las ventas de tres productos
respectivamente, escribir expresiones lógicas (booleanas) que representen las siguientes
afirmaciones:
a. Las ventas del producto A son las más elevadas.
b. Ningún producto tiene unas ventas inferiores a 300.
c. Algún producto tiene unas ventas superiores a 1000.
d. La media de ventas es superior a 700.
e. El producto C no es el más vendido
8. Las edades de tres primos se guardan en las variables a, b, c. Escribir una expresión
booleana que evalúe True si solamente 2 de los 3 primos tienen la misma edad y, además,
la suma de las 3 edades sea múltiplo de 3.
9. Obtener las expresiones booleanas equivalentes a los enunciados siguientes:
a) No se cumple z de tipo booleano o que x e y sean positivas y su suma múltiplo
de 7.
b) La suma de a y b, de tipo entero, es múltiplo de 5 y al menos una de ellas es
par.
c) x no es la más grande ni la más pequeña de entre x, y, z de tipo real.
d) La suma de a y b, de tipo entero, es múltiplo de 5 y ambas son impares.
e) Exactamente dos de entre x, y, z son positivas.
f) La más pequeña de las variables a y b de tipo real está entre 0 y 1.
g) a de tipo entero pertenece al conjunto de los números menores de 100 o
mayores de 200 y además es un impar múltiplo de 3.
h) x, y, z de tipo entero son todas impares o todas pares.
i) ξ de tipo real es mayor que la distancia entre x e y de tipo real.
xi**2 > (x-y)**2 # Debe usarse un identificador válido (xi), no ξ
37
Programación en Python Tipos de datos, expresiones, operaciones
38
Programación en Python Estructuras algorítmicas
Los subprogramas serán introducidos en el siguiente tema, pero se refieren a las funciones en
los diversos lenguajes de programación, incluyendo Python. Hay funciones internas como
algunas ya usadas, o diseñadas por el programador. En otros lenguajes de programación como
Pascal y ADA también incorporan los procedimientos (procedures) como una función que no
devuelve resultado sino que realiza una acción.
Estructura secuencial
Pseudocódigo Python Pascal C
inicio Instrucción 1 begin {
Instrucciones Instrucción 2 Instrucciones Instrucciones
… … … …
fin Instrucción n end }
39
Programación en Python Estructuras algorítmicas
En lenguajes como Pascal los bloques de secuencias del programa, incluyendo las que se
ejecutan dentro de una estructura algorítmica alternativa o iterativa se colocan entre
delimitadores begin y end; en C/C++ entre llaves {}. En Python no se usan delimitadores,
aunque, tal como se describe en la siguiente sección, las secuencias dentro de las
composiciones algorítmicas deben ir indentadas (sangradas) o tabuladas.
Hemos presentado la mayoría de ejemplos con la opción interactiva del Shell de Python. A
partir de ahora los códigos de los ejemplos o ejercicios resueltos se presentarán en fondo
blanco con la fuente original del editor15 y los resultados sobre el Shell (cuadro fondo gris). En
el siguiente ejemplo se convierte grados Celsius a Fahrenheit; al ejecutarlo (Run o F5 en el
Editor) e introducir por ejemplo el valor 27, se muestra el resultado en el Shell de Python:
Los decimales de los números reales (float) del perímetro y área se pueden reducir, por
ejemplo, a dos dígitos decimales utilizando el estilo adaptado printf de otros lenguajes
(%.2f) o usando la función interna de Python round(x, 2). Puede cambiarse el 2 por el número
de decimales que se requiera.
15
El editor del desarrollador de programas Spyder de winpython muestra advertencias de errores de
sintaxis a medida que se edita el programa.
40
Programación en Python Estructuras algorítmicas
Ejercicio de conversión de segundos. Diseña un programa que lea una cantidad de segundos
(valor entero) y calcule el número de días, horas minutos y segundos euivalentes.
Ejercicios de cambio de monedas. Diseña un programa que reciba una cierta cantidad de
céntimos (c) y retorne su equivalente en el mínimo número de monedas de curso legal (2
euros, 1 euro, 50 céntimos, 20 céntimos, 10 céntimos, 5 céntimos, 2 céntimos y 1 céntimo).
41
Programación en Python Estructuras algorítmicas
if condición:
secuencia_de_instrucciones
Si x es un valor negativo (condición cierta), entonces se ejecuta la instrucción dentro del if. Y
si no es cierta, entonces no se hace nada y se pasa a la instrucción siguiente, print(), que está
en la misma columna del editor que el if. Por cierto, Python incluye una función interna que
calcula el valor absoluto de un número: abs(x).
42
Programación en Python Estructuras algorítmicas
Otro ejemplo de estructura alternativa simple sería un programa que cubre un saldo bancario
de cuenta corriente descubierto (saldo negativo) con fondos de una cuenta de ahorros:
#Balance financiero
CuentaAhorros = 10000
saldo = float(input("Cuál es el saldo de la cuenta corriente?: "))
if saldo < 0:
transferir = -saldo
CuentaAhorros = CuentaAhorros - transferir
saldo = saldo + transferir
print('Fondos cuenta de ahorro:', CuentaAhorros)
if condición:
secuencia_de_instrucciones_condicion_cierta
else:
secuencia_de_instrucciones_condicion_falsa
Por ejemplo, queremos evaluar si un número natural es par o impar. Podemos usar el
operador módulo (%) que devuelva el resto de la división entre 2. Si el resto es 0, el número
será par y si no, impar:
# Paridad de un número
N = int(input("Entra un número natural: "))
if N%2 == 0:
text = 'es par'
else: # equivaldría a: if N%2 != 0:
text = 'es impar'
print('El número', N, text)
Nótese que este ejemplo de la paridad de un número pudiera escribirse con dos estructuras
condicionales simples, donde en lugar del else se utiliza otro if con la expresión lógica
opuesta como condición. Se obtendría el mismo resultado pero, además de poco elegante,
dificulta la legibilidad del programa.
En el siguiente ejemplo se resuelve una ecuación de primer grado, que debe tomar en cuenta
evitar la división por 0, ya que si no el programa daría un error:
43
Programación en Python Estructuras algorítmicas
+1 𝑠𝑖 𝑥 > 0
𝑠𝑖𝑔𝑛𝑜(𝑥) = { 0 𝑠𝑖 𝑥 = 0
−1 𝑠𝑖 𝑥 < 0
44
Programación en Python Estructuras algorítmicas
Python incluye la sentencia elif que permite encadenar los else e if seguidos permitiendo
una mayor legibilidad de estructuras anidadas. En el bloque de la derecha del ejemplo
anterior, se muestra el uso de esta sentencia.
Este programa puede ser robusto a notas erróneas, como -3 o 15 introduciendo el siguiente
código, en lugar de “if nota < 5:”:
if condición1:
secuencia_de_instrucciones_si_condicion1_cierta
elif condición2:
secuencia_de_instrucciones_si_condicion2_cierta
elif condición3:
secuencia_de_instrucciones_si_condicion3_cierta
...
else:
secuencia_de_instrucciones_si_condiciones_anteriores_falsas
Esta estructura puede también prescindir del else final en caso de no ser necesario. Las
estructuras alternativas multiples tipo switch de C/C++ o case de Pascal no existen en Python.
Su función se puede realizar con la estructura if … elif … elif, aunque para la realización
de los típicos menús de usuario para escoger una opción, se puede utilizar datos estructurados
tipo tuplas, listas o diccionarios, como los que se estudiarán en el tema 5.
45
Programación en Python Estructuras algorítmicas
Un ejemplo de secuencia de datos serían las notas de los alumnos de una asignatura con 50
alumnos. Las 3 acciones algorítmicas descritas previamente se pueden hacer.
Otro ejemplo de secuencia sería aquella dada por los términos de la expansión en serie de
Taylor de la función del seno de un ángulo (en radianes), seno(x):
𝑥3 𝑥5 𝑥7 𝑥9
𝑠𝑒𝑛𝑜(𝑥) = 𝑥 − + − + −⋯
3! 5! 7! 9!
Un algoritmo no podría calcular los infinitos términos, pero el último elemento de la secuencia
de datos a procesar por un esquema iterativo sería: (opción 1) un término final fijado por el
programador o (opción 2) un término cuyo valor absoluto cumpla la condición de ser menor
que un error prefijado.
Los esquemas iterativos aplicados a realizar cálculos o utilizar expresiones de todo tipo
(aritméticas, booleanas o relacionales) sobre una secuencia de datos suelen clasificarse como
esquemas iterativos de búsqueda o de recorrido.
En un esquema de recorrido hay que tratar todos los elementos de la secuencia para realizar
los cálculos necesarios o resolver el problema. Por ejemplo, si queremos hallar el valor medio
de la nota de los 50 alumnos de la asignatura, debemos hacer un recorrido sobre toda la
secuencia de notas. Las iteraciones de recorrido son llamadas también iteraciones definidas.
46
Programación en Python Estructuras algorítmicas
La sentencia while es la composición algorítmica iterativa por excelencia que sirve para
cualquier esquema iterativo. Su implementación es similar en todos los lenguajes de
programación.
Haremos un ejercicio que muestre la tabla de multiplicar del número introducido por el
usuario. Esto es un esquema típico de recorrido:
47
Programación en Python Estructuras algorítmicas
48
Programación en Python Estructuras algorítmicas
Este programa no requiere buscar todos los divisores desde 2 hasta n-1. El lector puede
averiguar hasta dónde hace falta buscar posibles divisores del número que deseamos saber si
es primo o no. La condición d < n del while puede cambiarse para detener la búsqueda antes.
Los ejemplos de algoritmos clásicos presentados en el tema 1 son también esquemas iterativos
de búsqueda. El algoritmo de Euclides para hallar el MCD de dos números naturales se puede
programar en Python como
En el programa de Euclides hemos utilizado la asignación múltiple para guardar los valores de
las variables a y b en aa y bb, de forma que no se pierdan y mostrarlos en el print() final.
Si quisiéramos rastrear cuál es el valor aproximado de la raíz del número en cada iteración,
podemos incluir una instrucción al final del bloque dentro del while de la forma
49
Programación en Python Estructuras algorítmicas
Se puede probar hallar la raíz de 9 y observar el error de aproximación. Intente reducir el valor
epsilon a 1e-20 (10-20) y observar el resultado. Este programa, en la práctica, no es necesario
pues Python (y la mayoría de lenguajes) dispone de la función sqrt() en el módulo de
funciones matemáticas math, que se invoca tal como hicimos con anterioridad con el valor pi:
El programa siguiente realiza un juego típico de adivinar un número oculto, que es generado
aleatoriamente por el computador. La solución para el jugador es dividir la búsqueda en dos
conjuntos y así ir acotando el conjunto de números hasta encontrar la solución. Se suele llamar
a esta estrategia “búsqueda binaria o dicotómica”. Se ha incluido en el programa el límite de
100 para el número natural a ser adivinado. En este caso 100 es menor que 2 7 por lo que con 7
intentos será suficiente para adivinar el número. Se hace uso del módulo de funciones
aleatorias random. En particular, la función randint(a, b) que genera un número entero
aleatorio en el rango [a, b] ambos inclusive.
Se propone modificar este programa para que se adivine un número del 1 al 1000 o, en
general, del 1 al N.
Las raíces cuadradas se pueden calcular solo para números positivos. Para hallar raíces de
números negativos se tiene que usar números imaginarios. El programa de Herón realizado
50
Programación en Python Estructuras algorítmicas
entrará en iteraciones infinitas si probamos un número negativo (si es menor que -epsilon).
Introducimos un esquema muy usado para asegurar requisitos de entrada en programas
informáticos. En este caso se debe cerciorar que el número introducido por el usuario sea
positivo. El siguiente código, que se debe incluir al comienzo del programa de Herón, hace que
la estructura while capte un valor erróneo (negativo) y no salga del bucle hasta que se
introduzca uno correcto (positivo). Este esquema puede ampliarse a múltiples casos,
cambiando la condición lógica del while.
Cuando en un programa informático se requiere hacer un conjunto de cálculos sobre una serie
de datos, es decir, hacer un esquema de recorrido (iteración definida) o aplicar el bloque de
instrucciones sobre un grupo de elementos (números, string, etc.) es preferible utilizar la
sentencia for. En Python el for es una estructura iterativa particular si la comparamos con las
equivalentes en otros lenguajes de programación.
En Python el bucle for se puede leer como “para (for) cada elemento (ítem) de (in) la
secuencia (lista, string, etc.) ejecutar las instrucciones del bloque indentado”. Mostraremos un
par de ejemplos para presentar esta estructura iterativa:
# Saludo de cumpleaños
for nombre in ['Leo', 'Ronaldo', 'Andrés', 'Sergio']:
print('Feliz cumpleaños', nombre)
print('Ya hemos saludado a los amigos')
# Potencias de 2
for posicion in [1, 2, 3, 4, 5, 6, 7, 8]:
print('Peso del bit', posicion,'=',2**(posicion-1))
En estos ejemplos se puede observar que la estructura for recorre los elementos de la
secuencia de datos que está entre corchetes y este recorrido lo hace a través de la variable
que toma el valor del elemento en cada iteración. Las variables que se refieren a cada
elemento son nombre y posición, respectivamente. La iteración se realiza tantas veces como
elementos tenga la secuencia, que en estos ejemplos son de 4 y 8 elementos,
respectivamente.
51
Programación en Python Estructuras algorítmicas
La secuencia de datos entre corchetes forma una lista en Python. Pero la sentencia for puede
también recorrer otra secuencia de datos en tipos de datos compuestos, como los string u
otros que presentaremos en el tema 5 (tuplas, diccionarios, etc.). Las listas son datos
estructurados que también se analizarán en más detalle en el tema 5. Sin embargo, dado que
son muy usadas en la estructura iterativa for de Python, las introduciremos en esta sección.
Las listas son una secuencia ordenada de valores a los cuales se accede a través de un índice
que indica en qué posición en la lista se encuentra un elemento. Se caracterizan por el uso de
corchetes para delimitar la secuencia y de las comas como separador de los elementos. Las
listas pueden contener datos simples numéricos y booleanos o datos compuestos como
strings. También pueden tener datos heterogéneos de diferente tipo. Se dice que las listas son
dinámicas o mutables porque sus elementos pueden cambiar de valor, eliminarse o se pueden
añadir nuevos valores. Así, la estructura de datos entre corchetes de los primeros ejemplos
con for corresponde a listas.
Para acceder a las listas lo haremos a través del índice que señala la posición del elemento. Las
secuencias en el mundo real suelen comenzar por el uno (enero = mes 1, lunes = día 1, escena
1, fila 1 de la matriz, etc.). Sin embargo los lenguajes informáticos suelen comenzar por el cero.
En la lista con los nombres del primer ejemplo de for tenemos que el elemento 'Leo' se
accede (se indexa) con el valor 0, aunque está en la primera posición de la lista. El elemento
'Sergio', que es el cuarto de la lista, se accede con el valor de índice 3.
Existe en Python una acción muy útil para generar secuencias de valores enteros que sirvan
para recorrer los bucles for de Python. Se trata del tipo de dato range()16. Por ejemplo
0 1 2 3 4 5 6 7
16
En las versiones 2.x de Python, range() es una función que devuelve una lista. El concepto ha
cambiado en la versión 3, donde pasa a ser un tipo de dato range, que viene a ser una secuencia de
enteros usada típicamente para recorrer bucles for.
52
Programación en Python Estructuras algorítmicas
# Potencias de 2
for posicion in range(1, 9):
print('Peso del bit', posicion,'=',2**(posicion-1))
El valor inicio por omisión es 0 y el paso por omisión es 0. El último valor de la secuencia es
final-1. Por ejemplo,
Las composiciones for permiten realizar de forma más compacta las estructuras iterativas de
recorrido o definidas, como los tres primeros ejemplos presentados con la composición while:
Hemos comentado que la sentencia for recorre una secuencia de datos como las listas, range
y strings. Veamos un simple ejemplo con for recorriendo un string:
53
Programación en Python Estructuras algorítmicas
Imprimo: H
Imprimo: o
Imprimo: l
Imprimo: a
La variable i toma el valor de cada elemento del string 'Hola' durante cada iteración. Al
acabar el for, en la cuarta iteración, la variable i se queda con el valor 'a'. ¡Hay que tener en
cuenta este detalle si se usa la variable dentro del bucle o después!
En forma general, la serie o sumatoria de términos, fi, que dependan de la ubicación del
término i, se representan por
𝑁
El ejemplo visto anteriormente de sumar los primeros n números es típico de sumatorias. Por
ejemplo, si queremos hallar la sumatoria de términos de la serie convergente que representa
la paradoja de la dicotomía de Zenón de Elea, podemos usar el esquema clásico de sumatorias
en lenguajes de programación. Se inicializa la variable suma en 0 y dentro del bucle se van
añadiendo términos a esta variable por cada iteración.
∞
1 1 1 1 1
𝑠𝑢𝑚𝑎 = ∑ = + + + ⋯
2𝑖 2 4 8 16
𝑖=1
54
Programación en Python Estructuras algorítmicas
Existen en Python sentencias que permiten salir durante una iteración o definitivamente de
una estructura iterativa.
La sentencia break hace que se salga inmediatamente del bucle al ser accedida, es decir, se
sale del bloque de instrucciones de la iteración for o while. Esto implica que aquellas
instrucciones de la secuencia que están a continuación del break ya no se ejecutan y se sale de
la estructura iterativa.
En cambio la sentencia continue hace que se salten las instrucciones dentro del bloque de la
estructura iterativa, pero solo en la iteración actual. Es decir, se continuará con la siguiente
iteración dada por el for o el while.
Estas sentencias deben utilizarse con moderación, ya que introduce una excepción a la lógica
de control normal del bucle.
55
Programación en Python Estructuras algorítmicas
Ejercicios
Secuenciales
Alternativas
4. Escribe un programa que dados dos números nos diga cuál es el mayor.
5. Escribe un programa que dados un entero nos diga si es par o impar.
6. Escribe un programa en que dado un valor real, calcule f(x) definido como
1 𝑠𝑖 𝑥 < −1
𝑓(𝑥) = { −𝑥 𝑠𝑖 − 1 ≤ 𝑥 ≤ 1
−1 𝑠𝑖 𝑥 > 1
7. Escribe un programa que dado 3 valores reales determine si pueden ser los lados de un
triángulo. Los valores podrán ser un triángulo cuando el valor más grande sea menor que
la suma de los otros dos.
Iterativas
8. Diseña un programa que dado un entero n, escriba los divisores que tiene.
9. Diseña un programa que reciba un numero natural n y devuelva la suma de sus divisores
excepto él mismo.
10. Escribe un programa en el que, dado un número natural, nos calcule la suma de sus
cifras.
11. Diseña un programa que reciba dos números naturales x e y, escriba en pantalla el
resultado de calcular la potencia xy utilizando el producto únicamente. Por ejemplo, 23 =
2*2*2 = 8.
12. Validación entre a y b. Diseña un programa que reciba inicialmente dos valores, a y b
(donde b>a) y luego pida un número al usuario, que tiene que estar entre a y b.
56
Programación en Python Estructuras algorítmicas
Resultado del programa: muestra un mensaje 'Dame un valor: ' , el usuario entra un valor
y lo retorna si está dentro del intervalo [a; b]. En caso contrario, vuelve a pedir el valor.
13. Diseña un programa que reciba un valor entero n y devuelva su equivalente en binario
realizando divisiones sucesivas.
14. Diseñe un programa que encuentre el primer número perfecto mayor que 28. Un
número es perfecto si coincide con la suma de sus divisores (excepto él mismo). Por
ejemplo, 28 es perfecto ya que 28 = 1 + 2 + 4 + 7 + 14
57
Programación en Python Funciones
Hemos presentado ejemplos de programas sencillos que sirven para hacer un cálculo
específico o resolver un problema simple. Muchos programas informáticos más complejos
requieren realizar subprogramas y módulos de subprogramas que puedan ser reutilizados y
mejoren la manera de diseñar un programa. Desde los años 1970 se idearon paradigmas como
la programación estructurada que produce códigos o programas más fáciles de leer, depurar y
actualizar, y paradigmas como el diseño modular de programas y los esquemas top-down (de
arriba a abajo) y botton-up (de abajo a arriba) como estrategias para desarrollar programas
complejos o sistemas de software.
El paradigma de la programación modular surgió para hacer un programa más claro, legible,
menos complejo y, principalmente, para reutilizar subprogramas. De esta forma, al
programador se le facilita modificar y corregir los códigos por separado y también crear una
librería de subprogramas utilizables por otros programas. La idea de agrupar un conjunto de
subprogramas en módulos se implantó en los lenguajes Modula, como Modula, Modula-3,
donde se accede a un subprograma de un módulo con el punto “.” después del nombre del
módulo. De igual forma, el uso del punto se extendió para acceder a un campo de un record
(registro) o a un campo o método de un objeto. Esta idea se siguió en lenguajes C++, Java y
Python.
58
Programación en Python Funciones
Los módulos de Python que se guardan en una carpeta forman un package. Es decir, los
package en Python son una colección de módulos.
En diversos ejemplos de programas hemos utilizado funciones internas y funciones del módulo
de matemáticas (math) y del que genera valores aleatorios (random). Entre las funciones ya
aplicadas figuran:
>>> type(7)
<class 'int'>
59
Programación en Python Funciones
Primero se debe importar la función sqrt del módulo math (abs no hace falta importarla pues
es función interna). Lo que está entre paréntesis de abs y sqrt (el valor -9 y la variable x,
respectivamente) es el argumento de la función. Estas funciones devuelven un valor (return
value) luego de ser llamadas. La función abs es llamada dentro de una expresión aritmética, el
valor que devuelve pasa a reemplazarla en la expresión y se suma a 3. Luego, este nuevo valor
se asigna a la variable x. Hay que tener cuidado que el tipo de dato que devuelva la función sea
compatible con la operación que se vaya a hacer. Los argumentos de las funciones pueden ser
expresiones, incluso expresiones que incluyen llamadas a otras funciones, como se observa a
continuación,
y = sqrt(4 + x**2)
z = sqrt(abs(-40))
A continuación se resume una lista de algunas funciones y valores de los módulos math
(matemáticas), y random (de valores aleatorios)17
17
La lista completa de módulos se puede consultar en https://docs.python.org/3/library/index.html
60
Programación en Python Funciones
El uso de las funciones de los módulos se puede hacer de 2 maneras. Hasta ahora hemos
importado la función o valor que necesitamos y la aplicamos directamente en la instrucción.
También podemos importar múltiples funciones del módulo:
Alternativamente, se puede importar el módulo math y utilizar las funciones del módulo
separadas con punto:
import math
x = math.sqrt(10)
dB = math.log10(x/2)
import math as m
x = m.sqrt(10)
dB = m.log10(x/2)
En Python, se pueden diseñar funciones que hacen cálculos y devuelve un resultado (la típica
de matemáticas), como la mayoría de funciones que hemos usado. Por ejemplo, log10(100)
61
Programación en Python Funciones
devuelve 2.0. Pero hay funciones, como shuffle(s) del módulo random, que baraja o pone en
posiciones aleatorias los elementos de la secuencia s. No devuelve resultado alguno, sino que
realiza una acción sobre un objeto y éste queda modificado. Este tipo de función equivale a un
procedure de otros lenguajes.
Luego de la serie de libros usados como textos en el MIT18 para los cursos introductorios de
Computer Science (Introducción a la informática), como “How to think like computer scientist”
y “Think Python” (Downey, E.K., A. B., Elkner, J. & Meyers, C., 2002; Wentworth, P., Elkner, J.,
Downey, A. B., & Meyers, C.. 2012; Downey, E.K, 2015) se han extendido los términos
“funciones productivas” (fruitful function) para llamar a las funciones que devuelven
resultados y “funciones nulas o estériles” (void function) a las que no devuelven resultados,
equivalentes a los procedures de Pascal. Lenguajes como C/C++ y Java también usan las void
functions para los procedimientos que no devuelven resultados.
Hasta ahora hemos usado funciones internas o de módulos de Python que ya están diseñadas.
Las hemos llamado en una instrucción para que nos devuelva un valor o ejecute un
procedimiento. Si queremos diseñar funciones debemos definirlas. En Python la definición de
una función es de la forma:
def nombre_funcion(parametros):
cuerpo_de_la_funcion
Se usa la palabra reservada (keyword) de Python def para indicar que en esta línea comienza
la definición de la función, luego ponemos el nombre de la función con un identificador válido
y entre paréntesis los parámetros de entrada de la función. Los parámetros se relacionan con
los valores que le son pasados como argumentos. El cuerpo del subprograma está indentado o
tabulado (se indenta generalmente con cuatro espacios en blanco). Al volver a la columna 1
del editor se termina el bloque de código que define la función y volvemos al programa
principal. Conviene definir todas las funciones que use nuestro programa al comienzo de éste.
Sin embargo, Python solo requiere que la función esté definida antes de que sea usada.
Veamos un ejemplo donde se diseña una función que devuelva la ganancia en decibeles (dB)
de un amplificador. Sus parámetros de entrada serán los voltajes de entrada (x) y salida (y) del
amplificador:
18
El Massachusetts Institute of Technology (MIT) dispone de numerosos materiales de enseñanza de
acceso libre en la web MIT OpenCourseWare (OCW): http://ocw.mit.edu/index.htm
62
Programación en Python Funciones
>>>
Ganancia = 40.0 dB
El programa principal envía los valores de Vi y Vo a la función. Estos valores de Vi y Vo son los
argumentos de la función. Los parámetros formales x e y de la función reciben los valores de
los argumentos (como si fuera una asignación) y entran a la función. Hay que notar que se
debe guardar el orden de los parámetros Vi → x, Vo → y.
El estilo docstring que incluimos en la función sirve para documentar en el Shell de Python lo
que hace la función.
>>> help(ganancia_dB)
Help on function ganancia_dB in module __main__:
ganancia_dB(x, y)
Calcula ganancia en dB: 20log(y/x)
En la función ganancia_dB() las variables gain y db son variables locales, es decir, las usa
solo esta función y al acabar su ejecución se borran. Los parámetros x e y también actúan
como variables locales.
Las funciones pueden incluir también variables globales. Éstas se declaran dentro de la función
precedidas por la palabra reservada global. Si una variable del programa principal tiene el
mismo identificador que la definida como global dentro de una función, entonces será
modificada por cualquier asignación de la variable global. El uso de las variables globales se
63
Programación en Python Funciones
def f(x):
global a
a = 3
return 3*x
a = 7
print('Función:',f(4))
print('Valor de la variable global a:',a)
Función: 12
Valor de la variable global a: 3
>>>
Los parámetros de las funciones en Python se definen, como en el caso de las variables, con un
identificador válido. En otros lenguajes, en los que hay que definir el tipo de variables antes de
usarlas, habría que definir también el tipo de parámetro. Este no es el caso en Python, el tipo
de parámetro será el mismo que el tipo de argumento que se envía del programa. En este
tema diseñamos funciones que usan solo parámetros de tipos de datos simples (int, float,
bool) o strings. Estos tipos de datos no permiten que alguna acción modifique sus valores (es
decir son inmutables), solo cambiarían sus valores si la variable es asignada nuevamente. Esto
quiere decir que el paso de parámetros es por valor siempre en este tipo de datos. Un paso de
parámetros por valor significa que el valor del argumento se copia al parámetro a la función,
pero si el parámetro es modificado dentro de la función, su valor no se referencia a la variable
del argumento.
se observa que los argumentos, llamados ahora y (en lugar de Vi) y x (en lugar de Vo), ocupan
la primera y segunda posición, respetivamente, del llamado a la función dentro del print(). El
primer argumento (y) que vale 10 se envía al primer parámetro de la función (x) y el segundo
64
Programación en Python Funciones
argumento (x) que vale 100 se envía al segundo parámetro (y). Lo importante es la posición y
no los nombres de las variables y parámetros. El programa devuelve el mismo valor 40.0 dB.
def f1(x):
return (x/2 + 1)
def f2(x):
print(x/2 + 1)
La función f1() devuelve un resultado y se puede usar como una función matemática en una
expresión aritmética, pero, cuidado, f2() no es una función productiva, es un procedimiento o
void function. Miremos estos resultados al ser llamada:
>>> f1(5)
3.5
>>> f2(5)
3.5
>>> print(f1(10))
6.0
>>> print(f2(10))
6.0
None
>>> y = 4 + f1(6) # f1(6) devuelve 4, y se le asigna el valor 8
>>> y = 4 + f2(6) # f2(6) muestra el valor 4; pero errónea expresión
4.0
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
y = 4 + f2(6)
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
Al llamar la función f1() en el primer print(), f1(10) devuelve el valor 6.0 y la función lo
muestra, pero al llamar f2(10) dentro del segundo print(), esta función en su cuerpo de
instrucciones realiza la acción de imprimir la expresión de valor 6.0 y, al acabar sin return,
devuelve None, que también es mostrado por este print(). Luego, la instrucción y = 4 +
f1(6) llama la función f1() con argumento 6, la función devuelve 4.0 que se suma a 4 y a la
variable y se le asigna el valor 8.0. La instrucción y = 4 + f2(6), sin embargo produce un
error pues f2() es una función void o procedimiento. Se realiza la acción de mostrar 4.0, pero
al devolver f2() un None la expresión aritmética es incorrecta.
Al diseñar funciones se puede prever que un argumento tenga un valor por omisión si el
usuario lo omite al llamar la función. Por ejemplo, la función ganancia_dB puede considerar
que el usuario introduzca o no el valor de y:
65
Programación en Python Funciones
>>>
Ganancia = 20.0 dB
Ganancia = 10.457574905606752 dB
En el primer print(), la llamada a la función solo envía un argumento (Vi que vale 10), el
segundo argumento se toma el valor por omisión (y=100). En la segunda llamada se usan los
dos parámetros de la función. Se puede notar que en esta llamada el primer argumento es el
valor de la expresión Vi+5 (15).
Cuando una función tenga varios parámetros con valores de argumento por omisión, éstos se
pueden omitir pero también pueden ser llamados en cualquier orden, siempre que se use el
nombre del parámetro y su argumento asignado. Veamos el ejemplo siguiente,
>>>
3
15
8
El primer print muestra lo que retorna la función fkey(), que será (2 + 1)*(1 + 0). Los
otros print muestran llamadas a la función con argumentos keyword. Los argumentos con el
nombre del parámetro y su valor, del grupo de parámetros con valores por omisión, se colocan
sin importar el orden en que se introducen.
66
Programación en Python Funciones
Existe en Python el módulo doctest que incluye la función testmod. Esta función busca
fragmentos de texto en el docstring como las sesiones interactivas de Python, y luego ejecuta
esas sesiones para verificar que funcionan exactamente como se muestra.
Por ejemplo, la función ganancia_dB()se puede ejecutar varias veces en la consola de Python,
o se puede prever qué valores debe dar:
>>> ganancia_dB(1,1000)
60.0
>>> ganancia_dB(10,1000)
40.0
>>> ganancia_dB(1,1)
0.0
>>> ganancia_dB(10,1)
-20.0
import doctest
doctest.testmod(verbose=True)
67
Programación en Python Funciones
Trying:
ganancia_dB(1,1000)
Expecting:
60.0
ok
Trying:
ganancia_dB(10,1000)
Expecting:
40.0
ok
Trying:
ganancia_dB(1,1)
Expecting:
0.0
ok
Trying:
ganancia_dB(10,1)
Expecting:
-20.0
ok
1 items had no tests:
__main__
1 items passed all tests:
4 tests in __main__.ganancia_dB
4 tests in 2 items.
4 passed and 0 failed.
Test passed.
import doctest
doctest.testmod(verbose=True)
68
Programación en Python Funciones
-1
**********************************************************************
File "J:/pruebaDoctest2.py", line 12, in __main__.suma
Failed example:
suma(1, 2)
Expected:
3
Got:
-1
**********************************************************************
File "J:/pruebaDoctest2.py", line 14, in __main__.suma
Failed example:
suma(10, 10)
Expected:
20
Got:
0
**********************************************************************
1 items had failures:
2 of 2 in __main__.suma
***Test Failed*** 2 failures.
>>>
4.4 Recursividad
Una estructura recursiva puede contener otra del mismo tipo, es decir se integra por partes de
sí misma. La palabra recursivo se origina del latín “recurrere”, que significa “repetirse” o
“correr hacia atrás”. Por ejemplo, un objeto fractal se caracteriza por su estructura básica que
se repite a diferentes escalas. Se dice que tiene una estructura auto-similar. Por ejemplo, un
objeto fractal se caracteriza por su estructura básica que se repite a diferentes escalas.
El ejemplo más claro de una función recursiva es cálculo del factorial (denotado por el
símbolo!) de un número natural. El factorial se define en términos de sí mismo:
1 𝑠𝑖 𝑛 = 0
𝑛! = {
𝑛 ∗ (𝑛 − 1)! 𝑠𝑖 𝑛 > 0
Por ejemplo 4! Es 4 veces 3!, que a su vez es 3 veces 2!, que a su vez es 2 veces uno, que es 1
vez 0!, que es 1. Esto resulta en: 4! Es igual a 4 por 3 por 2 por 1 y por 1, que es 24.
Si diseñamos una función que calcule el factorial usando una composición iterativa de
recorrido puede ser de la forma:
69
Programación en Python Funciones
def factorial_iter(n):
if n == 0 :
result = 1
else:
result = 1
for i in range(1, n+1):
result = result*i
return result
# programa ppal
x = int(input('Dame un entero: '))
r = factorial_iter(x)
print('El factorial de ', x, ' es ', r)
Dame un entero: 4
El factorial de 4 es 24
def factorial_iter(n):
result = 1
for i in range(2, n+1):
result *= i
return result
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Esta función puede resultar poco elegante de acuerdo a los principios clásicos de la
programación estructurada, que indica que una función debe tener un solo punto de salida. Es
común encontrar funciones con más de un punto de salida. Para resolver esta controversia
modificamos esta última función con una bien estructurada:
def factorial(n):
if n == 0:
result = 1
else:
result = n*factorial(n-1)
return result
70
Programación en Python Funciones
Otra típica secuencia que puede ser calculada de forma recursiva es la formada por los
números de Fibonacci19: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … (la versión moderna suele
incluir también el 0 al comienzo de la secuencia). Los números de Fibonacci se pueden definir
como
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖1 = 1
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖2 = 1
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘 = 𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘−2 + 𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘−1 (𝑘 > 2)
Fibonacci 1 1 2 3 5 8 13 21 34 55 89 144 …
k 1 2 3 4 5 6 7 8 9 10 11 12 …
def fibo(k):
if k == 1 or k == 2:
result = 1
else:
result = fibo(k-1) + fibo(k-2)
return result
>>> fibo(8)
21
>>> fibo(10)
55
Problema! Las funciones recursivas necesitan mucha más memoria para ejecutarse ya que se
crean objetos a medida que se ejecutan. El tiempo de cálculo puede aumentar.
Muchos problemas sólo pueden resolverse de manera recursiva. Sin embargo, en aquellos en
los que no es imprescindible se recomienda utilizar un método iterativo alternativo.
def fiboI(k):
if k == 1 or k == 2:
result = 1
else:
a, b = 1, 1
for i in range(k-1):
a, b = b, a+b
result = a
return result
Comparamos tiempo (s) de cálculo con ambas opciones: fibo (recursiva) fiboI (iteraciones):
19
Puede consultarse google o https://en.wikipedia.org/wiki/Fibonacci_number
71
Programación en Python Funciones
import time as t
for i in range(30,36):
ini = t.time()
print('k = ',i,', F:',fibo(i),', fibo:',round(t.time()-ini,3),end=' ')
ini=t.time()
f=fiboI(i)
print(', fiboI: %.15f' % (t.time()-ini))
Las funciones que hemos definido se pueden guardar en un módulo para ser reutilizadas
cuando queramos. Si tenemos un gran número de funciones lo usual es crear varios módulos
con funciones del mismo tema. Por ejemplo un módulo de nuestras funciones para el
procesado de señales, otro para el procesado de imágenes, otro para procesar audio, etc. La
colección de módulos se puede guardar en una carpeta formando un package en Python.
72
Programación en Python Funciones
pi = 3.14159
def AreaCirc(radio):
return pi*radio**2
def PerimCirc(radio):
return 2*pi*radio
Igual que los módulos internos y math, el módulo Geomet.py lo podemos importar para luego
hacer uso de sus funciones y constantes. Por ejemplo,
Produce:
>>>
0.7853975
12
Se pueden importar todas las funciones y valores del módulo, en lugar de cada una de ellas,
con *,
import Geomet
x = Geomet.pi*4
print(x)
print(Geomet.AreaCirc(0.5))
73
Programación en Python Funciones
Ejercicios
3. Cambio de monedas. Diseña una función cambio_monedas(cent) que reciba una cierta
cantidad de céntimos, cent, y retorne su equivalente en el mínimo número de monedas
de curso legal (2 euros, 1 euro, 50 céntimos, 20 céntimos, 10 céntimos, 5 céntimos, 2
céntimos y 1 céntimo).
Entrada: La función recibe un valor cent que representa una cantidad de céntimos
Salida: devuelve los valores de las monedas legales desde 2 euros hasta 1 céntimo
Ejemplos:
>>> cambio_monedas(587)
(2, 1, 1, 1, 1, 1, 1, 0)
4. Formato fechas. Algunos programas actuales como el WhatsApp, guardan las imágenes y
videos con un nombre que contiene la fecha en el formato AAAAMMDD. Por ejemplo, la
1ra imagen del 18/07/2017 la guarda como IMG-20170718-WA0001. y el 3er video del
día es VID-20170718-WA0003.
a) Diseña una función CodData(d,m,a) que contenga tres parámetros de entrada:
día, mes y año (d,m,a) realice la conversión al formato AAAAMMDD y lo retorne.
Ejemplo:
>>> CodData(18,7,2017)
20170708
b) Diseña una función que realice la conversión de fechas inversa a la del ejercicio a). El
parámetro de entrada será una fecha en formato AAAAMMDD y retornará el día, mes y
año correspondiente. Ejemplo:
>>> CodData(20170718)
74
Programación en Python Funciones
(18, 7, 2017)
5. Impuestos. Una empresa desea calcular la estimación del importe de impuestos que los
empleados deben pagar. Los ingresos inferiores a 8.000 euros no están sujetos a
impuestos; los comprendidos entre 8.000 euros y 20.000 euros, lo están al 18 %; los
comprendidos entre 20.000 euros y 35.000 euros, están sujetos al 27% y los superiores a
35.000 euros, lo están al 38%. Diseña una función impuestos(x) que calcule los
impuestos correspondientes a los ingresos x.
Entrada: Un valor x de ingresos.
Salida: Los impuestos correspondientes a x con 2 decimales.
Ejemplos:
>>> impuestos(15000)
2700.0
>>> impuestos(55346)
21031.48
6. IMC. Diseña una función imc(p,h) que reciba reciba el peso p y la altura h de una
persona, calcule el índice de masa corporal de una persona (IMC = peso[kg]/altura2[m]) y
retorne el estado en el que se encuentra esa persona en función del valor de IMC:
- <16: criterio de ingreso hospitalario
- de 16 a 17: infrapeso
- de 17 a 18: bajo peso
- de 18 a 25: saludable
- de 25 a 30: sobrepeso
- de 30 a 35: sobrepeso crónico
- de 35 a 40: obesidad premórbida
- >40: obesidad mórbida
Entrada: Peso p y altura h.
Salida: Estado.
Ejemplos:
>>> imc(1.65,68)
'saludable'
7. Riesgo Cardiaco. Diseña una función que reciba el peso p en kg, la altura h en metros, el
valor del colesterol de lipoproteínas de baja densidad, LDL en mg/dl y si es fumador (o
no, variable booleana). La función devuelve si está en riesgo de insuficiencia cardiaca si
se cumple que: el índice de masa corporal (IMC = peso[kg]/altura2[m]) es mayor que 35
y que el colesterol (LDL) está por debajo de 71 mg/dl o por encima de 300 mg/dl, o si es
fumador. Ejemplo, riesgoCardio(p,h,LDL,fuma):
>>> riesgoCardio(95,1.64,310,False)
True
>>> riesgoCardio(90,1.64,310,False)
False
8. Número perfecto. Diseñe una función que encuentre el primer número perfecto mayor
que 28 (o un número n dado). Un número es perfecto si coincide con la suma de sus
divisores (excepto él mismo). Por ejemplo, 28 es perfecto ya que 28 = 1 + 2 + 4 + 7 + 14 .
75
Programación en Python Funciones
>>> perfecto(28)
496
>>> perfecto(500)
8128
9. Números armónicos. Diseña una función harmon(n) que lea un número n e imprima el n-
ésimo número armónico, definido como Hn = 1/1 + 1/2 + ⋯ + 1 / n.
Entrada: un número natural n.
Salida: Hn con 4 dígitos después del punto decimal.
>>> harmon(2)
1.5000
>>> harmon(7)
2.5929
10. Triángulo de asteriscos. Escribir una función no productiva triang(n) que, dado un
número n, imprime un "triángulo de asteriscos de tamaño n".
>>> triang(3)
*
**
***
>>> triang(5)
*
**
***
****
*****
11. Es primo? Diseña una función es_primo(n) que reciba un natural n y devuelva True si el
número es primo o False en caso contrario. Se asume que n > 1.
>>> es_primo(15)
False
>>> es_primo(349)
True
12. Cuántos primos. Diseña una función cuantos_primos(n) que devuelva el número de
primos que existen en el intervalo (1, n) (se excluyen). Usar la función es_primo.
>>> cuantos_primos(15)
6
13. Fibonacci secuencia. Diseña una función fiboP(k) (no productiva) que reciba un
número natural k y escriba los primeros n números de la serie de Fibonacci. Los
dos primeros números de esta serie son unos, y a partir de éstos, cada número
de la secuencia se calcula realizando la suma de los dos anteriores.
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖1 = 1
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖2 = 1
𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘 = 𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘−2 + 𝐹𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖𝑘−1 (𝑘 > 2)
Fibonacci 1 1 2 3 5 8 13 21 34 55 89 144 …
k 1 2 3 4 5 6 7 8 9 10 11 12 …
76
Programación en Python Funciones
>>> fiboP(8)
1
1
2
3
5
8
13
21
14. Seno por serie de Taylor. Diseña una función seno_t(x, error=1e-9) que reciba un valor
en grados, lo transforme en radianes y que aproxime el valor de su seno, según su
desarrollo en serie de Taylor. La función puede tener el valor del error por omisión, que
sirve para terminar la iteración cuando un término sea menor que el error.
∞
(−1)𝑛 2𝑛+1 𝑥3 𝑥5 𝑥7 𝑥9
𝑠𝑒𝑛𝑜(𝑥) = ∑ 𝑥 = 𝑥− + − + −⋯
(2𝑛 + 1)! 3! 5! 7! 9!
𝑛=0
>> seno_t(45)
0.7071067811796194
15. Seno por serie de Taylor v2. Diseña una función seno_t2(x, error=1e-9) que reciba un
valor en grados, lo transforme en radianes y que aproxime el valor de su seno, según su
desarrollo en serie de Taylor. No utilizar ni las funciones factorial de math ni elevar xn,
usar los términos anteriores para reducir el tiempo de cálculo.
77
Programación en Python Datos estructurados
Para la mayoría de los ejemplos hemos usado datos simples, que tiene asociado un único
valor: un entero, un real o un booleano. Se dice que son objetos escalares por ser indivisibles,
es decir no tienen una estructura interna accesible. También hemos introducido datos
compuestos como los textos o cadena de caracteres, representados con strings, así como las
secuencias en forma de listas que utilizamos para recorrer elementos en las composiciones
iterativas for. Estos tipos de datos no son escalares pues se pueden dividir en elementos y
acceder a ellos, son datos estructurados.
Los datos estructurados o compuestos contienen elementos, que pueden ser datos simples u
otros datos compuestos. Recordamos que tanto los datos simples como compuestos en
Python son tratados como un objeto.
Los elementos pueden ser todos del mismo tipo, como los string que contiene caracteres, y en
este caso se llaman datos estructurados homogéneos. Otros lenguajes (C/C++, Matlab, Pascal)
disponen de estructuras homogéneas como el array (arreglo o tabla), muy útiles para
operaciones con vectores o matrices. El Python estándar no dispone de una estructura como
array de C o Pascal aunque la librería de Python numérico (NumPy)20 sí incluye estas opciones.
También los elementos pueden ser de distinto tipo, como en las listas que hemos introducido
previamente. Este tipo se suele llamar datos estructurados heterogéneos. En Python, excepto
los string, los demás tipos de datos compuestos son heterogéneos, logrando una alta
flexibilidad para el tratamiento de datos de problemas de todo tipo. En lenguajes como el
Pascal, C/C++ y Matlab, se usan registros (record en Pascal), y estructuras (struc en C/C++,
structure en Matlab) para el tratamiento de datos estructurados heterogéneos.
En Python los datos compuestos o estructurados los podemos clasificar en dos grupos, de
acuerdo a la característica de si sus elementos pueden o no ser cambiados, reducidos o
ampliados: datos estructurados mutables e inmutables.
En Python tenemos como datos estructurados inmutables las cadenas de caracteres (string) y
las tuplas (tuple), como secuencias de datos, y los conjuntos congelados (frozenset).
20
http://www.numpy.org/ Disponible en Spyder de Winpython o Anaconda.
78
Programación en Python Datos estructurados
Los string, introducidos ya en la sección 2.1, son una secuencia de caracteres de cualquier tipo
(letras, números, caracteres especiales; cualquier carácter Unicode) que forman un objeto de
Python.
El valor 'casa de madera' es un objeto tipo string, que incluye una secuencia de 14
caracteres. Este valor se asigna a la variable s, que se referencia al mismo objeto. Accedemos
al primer elemento con el índice 0 (letra_1 = s[0]). Tal como lo indicamos en la
introducción de las listas, recordemos que en Python el primer elemento de las secuencias
está en la posición 0 cuando se indexa (accede).
c a s a d e m a d e r a
0 1 2 3 4 5 6 7 8 9 10 11 12 13
-14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Figura 11. Elementos del string y los índices para accederlos (positivos y negativos).
Se puede crear un string vacío: s = '' (dos comillas simples sin espacio), len(s) = 0.
Se presentan varios ejemplos de acceso a los elementos y recorte de segmentos del string de
la figura 11. En el comentario se indica el resultado:
79
Programación en Python Datos estructurados
En el operador de corte, si se omite el primer índice [:m] (anterior a los dos puntos) el recorte
comienza desde el primer elemento. Si se omite el segundo índice [n:] se recorta hasta el
final de la secuencia. Los índice negativos son útiles para acceder al último elemento [-1] o
últimos, sin requerir el uso de la función len().
Los otros operadores como concatenar (+) o repetir (*) strings son aplicables a cualquier
secuencia de datos,
>>> s1='casa'
>>> s2 = s1 + ' grande'
>>> s2
'casa grande'
>>> s3 = 3*s1 + '!'
>>> s3
'casacasacasa!'
Recordemos que este tipo de dato se considera inmutable porque no podemos cambiar los
valores de sus elementos ni cambiar su tamaño. Si queremos hacer eso debemos crear otra
variable (y otro valor de string antes, claro). Veamos, si queremos poner en mayúscula la
primera letra del string s del ejemplo anterior, nos da error:
80
Programación en Python Datos estructurados
Esta acción de poner en mayúscula la primera letra del string se puede hacer de manera
automática, como se muestra en la siguiente sección, pero creando una nueva variable.
Python es un lenguaje orientado a objetos y los datos en Python están en los objetos. En la
programación orientada a objetos, los objetos tienen asociados métodos para que manipulen
sus datos. Los métodos son similares a las funciones, ya que reciben argumentos y devuelven
valores. Los strings tienen métodos que le son propios. Por ejemplo, el método upper toma un
string y devuelve otro string pero con las letras en mayúsculas.
El método upper en lugar de ser aplicado al string s = 'casa de madera', como una
función, upper(s), se aplica de la forma s.upper(). Es decir, se aplica un método sobre sus
valores. Veamos varios métodos de los strings (hay métodos con y sin argumentos):
En el cuadro anterior se muestran un grupo de métodos típicos sobre los valores de los string.
Resolvimos el problema de poner la primera letra en mayúscula con el método
capitalize().El método split divide el string en segmentos de acuerdo al delimitador que
se use como argumento, que en este caso es el espacio en blanco. El argumento ' ' es el
argumento por omisión, por lo que puede usarse s.split() para separar palabras en un
texto. Los substring (palabras, en este caso) resultantes son devueltos en una lista con los
substring como elementos.
81
Programación en Python Datos estructurados
def contar_a(s):
"""Contar letra a en un string
>>> contarLetra('patata caliente','a')
4
>>> contarLetra('Esplugues','a')
0
"""
n = 0
for c in s:
if c == 'a':
n = n + 1
return n
def contar_a(s):
return s.count('a')
def contar(s,c1):
"""Contar letra o sub-string c1 en string s
Ejemplos:
>>> contar('patata caliente','a')
4
>>> contar('patata','u')
0
"""
n = 0
for c in s:
if c == c1:
n = n + 1
return n
La búsqueda de un carácter o sub-string en un string se puede hacer con las estructuras for,
while o directamente con algún método de los strings. Veamos primero las opciones de
búsqueda clásica con for y while
def buscar(s,c1):
"""buscar letra c1 en string s
Ejemplos:
>>> buscar('patata caliente','a')
True
>>> buscar('patata','u')
False
"""
OK = False
for c in s:
if c == c1:
OK = True
break
return OK
82
Programación en Python Datos estructurados
def buscar(s,c1):
"""buscar letra c1 en string s
Ejemplos:
>>> buscar('patata caliente','a')
True
>>> buscar('patata','u')
False
"""
OK = False
N = len(s)
i = 0
while i<N and not OK:
if s[i] == c1:
OK = True
i += 1
return OK
En Python podemos salir de la función dentro de un bucle, así la búsqueda puede ser:
def buscar(s,c1):
"""buscar letra c1 en string s
Ejemplos:
>>> buscar('patata caliente','a')
True
>>> buscar('patata','u')
False
"""
for c in s:
if c == c1:
return True
return False
Pero esta búsqueda se puede hacer con los métodos count(), find() o simplemente con el
operador booleano in:
def buscar(s,c1):
"""buscar letra c1 en string s
Ejemplos:
>>> buscar('patata caliente','a')
True
>>> buscar('patata','u')
False
"""
return c1 in s
#return s.count(c1)>0
#return s.find(c1)>=0
5.1.2. Tuplas
Las tuplas, como los string, son una secuencia de elementos ordenados en un objeto de
Python. A diferencia de los strings (elementos son caracteres) las tuplas pueden contener
elementos de cualquier tipo, incluso elementos de diferente tipo. Los elementos se indexan
igual que los string, a través de un número entero. La sintaxis de las tuplas es una secuencia de
valores separados por comas. Aunque no son necesarios, se suelen encerrar entre paréntesis,
83
Programación en Python Datos estructurados
# Ejemplo de tuplas
>>> a = 1, 2, 3
>>> a
(1, 2, 3)
>>> b = (3, 4, 5, 'a')
>>> b
(3, 4, 5, 'a')
>>> type(a)
<class 'tuple'>
>>> type(b)
<class 'tuple'>
Los objetos asignados a las variables a y b son tipo tuplas. Lo importante es incluir las comas
entre los elementos. Por ejemplo,
>>> t = 'k',
>>> t
('k',)
>>> type(t)
<class 'tuple'>
>>> t2 = 'k'
>>> t2
'k'
>>> type(t2)
<class 'str'>
El objeto 'k', es una tupla, sin embargo 'k' es un string. Se puede crear una tupla vacía
usando paréntesis sin que incluya nada: (). Podemos también usar la función interna tuple()
para convertir una secuencia iterable, como un string o una lista, a tupla, o crear una tupla
vacía:
>>> tuple('Hola')
('H', 'o', 'l', 'a')
>>> tuple([1, 2])
(1, 2)
>>> tuple()
()
84
Programación en Python Datos estructurados
Se observa la característica estática o inmutable de las tuplas, al igual que los string. Podemos
incluir tuplas dentro de las tuplas y concatenarlas y repetirlas, como los string,
Además, así como en las secuencias string, en las tuplas se pueden utilizar las operaciones de
concatenar (+) y repetir (*) tuplas y los operadores in y not in de pertenencia de elementos en
tuplas.
Python permite asignaciones múltiples mediante asignaciones con tuplas. Estas acciones
permiten que a una tupla de variables a la izquierda de una asignación le sea asignada una
tupla de valores a la derecha de ésta. La condición a cumplir es que el número de variables de
la tupla de variables sea igual al número de elementos de la tupla de valores. Incluso, el objeto
a asignar de forma múltiple a la tupla de variables puede ser un string o una lista, siempre que
el número de caracteres o elementos sea igual al número de variables de la tupla a la que se le
asignan los valores. Veamos unos ejemplos
85
Programación en Python Datos estructurados
En la primera tupla de variables (a,b,c) las variables reciben valores enteros. Aunque este
objeto es de tipo estructurado, tupla, sus elementos son variables de tipo entero. De igual
forma, la tupla de variables (d,e,f) recibe cada una de ellas valores de tipo string y sus
variables serán tipo string.
Esta característica de asignaciones con tuplas permite resolver de manera simple el típico
problema de intercambio de variables, sin requerir de una variable auxiliar. Por ejemplo, si
queremos intercambiar los valores de las variables x = 5 e y = 7, en los lenguajes clásicos se
haría:
>>> x = 5
>>> y = 7
>>> temp = x # uso de variable auxiliar (temporal) temp
>>> x = y
>>> y = temp
>>> print(x, y)
7 5
>>> x = 5
>>> y = 7
>>> x, y = y, x
>>> print(x, y)
7 5
En el caso de las funciones, éstas también pueden devolver múltiples resultados que pueden
ser asignados a múltiples variables con el uso de tuplas. Siendo estrictos, las funciones solo
devuelven un resultado. Pero si ese valor es una tupla, entonces ésta se puede asignar a una
tupla de variables. Se requiere que el número de elementos coincida. Veamos la siguiente
función como ejemplo:
def miFuncion(x):
"""
Devuelve 2 valores: x incrementado y decrecido en 1
"""
return x + 1, x - 1
a, b = miFuncion(10)
print(a, b)
print(miFuncion(20))
86
Programación en Python Datos estructurados
>>>
11 9
(21, 19)
La función devuelve una tupla de dos valores. En la primera instrucción del cuerpo principal del
programa estos valores se asignan a la tupla con las variables a y b. Cada una de esta variables
es de tipo entero y, para el argumento 10 de la función, reciben los valores 11 y 9,
respectivamente. Estos valores los muestra el primer print(). El segundo print() muestra
directamente la tupla que devuelve la función.
def media(*par):
suma = 0
for elem in par:
suma = suma + elem
return suma/len(par)
print(media(3, 4))
print(media(10.2, 14, 12, 9.5, 13.4, 8, 9.2))
print(media(2))
>>>
3.5
10.9
2.0
La función calcula el valor medio de la secuencia de números que se envía como argumento al
parámetro de entrada, que espera recibir una tupla. Se puede mejorar la función para evitar
dividir por 0, en caso de introducir una tupla vacía.
Al igual que en los string, existen métodos asociados a los objetos tipo tupla y listas. Pero solo
los métodos: s.index(x) y s.count(x). También se pueden usar las funciones internas max y
min, cuando las tuplas (o listas) sean de valores numéricos. Si los elementos son strings, calcula
el mayor o menor elemento, de acuerdo a la posición en la tabla ASCII del primer carácter.
Veamos algunos ejemplos,
87
Programación en Python Datos estructurados
Función zip
Es un iterador que opera sobre varios iterables, y crea tuplas agregando elementos de las
secuencias iterables (string, tuplas, listas, etc.). Ejemplo
def CuentaElemsMismaPosición(s1,s2):
""" Dice cuántas letras iguales están en la misma posición en 2
palabras s1 y s2. Se pueden usar listas o tuplas
>>> CuentaElemsMismaPosición('Hola', 'Colado')
3
"""
contador = 0
for c1, c2, in zip(s1,s2):
if c1 == c2:
contador += 1
return contador
Los conjuntos congelados son inmutables porque no se pueden cambiar, ni quitar o añadir
elementos. Ejemplos de datos congelados:
88
Programación en Python Datos estructurados
Los elementos repetidos (25 y 'a') que incluimos en el conjunto congelados fueron
desechados.
A diferencia de los string, tuplas y conjuntos congelados, los datos estructurados mutables,
llamados también dinámicos (Peña, 2015), se caracterizan porque sus elementos pueden
cambiar de valor y se puede añadir o eliminar elementos.
En Python tenemos como datos estructurados mutables las listas, los conjuntos (Set) y los
diccionarios. Se puede considerar que las listas y conjuntos (Set) son los equivalentes mutables
a las tuplas y conjuntos congelados (Frozenset), respectivamente.
5.2.1. Listas
Las listas, así como las tuplas y strings, están formadas por una secuencia de datos. Pero a
diferencia de las tuplas sus elementos pueden ser modificados, eliminarse o aumentarse. Los
elementos de las listas pueden ser datos simples (numéricos o booleanos), strings, tuplas u
otras listas. Los elementos se indexan igual que las tuplas y string, a través de un número
entero. La sintaxis de las listas es una secuencia de valores separados por comas encerrados
entre corchetes. Ejemplos:
La lista v1 está formada por números enteros, mientras que v2 incluye enteros, reales, strings,
tuplas y una lista como su último elemento. La variable juegos refiere a un objeto lista con 5
elementos de tipo string. Es similar a la tupla definida previamente pero sus elementos pueden
ser modificables. Es una estructura dinámica.
Podemos generar una lista con una secuencia de números enteros con el tipo de datos
range(), de la forma,
89
Programación en Python Datos estructurados
>>> v = list(range(1,11))
>>> v
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
En las versiones de Python 2.x, range() es una función que genera directamente una lista. Sin
embargo en las versiones 3.x, al ser range() un tipo de dato range, tenemos que convertirlo a
lista con la función list(). Esta función también sirve para convertir tipos de datos iterables,
como strings o tuplas a tipo lista. Se puede crear también una lista vacía. Ejemplos:
>>> t = (1, 2, 3)
>>> list(t)
[1, 2, 3]
>>> s = 'Hola'
>>> list(s)
['H', 'o', 'l', 'a']
>>> e = list() # lista vacía
>>> e = [] # lista vacía
Se puede observar la mutabilidad de las listas. Las listas pueden concatenarse y repetirse con
los operadores + y *, respectivamente, como los string y tuplas,
90
Programación en Python Datos estructurados
Además, así como en las secuencias string y tuplas, en las listas se pueden concatenar con el
operador + y repetir con el operador *. Los operadores booleanos in y not in, como en los
strings y tuplas, evalúan si un elemento pertenece o no a una secuencia (string, tupla o
lista). Ejemplos
Se dispone en Python del operador is que indica si dos variables están referidas al mismo
objeto o no. Si ejecutamos las instrucciones
>>> a = 'casa'
>>> b = 'casa'
>>> id(a)
123917904
>>> id(b)
123917904
>>> a is b
True
Podemos ver que ambas variables a y b están referidas al mismo objeto, que tiene valor
'casa' y ocupa la posición de memoria 123917904 (esta posición es arbitraria). La
instrucción a is b es cierta.
a
'casa'
b
En los tipos de dato string, al ser inmutables, Python crea solo un objeto por economía de
memoria y ambas variables están referidas al mismo objeto. Sin embargo con las listas, al ser
mutables, aunque se formen dos listas con los mismos valores, Python crea dos objetos, que
ocupan diferente posición de memoria:
91
Programación en Python Datos estructurados
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
123921992
>>> id(b)
123923656
>>> a is b
False
a [1, 2, 3]
b [1, 2, 3]
Las listas asignadas a las variables a y b, aunque con el mismo valor, son objetos diferentes.
Pero hay que tener cuidado con las asignaciones de variable al mismo objeto mutable. En el
siguiente ejemplo al copiar una variable no se crea otro objeto sino que el copiado se refiere al
mismo objeto:
>>> a = [1, 2, 3]
>>> b = a
>>> id(b) # a y b --> [1, 2, 3]
123921992
>>> a is b
True
Se puede decir que la variable b es un alias de a y que están referenciadas. Por lo tanto si
modificamos o añadimos un valor al objeto [1, 2, 3], a través de una de las variables,
entonces modificamos la otra. Veamos
>>> b[0] = 15
>>> a
[15, 2, 3]
Este efecto puede dar resultados inesperados si no se maneja con cuidado. Sin embargo, esta
propiedad sirve para pasar parámetros por referencia en funciones que se comporten como
procedimiento. Si queremos copiar una variable de otra, se disponen del método copy, que se
presentará a continuación.
Al ser las listas modificables, se dispone de un grupo amplio de métodos asociados a los
objetos listas, que permiten añadir nuevos elementos, quitarle elementos, ordenarlos, etc. Hay
que recordar que se usa el operador punto (.) para acceder a los métodos de los objetos.
Veamos algunos ejemplos:
>>> v = [1, 2, 3, 4, 5]
>>> v.append(6) # añade un objeto al final de la lista
>>> v
[1, 2, 3, 4, 5, 6]
>>> v2 = v.copy() # copia la lista en otro objeto
>>> v.count(3) # cuenta las veces que aparece el elemento (3)
1
92
Programación en Python Datos estructurados
def ProdEsc(v1,v2):
""" Funcion que calcula el producto escalar de 2 vectores
>>> ProdEsc([1,1,1],[2,2,2])
6
"""
n1 = len(v1)
suma = 0
for i in range(n1):
suma += v1[i]*v2[i]
return suma
print(ProdEsc([1, 2],[3, 4]))
print(ProdEsc([1,1],[4,5]))
93
Programación en Python Datos estructurados
>>>
11
9
def ProdEsc(v1,v2):
""" Funcion que calcula el producto escalar de 2 vectores
>>> ProdEsc([1,1,1],[2,2,2])
6
"""
suma = 0
for a,b in zip(v1,v2):
suma += a*b
return suma
print(ProdEsc([1, 2],[3, 4]))
print(ProdEsc([1,1],[4,5]))
Suma de 2 vectores. Se chequea que sean del mismo tamaño. Opción 1: pre-asignar lista de 0’s
def SumaVect(v1,v2):
""" Funcion que calcula la suma de 2 vectores
>>> SumaVect([1,1,1],[2,2,2])
[3, 3, 3]
>>> SumaVect([1,1],[2,2,2])
-1
"""
n1 = len(v1)
n2 = len(v2)
if n1 != n2: # chequea que sean del mismos tamaño
vsuma = -1 # -1 indica: error, vectores distinto tamaño
else:
vsuma = n1*[0] # vector de 0's, preasignado
for i in range(n1):
vsuma[i] = v1[i] + v2[i]
return vsuma
def SumaVect(v1,v2):
""" Funcion que calcula la suma de 2 vectores
>>> SumaVect([1,1,1],[2,2,2])
[3, 3, 3]
>>> SumaVect([1,1],[2,2,2])
-1
"""
n1 = len(v1)
n2 = len(v2)
if n1 != n2: # chequea que sean del mismos tamaño
vsuma = -1 # -1 indica: error, vectores distinto tamaño
else:
vsuma = [] # vector (lista) vacío
for i in range(n1):
vsuma.append(v1[i] + v2[i]) # se añaden elementos sumados
return vsuma
94
Programación en Python Datos estructurados
Una lista anidada es una lista donde sus elementos son a su vez listas. Este tipo de objeto es
útil para representar tablas o matrices de datos. Por ejemplo, la matriz
1 2 3 4
[5 6 7 8]
9 10 11 12
En un editor de Python se puede escribir saltando a la siguiente línea después de la coma que
separa cada elemento de la lista (que representa una fila de la matriz):
m = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
Probemos dos matrices definidas con listas e intentemos sumarlas; por ejemplo,
1 1 1 0 2 1
[ ]+[ ]=[ ]
1 1 0 1 1 2
1 1
1 1
[ ] (¡No es lo que se esperaba al sumar dos matrices)
1 0
0 1
Ejemplos.
Función suma de elementos de matriz. Función que devuelve la suma de los elementos de una
matriz:
95
Programación en Python Datos estructurados
96
Programación en Python Datos estructurados
List comprenhensions: Son herramientas para transformar una lista (o cualquier iterable) en
otra lista. Tratan de emular la notación de Conjuntos usada en matemáticas. Por ejemplo:
{x | x > 10} o { x2 | x ∈ ℕ }
Se produce una lista que contiene los valores de la secuencia S seleccionada por el predicado P
y mapeada por la función f. La sentencia if es opcional, y pueden existir varias sentencias
for, cada una con su propia cláusula opcional if, para representar bucles anidados.
Ejemplo: Crear una lista de números quintuplicados del 1 al n. Con el método clásico sería:
>>> n = 10
>>> [5*x for x in range(1,n+1)]
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
Ejemplos: Filtrar (quitarle) a una lista sus números negativos. Método clásico:
lst = [1,2,-3,5,-6,0,12,-1,7]
lst2 = [] # Método clásico
for x in lst:
if x>=0:
lst2.append(x)
97
Programación en Python Datos estructurados
0 0 0 0
𝐴 = [0 0 0 0]
0 0 0 0
>>> nfilas= 3
>>> ncolum = 4
>>> A = [[0]*ncolum for i in range(nfilas)]
>>> A
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Se presenta a continuación un programa que lee dos matrices (N×N) utilizando listas y realiza
su suma, a través de la composición iterativa for - in.
Este ejemplo muestra cómo recorrer una estructura de listas anidadas. Deben usarse dos
índices para recorrer las listas dentro de las listas, que representan las columnas de cada fila.
Cuando se asignan valores desde el teclado hay que prefijar el tamaño de la lista (inicializarla),
98
Programación en Python Datos estructurados
para luego asignarle valores, para lo que usamos el método de list comprenhension.
Alternativamente se puede usar el método append e ir aumentando el tamaño del objeto a
medida que sumamos elementos. Resultado al introducir un número de filas igual a 2:
print(SumaMat([[1,2],[3,4]],[[5,5],[5,5]]))
>>>
[[6, 7], [8, 9]]
Hay que tener cuidado al hacer copia de listas para ser usadas (apuntadas) por distintas
variables. Veremos el siguiente ejemplo donde la variable apunta a la misma lista de a:
99
Programación en Python Datos estructurados
Al modificar b (objeto al que apunta b) también se modifica a!! Para copiar mutables, como las
listas se puede hacer una copia superficial, que funciona siempre que no tenga listas anidadas.
Copia superficial. Si no tiene listas anidadas se puede hacer con el operador recorte [:] o la
función copy del módulo copy,
Es posible copiar estructuras de listas superficiales con el operador de corte o la función copy
sin tener ninguno de los efectos secundarios que se describió anteriormente. Pero, si se
sustituye un elemento profundo, es decir, un elemento de una lista anidada en la lista, sí que
afecta a la variable copiada, veamos este ejemplo:
100
Programación en Python Datos estructurados
Copia profunda (deep copy). Es una copia profunda con la función deepcopy del módulo copy.
La función deepcopy permite copiar completamente una lista, es decir, profundamente en sus
sub-listas. Veamos en el código siguiente que la variable c no se afecta por los cambios que se
hagan en la variable a. Sin embargo b sí se ve afectada.
Los arreglos de números o tablas se pueden trabajar mucho más eficientemente con los
objetos array del paquete (package) de NumPy21. Estos módulos de cálculo numérico son una
extensión del Python, pero muy útiles para el tratamiento de vectores y matrices, de forma
similar al Matlab.
Los arrays de NumPy son datos estructurados homogéneos, similares a las listas (éstas son
heterogéneas), pero enfocados al cálculo usando vectores y matrices. Los arrays suelen
contener números enteros, reales y complejos. Los números complejos, que aún no los
habíamos introducido, es otro tipo de dato numérico en Python. Su sintaxis es:
Los arrays de NumPy que se formen con listas de enteros y reales, transforman todos sus
elementos a reales. Si algún elemento de la lista es complejo, todos serán complejos. Para
crear un array se importa la librería de cualquiera de las formas que hemos indicado
previamente. Por ejemplo (realizado en Spyder de WinPython):
21
http://www.numpy.org/ Disponible en Spyder de Winpython, http://winpython.sourceforge.net/,
anaconda, https://anaconda.org/anaconda/numpy y en http://scipy.org/
101
Programación en Python Datos estructurados
soluciones de un conjunto de n ecuaciones pueden agruparse en el vector (x1, x2, x3, …, xn). Los
datos numéricos de una señal muestreada en el tiempo se pueden agrupar en un vector.
Haremos un par de programas con las funciones de NumPy para sumar 2 vectores. En el
primer programa se declaran los valores de los vectores. En el segundo, se pide el tamaño del
vector al usuario, se leen los valores del teclado, se realiza el cálculo y se muestra el resultado.
La inicialización de los vectores se hace para prefijar su tamaño. Es una buena opción crear un
vector de ceros o de unos, que luego se le añaden los elementos.
import numpy as np
v1 = np.array([1, 2, 3.2])
v2 = np.array([5, 5, 5])
v3 = v1 + v2
print(v3)
import numpy as np
v1 = np.zeros(3) # se crea un vector de 3 ceros (reales)
print("Introduce vector 1:")
for i in range(len(v1)):
v1[i]=int(input("Elemento "+str(i)+": "))
v2 = np.zeros(3)
print("Introduce vector 2:")
for i in range(len(v1)):
v2[i]=int(input("Elemento "+str(i)+": "))
v3 = v1 + v2
print(v3)
Introduce vector 1:
Elemento 0: 3
Elemento 1: 3
Elemento 2: 3
Introduce vector 2:
Elemento 0: 4
Elemento 1: 4
Elemento 2: 4
[ 7. 7. 7.]
Los objetos array se indexan y recortan de igual forma que las listas. También incluyen
métodos asociados para hallar varias funciones matemáticas sobre sus elementos, como la
suma, la media, desviación estándar, el máximo, etc. En el ejemplo anterior, v3.sum()
devuelve el valor 21.0. Convertir un objeto array a lista se hace con el método tolist. Por
ejemplo, v3.tolist() retorna la lista [ 7. 7. 7.].
Las matrices que se presentaron con listas anidadas pueden también operarse con arrays.
Veamos varios ejemplos:
102
Programación en Python Datos estructurados
En los arrays de Numpy, se pueden realizar directamente operaciones con funciones en lugar
de recorrerlas con una composición iterativa. Se puede vectorizar la operación. Algunas
funciones internas de Python, como max(), min() y sum(), también se pueden aplicar sobre
una secuencia tipo tupla o lista. Supongamos que queremos aplicar una función matemática a
un vector. En lugar de utilizar un bucle para recorrer el vector, podemos hacer:
import numpy as np
def f(x):
return 4*2**x
a = np.array(range(1,11))
y = f(a)
print('El vector',a)
print('Aplicada la función f(x) = 4*2**x se obtiene')
print(y)
El vector [ 1 2 3 4 5 6 7 8 9 10]
Aplicada la función f(x) = 4*2**x se obtiene
[ 8 16 32 64 128 256 512 1024 2048 4096]
import numpy as np
def f(x):
return 1/2**x
N = int(input('Entra el número de términos: ' ))
a = np.array(range(1,N+1))
y = f(a)
print('El vector',y)
print('La suma es', sum(y))
103
Programación en Python Datos estructurados
Los conjuntos (Set) son equivalentes a los Frozenset pero son estructuras mutables. Los
conjuntos son una colección de elementos únicos e inmutables que no están ordenados.
Siguen la idea de los conjuntos en matemáticas, donde los elementos no deben repetirse.
Pueden contener números, string, tuplas, pero no listas.
Los conjuntos no pueden indexarse ni recortarse, pero se le pueden añadir o quitar elementos
aunque solo a través de sus métodos asociados. Ejemplos conjuntos:
5.2.6. Diccionarios
Un diccionario es un objeto de Python similar a una lista, excepto que sus elementos pueden
accederse a través de índices que no necesariamente tienen que ser enteros. Pueden ser de
tipo texto (string) u otro tipo inmutable. Los índices se llaman claves (keys). Así, el diccionario
está formado por pares de clave-valor. Su sintaxis se aprecia en el ejemplo:
104
Programación en Python Datos estructurados
Son datos estructurados mutables, por lo que podemos añadirle un nuevo par clave-valor:
>>> temperatura['Valencia'] = 26
>>> temperatura
{'Sevilla': 25.5, 'Lisboa': 17.5, 'Valencia': 26, 'Londres': 15.4}
>>> temperatura['Londres']
15.4
>>> del temperatura['Sevilla']
>>> temperatura
{'Lisboa': 17.5, 'Valencia': 26, 'Londres': 15.4}
Se puede recorrer un diccionario con una composición for – in, como otro dato estructurado,
usando las claves como índices, veamos:
El operador booleano in se puede emplear también en estas estructuras, pero se usa para
averiguar si una clave forma parte del diccionario:
Operación Descripción
len(d) Devuelve el número de ítems o pares clave-valor
del d(k) elimina el ítem con clave k
k in d True, si la clave k existe en el diccionario d
k not in d True, si la clave k no existe en el diccionario d
Métodos de diccionarios
Los objetos diccionarios tienen sus propios métodos asociados. Por ejemplo, se pueden
extraer las claves y los valores de un diccionario con los métodos keys y values.
105
Programación en Python Datos estructurados
>>> temperatura.keys()
dict_keys(['Valencia', 'Lisboa', 'Londres'])
>>> temperatura.values()
dict_values([26, 17.5, 15.4])
>>> len(temperatura)
3
Método Descripción
d.clear() Elimina todos los elementos del diccionario
d.copy() Crea una copia superficial del diccionario
d.items() Retorna objeto* con los elementos del diccionario (clave-valor)
d.keys() Retorna objeto* con las claves del diccionario
d.pop(clave) Retorna y remueve el elemento designado por la clave
d.popitem() Retorna y remueve arbitrariamente un elemento del diccionario
d.values() Retorna objeto* con los valores del diccionario
* Objeto de visualización de diccionarios
Al recorrer un diccionario con un bucle, sus elementos no tienen necesariamente que estar
ordenados. Recorremos un diccionario a través de sus claves.
Podemos usar una lista para imprimir por pantalla su contenido ordenado, usando el método
d.keys():
Convertir diccionarios en listas. Usando list() en combinación con los métodos d.items(),
d.keys() y d.values() podemos convertir a listas los objetos de visualización de diccionarios.
Ejemplo:
106
Programación en Python Datos estructurados
Ejemplos.
Frecuencia de palabras. Diseñar función que retorne un diccionario con el número de veces
que aparece cada palabra contenida en un string. Ejemplo:
>>> frecuenciaP("a a b b b c c c c d e e")
{'c': 4, 'a': 2, 'e': 2, 'b': 3, 'd': 1}
>>> frecuencias("esta frase es cierta y la frase anterior es falsa")
{'falsa': 1, 'anterior': 1, 'esta': 1, 'es': 2, 'cierta': 1, 'frase':
2, 'y': 1, 'la': 1}
def frecuencias3(frase):
"""Retorna un diccionario con el número de veces que aparece cada
palabra contenida en un string. Ejemplos:
>>> frecuencias("a a b b b c c c c d e e")
{'c': 4, 'a': 2, 'e': 2, 'b': 3, 'd': 1}
"""
res = {}
for item in frase.split():
if item in res:
res[item] += 1
else:
res[item] = 1
return res
Diccionario de vinos. Se dispone de un diccionario de vinos donde las claves son nombres
vinos y los valores para cada vino son una lista con la información de su denominación de
origen, la añada y su precio. Ejemplo:
d = {'Muga': ['Rioja',2012,8.5],'Petit caus': ['Penedes',2014, 6.75],\
'Viña vial': ['Rioja',2016,9.5], 'Lavia': ['Jumilla',2011,12.5],\
'Bach': ['Penedes',2015, 4.5], 'Pazo B': ['Rias Baixas', 2016,13.0]}
Diseñar una función lista_vinos(d,rango) en que, dado un diccionario de vinos como el
descrito y una lista con un rango de precios [menorPrecio, mayorPrecio], nos devuelva una
lista de los nombres, ordenados alfabéticamente de los vinos que estén en este rango de
precios. Ejemplo:
>>> lista_vinos(d,[10, 15])
['Lavia', 'Pazo B']
def lista_vinos(d,rango):
""" Lista de vinos en un rango de precios
d = {'Muga': ['Rioja',2012,8.5],'Petit caus': ['Penedes',2014, 6.75],
'Viña vial': ['Rioja',2016,9.5], 'Lavia': ['Jumilla',2011,12.5],
'Bach': ['Penedes',2015, 4.5], 'Pazo B': ['Rias Baixas', 2016, 13.0]}
>>> lista_vinos(d,[10, 15])
['Lavia', 'Pazo B']
"""
lst = []
for vino in d:
if d[vino][2]>=rango[0] and d[vino][2]<=rango[1]:
lst.append(vino)
lst.sort()
return lst
107
Programación en Python Datos estructurados
Las funciones de Python que usen variables con datos mutables (como las listas) entre sus
parámetros tiene la característica equivalente al paso de parámetros por referencia usado en
otros lenguajes de programación, como el Pascal.
Pero, si las variables son mutables, como las listas, y la función modifica el valor de esta
variable, entonces el nuevo valor sí se referencia al objeto original de la variable que se usó de
argumento, tomando este nuevo valor. Equivale a paso de parámetros por referencia. Esta
referencia se hace inmediatamente, sin esperar que acabe la función.
Se muestra un ejemplo de una función void (procedimiento) que lee del teclado los valores de
una lista de elementos de enteros, que es referenciada del programa principal.
108
Programación en Python Datos estructurados
En Python el paso de parámetros viene ser “por objetos”. Si el objeto es inmutable, entonces
el paso es por valor. Si el objeto es mutable el paso es por referencia.
El ejemplo anterior de procedimiento para leer los valores de una lista y calcular la suma y
valor medio de los elementos, lo adaptamos a leer un vector (array) con NumPy. La suma de
elementos y el cálculo valor medio están incluidos en los métodos asociados a los objetos
array de NumPy. El programa se simplifica, pues el bucle for - in se sustituye por una
vectorización:
Hay que señalar que el paso de parámetros por referencia (paso de parámetros por objetos
mutables en Python) puede realizarse también en funciones productivas, aunque esto no es lo
usual en programación.
Los datos y variables, o cualquier objeto, que se han usado en los ejemplos vistos hasta ahora
se pierden al salir del programa (Python, o cualquier otro) o al apagar el computador. Esta
información se almacena en la memoria RAM durante la ejecución del programa. Es decir, no
tiene persistencia. La forma de guardar estos datos de manera permanente es mediante
ficheros (archivos, files) en la memoria secundaria del ordenador. Hoy en día esta memoria
puede ser el disco duro, memoria flash como los pen drive y tarjetas SD (Secure Digital) o las
memorias (confusamente llamadas) ROM22 en los teléfonos móviles actuales, etc.
22
El origen de las memorias flash persistentes son las memorias EEPROM (Electrically Erasable
Programmable Read-Only Memory) o ROM programable y borrable eléctricamente.
109
Programación en Python Datos estructurados
Podemos decir que un fichero es un bloque de datos o información estructurada, que puede
ser utilizado por los programas del computador. Los ficheros tienen un nombre y una ruta
(path) para poder ser accedidos.
Los ficheros binarios tienen una secuencia de bytes con la información codificada. Para leerlos
o escribir sobre ellos, se debe conocer el formato de cómo se ha guardado la información. Y
recorrerlos byte a byte o en bloques de bytes.
Python permite acceder a ficheros de texto o binarios para su lectura o escritura. Se presenta a
continuación la forma de operar ficheros en Python y su comparación con lenguajes como C y
Matlab.
110
Programación en Python Datos estructurados
Sistema = HOLTER-ECG
Nombre = AGRCB
Fecha Prueba = 02/07/2016
Fecha Análisis = 03/07/2016
Número de canales = 3
Bits por muestra = 12
Muestras por segundo = 200
Rango dinámico = -5.0mV to +5.0mV
LSB = 10 microvolts
Sex = V
Fecha Nacimiento = 16/01/1950
Hora de conexión = 14:27
f = open('pac1.txt', 'w')
dos_lineas = 'Sistema = HOLTER-ECG\nNombre = AGRCB'
f.write(dos_lineas)
f.close()
Es importante cerrar el objeto de entrada y salida (f) para que la acción de crear el fichero se
complete. Se puede observar que hay que incluir los caracteres especiales \n de escape para
introducir el salto de línea. Este programa salva el fichero pac1.txt que contiene las dos
primeras líneas de la información que queremos. Un texto de varias líneas conviene más
crearlo con las triples comillas. Pondremos toda la información del paciente en un fichero:
111
Programación en Python Datos estructurados
f = open('pac2.txt', 'w')
texto = """Sistema = HOLTER-ECG
Nombre = AGRCB
Fecha Prueba = 02/07/2016
Fecha Analisis = 03/07/2016
Número de canales = 3
Bits por muestra = 12
Muestras por segundo = 200
Rango dinámico = -5.0mv to +5.0mv
LSB = 10 microvolts
Sex = V
Fecha Nacimiento = 16/01/1950
Hora de conexión = 14:27
"""
f.write(texto)
f.close()
Este programa utiliza el texto de información como un string entre comillas triples. Esta
sintaxis incluye automáticamente el carácter \n al finalizar la línea escrita.
Vamos a leer lo escrito en ambos ficheros. El primero incluye solo las dos primeras líneas. Se
presentan varias opciones de lectura.
Si se quiere leer línea a línea, el método readline() es muy práctico. Cuando se llega al final
del fichero y se intenta leer algo nuevo, se devuelve un string vacío. La instrucción
open('pac1.txt', 'rt') equivale a open('pac1.txt', 'r') y a open('pac1.txt'). La
apertura por omisión es de lectura y de ficheros de texto. Si queremos leer el fichero entero:
>>> f = open('pac1.txt')
>>> f.read()
'Sistema = HOLTER-ECG\nNombre = AGRCB'
>>> f.tell()
36
>>> f.close()
Después de leer el todo el fichero (que contiene 35 caracteres) el método tell() nos dice la
posición en que se ha quedado sobre el fichero para seguir actuando sobre él. En este caso,
estamos al final (o en la posición que sigue al último carácter).
Probemos el segundo fichero con el texto completo para leer algunas partes y cambiar otras:
112
Programación en Python Datos estructurados
También se puede leer todo un fichero de texto iterando sobre el objeto file:
f = open('pac2.txt', 'r')
for linea in f:
print(linea, end='')
f.close()
Sistema = HOLTER-ECG
Nombre = Maria
Fecha Prueba = 02/07/2016
Fecha Analisis = 03/07/2016
Número de canales = 3
Bits por muestra = 12
Muestras por segundo = 200
Rango dinámico = -5.0mv to +5.0mv
LSB = 10 microvolts
Sex = V
Fecha Nacimiento = 16/01/1950
Hora de conexión = 14:27
>>>
Los ficheros binarios guardan elementos tipo bytes de Python. Los bytes son objetos
inmutables con elementos de un byte (8 bits) y valores entre [0, 256), equivalentes a la
codificación binaria de caracteres ASCII. A continuación se muestra un ejemplo donde se crea
un fichero binario, se escribe con 3 bytes, se lee uno de ellos y luego se leen los tres:
113
Programación en Python Datos estructurados
La escritura de ficheros binarios en Python puede realizarse de una manera más eficiente y
flexible aprovechando las características de módulos de struct, NumPy y ScyPy23. Estos
módulos incorporan el uso de estructuras o arreglos de vectores o matrices para escribirlos
directamente en ficheros binarios. NumPy, por ejemplo, permite importar datos de Matlab. En
el ejemplo anterior, la lectura de los datos binarios se puede hacer con NumPy como:
El ejemplo siguiente muestra la facilidad de guardar y leer una matriz en un fichero binario con
NumPy:
23
http://docs.scipy.org/doc/numpy-1.10.0/reference/routines.io.html
114
Programación en Python Datos estructurados
Ejercicios
3. Cambiar minúsculas a Mayúsculas. Diseña una función que entre un string y devuelva el
string pero cambiando sus minúsculas por mayúsculas.
>>> cambia_minMay('Casablanca 20 Madrid 30')
'CASABLANCA 20 MADRID 30'
4. Borrar Números en string. Diseña una función que entre un string y devuelva el string
pero sin sus caracteres numéricos o dígitos.
>>> delNumbers('Alicante a 20 kms')
'Alicante a kms'
6. Contar Vocales y Consonantes. Diseña una función que cuente el número de vocales y
consonantes de un texto que entra como un string.
>>> contar_vocal_cons('Aprendo Python')
(4, 9)
7. Capicúa. Diseña una función que dada una palabra o número en forma de string nos
devuelva si la palabra o número es capicúa (palíndromo). Puedes usar las características
de indexación. Ejemplo:
>>> es_capicua('rodar')
False
>>> es_capicua('rodador')
True
8. Encriptar. Diseñe una función encripta(s, clave), que reciba un string s con un mensaje y
un string con una clave de codificación, y retorne el mensaje codificado según la clave
leída. Los signos de puntuación y dígitos que aparezcan en el mensaje deben conservarse
sin cambios. La clave consiste en una sucesión de las 26 letras minúsculas del alfabeto,
las cuales se hacen corresponder con el alfabeto básico (a…z, sin la ñ o vocales
acentuadas) de 26 letras. La primera letra de la clave se relaciona con la letra 'a', la
segunda con la letra 'b', etc. Por ejemplo, una entrada de la forma:
Clave = 'ixmrklstnuzbowfaqejdcpvhyg'
Texto para codificar: 'cafe'
115
Programación en Python Datos estructurados
Con esta clave la letra 'i' se corresponde con la letra 'a', la letra 'x' se corresponde con la
letra 'b', la letra 'm' se corresponde con la letra 'c', y así sucesivamente, por lo que el
ejemplo anterior debería dar como salida: 'milk'.
Nota: para simplificar consideraremos solo mensajes de entrada en minúsculas.
>>> encripta('cafe', ' ixmrklstnuzbowfaqejdcpvhyg')
'milk'
>>> encripta('dame 1 chocolate', ' ixmrklstnuzbowfaqejdcpvhyg')
'riok 1 mtfmfbidk'
9. Desencriptar. Diseña una función desencripta(s, clave) que realice la función inversa a la
función anterior, es decir, reciba un string s y una clave y realice la desencriptación del
mensaje en el string devolviendo la cadena desencriptada.
>>> clave = ' ixmrklstnuzbowfaqejdcpvhyg'
>>> desencripta('milk',clave)
'cafe'
>>> desencripta('riok 1 mtfmfbidk',clave)
'dame 1 chocolate'
10. Comienza con a. Diseña una función que dado un texto representado en un string,
cuente y devuelva el número de palabras del texto que empiezan por la letra 'a'
(minúscula o mayúscula).
>>> comienza_a('Ayer comenzamos a estudiar algoritmos')
3
11. Comienza con letra. Diseña una función similar a la anterior, comienza_letra(s,letra) que
dado un texto representado en un string, cuente y devuelva el número de palabras del
texto que empiezan por la letra 'letra' (minúscula o mayúscula).
>>> comienza_letra('Este día comenzamos a estudiar algoritmos',
'e')
2
12. Palabra más Larga. Diseña una palabra_mas_larga(s) que dado un texto representado
en un string, devuelva la palabra de mayor longitud (la primera encontrada si hay más de
una del mismo tamaño).
>>> palabra_mas_larga('Ayer comenzamos a estudiar algoritmos')
'comenzamos'
13. Números sin repetir. Escribe la función uniqueNumbers() usando la estructura while que
lea números enteros del teclado hasta que obtenga 5 números distintos (no repetidos) y
devuelva una lista con estos números distintos.
Ejemplos:
El usuario introduce:
0 (primer número)
4 (segundo número)
5 (tercer número)
4 (Repetido,no se cuenta ni se pone en la lista)
5 (Repetido,no se cuenta ni se pone en la lista)
116
Programación en Python Datos estructurados
3 (cuarto número)
6 (es el quinto número diferente y el último)
La función devuelve la lista de números [0, 4, 5, 3, 6]
14. Lista de Múltiplos. Escribir una función listaMultiplos(lst,n) que, dada una lista lst y un
número natural n, devuelva una lista con sólo los múltiplos de n de lst.
>>> listaMultiplos([1,2,3,4,5,6,7,8,9,10,11,12], 3)
[3, 6, 9, 12]
15. Positivos y Negativos. Diseña una función PositNegat(lst) que reciba una lista, lst, y
devuelva 2 listas, una con los Valores positivos o 0 y otra con los negativos.
>>> PositNegat([69, -37, 0, -27, -59, 83, 1, 45])
([69, 0, 83, 1, 45], [-37, -27, -59])
>>> PositNegat([3, 4, 7, 12])
([3, 4, 7, 12], [])
16. Par e impar. Diseña una función parImpar(lst) que reciba una lista, lst, y devuelva 2
listas, una con los Valores pares y otra con los impares.
>>> parImpar([1, 2, 3, 4, 5, 6, 7, 8])
([2, 4, 6, 8], [1, 3, 5, 7])
>>> parImpar([1, 3, 5])
([], [1, 3, 5])
17. Convertir Fecha. Diseña una función Convfecha(str) que reciba una fecha del formato
'dd/mm/aaaa' y devuelva una lista con los tres valores de día, mes y año utilizando la
función string.split('/') para extraer los valores a una lista y la función int() para
transformarlos a enteros.
>>> convfecha('12/07/2017')
[12, 7, 2017]
18. Eliminar Repetidos. Diseña una función eliminarRepet(lst) que dada una lista no vacía,
lst, devuelva otra sin que tenga elementos repetidos. Ayuda: puedes usar if lst[i] not in
lst[i+1:]:
>>> eliminarRepet([1, 1, 1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 6, 7])
[1, 2, 3, 4, 5, 6, 7]
19. Mover elementos de una lista a la derecha (Right shift). Diseña una función
mueve_derecha(lst) (no productiva) que dada una lista, lst, la devuelva con sus
elementos corridos hacia la derecha (y el último de primero). Right-shift.
>>> lst = [2, 4, 6, 8, 10]
>>> mueve_derecha(lst)
>>> lst
[10, 2, 4, 6, 8]
20. Mover elementos de una lista a la izquierda (Left shift). Diseña una función
mueve_izquierda(lst) (no productiva) que dada una lista, lst, la devuelva con sus
elementos corridos hacia la izquierda (y el primero de último). Left-shift.
>>> lst = [2, 4, 6, 8, 10]
117
Programación en Python Datos estructurados
>>> mueve_izquierda(lst)
>>> lst
[4, 6, 8, 10, 2]
21. Contar positivos. Dada una matriz cuadrada, contar cuántos números positivos tiene.
Ejemplo:
>>> contar_pos([[1, -2, 3],[-4,5,6],[7,8,-9]])
6
22. Devolver diagonal. Diseña una función (productiva) d_diagonal(m) que, dada una
matriz cuadrada (por ejemplo, 3x3), nos devuelva una lista con los elementos de su
diagonal. Ejemplo:
>>> d_diagonal([[1,2,3],[4,5,6],[7,8,9]])
[1, 5, 9]
23. Media de cada fila. Diseña una función media_filas(lst) que, dada una lista de
listas, que representa una matriz (los elementos de la lista son las filas de la matriz), de
nf filas y nc columnas, devuelva una lista con el cálculo del valor medio de cada fila.
Ejemplo:
>>> lst = [[1,2,3,4],[1,3,5,7]
>>> media_filas(lst)
[2.5, 4.0]
24. Media de cada columna. Diseña una función media_columnas(lst2) que, dada una
lista de listas, que representa una matriz de nf filas y nc columnas, devuelva una lista con
el cálculo del valor medio de cada columna. Ejemplo:
>>> lst2 = [[2,3,4],[3,3,3]]
>>> media_columnas(lst2)
[2.5, 3.0, 3.5]
25. Mayor índice de masa muscular (IMC). Se dispone en una lista heterogénea con la
información de un paciente: nombre, peso (kg), altura (m) y edad. En un centro de salud
se guarda en una lista de listas la información de estos pacientes, como por ejemplo:
lst4 = [['Juan', 71.5, 1.76, 45], ['Ana',78.0,1.70, 56], ['Paul',89.5,1.80,54]]
Diseña una función mayorIMCgt5(lst) que, dada una lista (lst) como la descrita,
nos devuelva el nombre del paciente con mayor índice de masa corporal (IMC) entre los
mayores de 50 años. (IMC = peso(kg)/altura**2(m)). Ejemplo con la lista lst4:
>>> mayorIMCgt5(lst4)
'Paul'
26. Gestión de Pensionistas. Los gastos de un grupo de pensionistas se guardan en una lista
de listas donde cada sub-lista representa la información de un pensionista y está
formada por el identificador del pensionista (string), un entero que indica la edad y una
serie de gastos mensuales que se guardan (enteros). El número de gastos mensuales
puede variar entre pensionistas. Por ejemplo, el pensionista con identificador '1111A' se
llama 'Carlos' tiene 68 años y tiene 3 gastos mensuales de 640, 589 y 573.
lst = [['1111A','Carlos',68,640,589,573],
118
Programación en Python Datos estructurados
['2222D','Lucia',69,710,550,570,698,645,512],
['3333J','Paula',72,530,534],
['4444N','Luis',75,770,645,630,650,590,481,602]]
a) Diseña una función mediaGastos(p) en que, dada una lista que codifica los datos
de un pensionista p, devuelva el promedio de los gastos con dos cifras decimales.
Ejemplo:
>>> mediaGastos(lst[0])
600.67
b) Diseña una función mediaEdad(lst) en que, dada una lista de los pensionados,
devuelva el promedio de las edades con un decimal. Del ejemplo lst:
>>> mediaEdad(lst)
71.0
c) Diseña una función EdadesExtremas(lst) en que, dada una lista como la mostrada
en el ejemplo, devuelva la edad menor y la mayor de los pensionistas. Del ejemplo
lst:
>>> EdadesExtremas(lst)
(68, 75)
d) Diseña una función sumaPromedio(lst) en que, dada una lista como la mostrada en
el ejemplo, devuelva la suma del promedio de los gastos de todos los pensionistas
de la lista. Redondea a 2 decimales. Del ejemplo lst:
>>> sumaPromedio(lst)
2370.83
e) Diseña una función MediaMaxima(lst) en que, dada una lista como la mostrada en
el ejemplo, retorne el mayor promedio de los gastos entre todos los pensionistas
de la lista. Del ejemplo lst:
>>> MediaMaxima(lst)
624.0
f) Diseña una función GastoPromedio(lst) en que, dada una lista de pensionistas
devuelve otra lista con el gasto medio mensual de cada persona. La lista resultante
debe estar ordenada de forma ascendente.
>>> GastoPromedio(lst)
[532.0, 600.67, 614.17, 624.0]
g) Diseña una función gastoPromedioSuperior(lst, g) en que, dada una lista como la
mostrada en el ejemplo y un gasto g, devuelva otra lista con el identificador y la
edad de la primera persona de la lista que tenga un promedio de gasto superior a
g. En caso de que no haya ninguna, la función devolverá la lista vacía.
>>> gastoPromedioSuperior(lst, 600)
['1111A', 68]
27. Lista de datos de pacientes. Diseña una función que, dada una lista de datos de
pacientes en listas que contienen como elementos “listas” con elementos heterogéneos:
apellido, código de la seguridad social y edad, calcule la edad promedio de los pacientes
(con una cifra decimal de precisión). Ejemplo de paciente: paciente1 =
['Puig','c1234', 56].
119
Programación en Python Datos estructurados
28. Frecuencia de Números. Diseña una función frecuencias(lst) en que, dada una lista de
números naturales, devuelva un diccionario con el número de veces que aparece cada
número en la lista dada.
>>> frecuencias([1, 3, 2, 4, 2, 2, 3, 2, 4, 1, 2, 1, 2, 3, 1, 3, 1])
{1: 5, 2: 6, 3: 4, 4: 2}
29. Moda (estadística). Diseña una función moda(lst) en que, dada una lista de números
naturales, devuelva la moda de la lista (el valor más repetido). Puedes usar la función
anterior, frecuencias.
>>> moda([1, 3, 2, 4, 2, 2, 3, 2, 4, 1, 2, 1, 2, 3, 1, 3, 1])
2
30. Histograma. Diseña una función histograma(lst) en que, dada una lista de números
naturales, muestre el histograma de la lista. Puedes reusar funciones anteriores.
>>> histograma([1, 3, 2, 4, 2, 2, 3, 2, 4, 1, 2, 1, 2, 3, 1, 3, 1])
1 *****
2 ******
3 ****
4 **
31. Agenda: Lista-Diccionario. Diseña una función Agenda1 (lst) en que, dada una lista de
listas donde cada sub-lista contiene dos strings que representan un nombre y un
teléfono, devuelva un diccionario donde las claves sean un string con el nombre y los
valores sean un string con el número de teléfono. Suponemos que no hay nombres
repetidos. Ejemplo de entrada.
>>> lst = [["Luisa", "931111111"], ["José", "912222222"], ["Judith", "96919391"]]
>>> Agenda1(lst)
{"Luisa": "931111111", "José": "912222222", "Judith": "96919391"}
32. Agenda2: Lista-Diccionario. Diseña una función Agenda2 (lst) en que, dada una lista de
listas donde cada sub-lista contiene dos strings que representan un nombre y un
teléfono, devuelva un diccionario donde las claves sean strings con el nombre y los
valores sean una lista con los diferentes números de teléfono de la misma persona
(puede haber nombres repetidos). Ejemplo de entrada.
>>> lst = [["Luisa", "931111111"], ["José", "912222222"], ["Judith", "96919391"],\
… ["Luisa", "65555555"], ["José", "61133333"]]
>>> Agenda2(lst)
{"Luisa": ["931111111", "65555555"], "José": ["912222222",
"61133333"], "Judith": ["96919391"]}
120
Programación en Python Datos estructurados
121
Programación en Python Anexos
Anexo A
122
Programación en Python Anexos
24
ASCII extendido usado en los IBM PC y sistemas operativos DOS. Ver:
https://en.wikipedia.org/wiki/Code_page_437
123
Programación en Python Anexos
25
Ver:
https://en.wikipedia.org/wiki/ISO/IEC_8859-1
https://es.wikipedia.org/wiki/Windows-1252
124
Programación en Python Glosario
Glosario
Algoritmo
Una sucesión ordenada de acciones elementales que se han de realizar para conseguir la
solución correcta de un problema en un tiempo finito, a partir de unos datos dados.
Argumento
Valor pasado a una función cuando ésta es llamada. El valor se pasa al parámetro
correspondiente de la función.
Asignación
Acción en los lenguajes de programación que le da un valor a una variable. El valor de la
derecha del símbolo de asignación se asigna a la variable a la izquierda del símbolo. En Python
significa que la variable es referenciada al valor del objeto de la derecha del símbolo.
Bit
Unidad primaria de la información en computación (combinación de binary digit).
Byte
Palabras de 8 bits que forman las unidades de información usadas hoy en día en
computadores. El término octeto para palabras de 8 bits también fue usado en España en el
comienzo de la era de la informática, como traducción de byte.
Compilador
Programa que lee un código fuente (secuencia de instrucciones) y lo traduce completamente al
lenguaje de máquina creando un programa ejecutable.
Computador o computadora
Máquina electrónica, hoy en día con tecnología digital, que mediante programas realiza
cálculos, almacena y procesa información para resolver problemas de diversas naturalezas.
125
Programación en Python Glosario
Datos simples
Tiene asociado un único valor: un entero, un real o un booleano (en Python). En otros
lenguajes el carácter es un tipo de dato simple. Se les llama elementos u objetos escalares por
ser indivisibles, es decir no tienen una estructura interna accesible.
Expresiones
En programación se refieren a los mecanismos para hacer cálculos y se componen de
combinaciones de valores e identificadores con operadores. Incluyen los clásicos cálculos
aritméticos, pero también los booleanos o lógicos y los de relaciones o comparaciones.
Función
Subprograma que incluye una instrucción o un bloque de instrucciones que realizan un cálculo
o una tarea, y que tiene un identificador como nombre. Pueden ser productivas, es decir, que
devuelven un resultado y funciones nulas (void) que realizan acciones o modifican objetos, sin
devolver un resultado.
Identificador
Nombres usados para identificar las variables, funciones, módulos, etc. Pueden contener letras
y números pero deben empezar siempre con una letra o el carácter guion bajo o subrayado
“_”. Se deben evitar las palabras reservadas propias del lenguaje de programación (keywords).
Índice
Variable o valor con la cual se accede a los elementos de una secuencia de un dato
estructurado como, por ejemplos, a un carácter de un string o a un elementos de una listas o
una tupla.
Informática
Área del conocimiento que estudia todo lo que hace referencia a la obtención y procesado de
información por medios automatizados, como los computadores, a partir de unos datos
determinados.
126
Programación en Python Glosario
Intérprete
Programa que lee una a una las instrucciones del código fuente y las traducen a las apropiadas
del lenguaje de máquina. Va traduciendo y ejecutando las sentencias del programa a medida
que las encuentra.
Lenguaje de máquina
Es el lenguaje básico que entiende la unidad de procesamiento central (CPU) de un ordenador,
que comprende el conjunto de instrucciones que se usa para programar el microprocesador
(µP). Es decir, se hace la programación de bajo nivel o lenguaje ensamblador, a nivel de la
máquina.
Lenguaje de programación
Es un lenguaje formal diseñado por humanos para realizar algoritmos e instrucciones que
puedan ser procesados por una máquina, como un computador.
Memoria
Lugar físico donde se almacenan datos e instrucciones en forma binaria para recuperarlos y
utilizarlos posteriormente por los diversos sistemas de un computador.
Memoria flash
Memoria no volátil (permanente) de electrónica de estado sólido, basada en tecnología de
compuertas NOR o NAND.
Memoria RAM
Memoria de acceso aleatorio para escribir y leer datos e instrucciones de programas (RAM, de
Random Access Memory), que se borra al cerrar el programa o el computador..
Memoria ROM
Memoria solo de lectura de las instrucciones y datos (ROM, de read-only-memory), que
permanecen grabadas. En las especificaciones de los móviles actuales se suele indicar
confusamente memoria ROM a la memoria flash que almacena los programas en general
(sistema operativo y programas descargados por el usuario). El origen de las memorias flash
persistentes son las memorias EEPROM (Electrically Erasable Programmable Read-Only
Memory) o ROM programable y borrable eléctricamente.
Módulo
En Python son las bibliotecas de funciones de una especialidad dada. Se diseña en un fichero
de extensión .py que contiene la definición de un grupo de funciones y otros valores. En otros
lenguajes de programación se utilizan otros términos como paquete (package), unidades (unit)
o caja de herramientas (toolbox). Los package en Python son una colección de módulos
guardados en una carpeta.
127
Programación en Python Glosario
Parámetro
Es el nombre usado en la definición de la función, a modo de variable, que se relaciona con el
valor que se le pasa como argumento desde el programa principal u otra función. Dentro de la
función será usado como variable local.
Procedimiento (procedure)
Subprograma que realiza acciones como leer datos, mostrar resultados, manejar ficheros, pero
que no devuelven un resultado (como las funciones productivas). En lenguajes como Pascal o
modula-3 se llama procedure. En Python son las funciones nulas (void).
Python
Lenguaje de programación de alto nivel, considerado de muy alto nivel y de propósitos
generales, que es ejecutado por un intérprete, y su licencia es de código abierto. Fue creado
por Guido van Rossum a finales de la década de 1980 en Holanda y se publicó la primera
versión a comienzos de la década de 1990.
Procesos informáticos
Comprenden básicamente de la entrada de datos, el tratamiento o cálculo de datos mediante
una secuencia de acciones preestablecidas por determinado programa, y la salida de datos.
Programa
Secuencia de instrucciones para realizar un cálculo o conseguir la solución correcta de un
problema en un tiempo finito, a partir de unos datos dados, en un computador. Se entiende
como la codificación de un algoritmo en un lenguaje entendido por el computador.
Programación estructurada
Paradigma de programación propuesto en la década de 1970 que contempla el uso de
estructuras o composiciones secuenciales, de selección o alternativas e iterativas y con ellas se
puede resolver cualquier función computable.
Programación modular
Paradigma de programación para crear programas de mejor claridad y, principalmente, para
reutilizar subprogramas. Esta programación facilita modificar y corregir los códigos por
separado y también crear una librería de subprogramas utilizables por otros programas.
128
Programación en Python Glosario
Recursión
Es un método de programar en la cual una función se llama a sí misma una o más veces en el
cuerpo de la función.
Sistemas operativos
Son programas complejos o sistema de programas que sirven para relacionar la unidad de
procesamiento central (CPU), es decir, el microprocesador (µP), memorias, etc., con otros
programas y el usuario. Están diseñados sobre los µP’s de los dispositivos, utilizando sus
respectivos lenguajes de máquina o ensambladores.
Shell de Python
Interfaz tipo consola interactiva del intérprete de Python. Sobre el Shell se puede ejecutar en
modo línea de comando o modo inmediato una expresión como una calculadora.
Subprograma (o subrutina)
Son un conjunto de instrucciones separadas del programa principal que realizan una tarea o un
cálculo y pueden devolver un resultado. Son llamados del programa principal o de otro
subprograma. En Python se refieren a las funciones productivas o nulas (void). En otros
lenguajes de programación incluyen a las funciones que devuelven resultados y a los
procedimientos (procedures) que realizan tareas.
Variable
En la mayoría de lenguajes de programación, una variable se considera a un lugar de memoria
donde se guarda un valor de tipo simple o compuesto, y tiene un nombre (identificador). En
Python, variable se considera un nombre referido a un objeto, es decir a los valores contenidos
en los objetos.
Variable global
Se declaran dentro de una función con la palabra reservada global. Si una variable del
programa principal tiene el mismo identificador que la definida como global dentro de una
función, entonces será modificada por cualquier asignación que reciba la variable global.
Variable local
Son las variables definidas y usadas dentro de las funciones, que desaparecen al terminar de
ejecutarse la función. Los parámetros de las funciones son también una especie de variable
local.
129
Programación en Python Referencias
Bibliografía
Referencias bibliográficas
Böhm, C., & Jacopini, G. (1966). Flow diagrams, turing machines and languages with only two
formation rules. Communications of the ACM, 9(5), 366-371.
Copeland, B.J. (2008). The Modern History of Computing. In The Stanford Encyclopedia of
Philosophy, E.N. Zalta, Ed. Recuperado de:
http://plato.stanford.edu/archives/fall2008/entries/computing-history/
Diakopoulos, N. & Cass, S. (2016). Interactive: The Top Programming Languages 2016. IEEE
Spectrum. Recuperado de: http://spectrum.ieee.org/static/interactive-the-top-programming-
languages-2016
Downey, E.K., A. B., Elkner, J. & Meyers, C. (2002). How to Think Like a Computer Scientist:
Learning with Python. Wellesley, MA: Green Tea Press.
Guo, P. (2014). Python is now the most popular introductory teaching language at top U.S.
Universities. Communications of the ACM. Recuperado de http://cacm.acm.org/blogs/blog-
cacm/176450-python-is-now-the-most-popularintroductory-teaching-language-at-top-
usuniversities/fulltext
IEEE Standards Committee. (2008). 754-2008 IEEE standard for floating-point arithmetic. IEEE
Computer Society Std, 2008.
Kaelbling, L, White, J., Abelson, H., Lozano-Perez, T., Finney, S., Canelake, S., Grimson, E.,
Chuang, I., Horn, B. & Freeman, D. (2011). Introduction to Electrical Engineering and Computer
Science I. 6.01 Course Notes Spring 2011. MIT OpenCourseWare. Recuperado de:
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-01sc-introduction-
to-electrical-engineering-and-computer-science-i-spring-
2011/Syllabus/MIT6_01SCS11_notes.pdf
130
Programación en Python Referencias
Peña, R. (2015). Paseo por la programación estructurada y modular con Python. ReVisión, 8(1),
17-27. Recuperado de:
http://www.aenui.net/ojs/index.php?journal=revision&page=article&op=viewArticle&path%5
B%5D=184&path%5B%5D=293
Real Academia Española (2014). Diccionario de la lengua española (23ª ed.). Recuperado de:
http://dle.rae.es/
Wentworth, P., Elkner, J., Downey, A. B., & Meyers, C. (2012). How to think like a computer
scientist: learning with Python 3. Recuperado de:
http://www.ict.ru.ac.za/Resources/cspw/thinkcspy3/thinkcspy3.pdf
Bibliografía recomendada
Downey, A. (2015). Think Python. How to Think Like a Computer Scientist. Needham, MA:
Green Tea Press. Recuperado de: http://greenteapress.com/wp/think-python-2e/
Langtangen, H. P. (2009). A primer on scientific programming with Python (Vol. 2). Berlin
Heidelberg: Springer. Recuperado de: http://link.springer.com/book/10.1007/978-3-642-
54959-5
131