Python
David Masip Rod
PID_00174138
Los textos e imgenes publicados en esta obra estn sujetos excepto que se indique lo contrario a
una licencia de Reconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v.3.0 Espaa de
Creative Commons. Podis copiarlos, distribuirlos y transmitirlos pblicamente siempre que citis
el autor y la fuente (FUOC. Fundaci per a la Universitat Oberta de Catalunya), no hagis un uso
comercial y no hagis una obra derivada. La licencia completa se puede consultar en
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
CC-BY-NC-ND PID_00174138 El lenguaje Python
ndice
Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1. Instalacin de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2. Cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3. Control de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1. Sentencias condicionales: la instruccin if . . . . . . . . . . . . . . . . . . . . 12
3.1.1. Sentencias if-elif-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2. Secuencias iterativas: bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.1. Bucles for ... in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.2. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.1. Parmetros de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2. Valores de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Ejercicios de autoevaluacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
CC-BY-NC-ND PID_00174138 5 El lenguaje Python
Introduccin
El lenguaje Python fue diseado a finales de la dcada de los ochenta por Gui-
do van Rossum. Se trata de un lenguaje de programacin de muy alto nivel,
con una sintaxis muy clara y una apuesta firme por la legibilidad del cdigo.
Sin duda es un lenguaje de programacin muy verstil, fuertemente tipado,
imperativo y orientado a objetos, aunque contiene tambin caractersticas que
lo convierten en un lenguaje de paradigma funcional.
Objetivos
Los objetivos que el alumno debe de haber conseguido una vez estudiados los
contenidos de este mdulo son los siguientes:
1. Instalacin de Python
.
Para instalar una determinada versin de Python, aconsejamos recurrir a su si- * http://www.python.org/
tio web oficial*. En el momento de escribir estos manuales, esta URL contiene
toda la informacin necesaria para instalar el entorno. En la seccin de des-
cargas** se pueden obtener los ltimos paquetes de instalacin para Windows, ** http://www.python.org
/download/
Linux y MacOS X en sus distintas versiones.
2. Variables
.
Los tipos bsicos del lenguaje Python son esencialmente los ya conocidos en
cualquier lenguaje de programacin: los valores numricos, las cadenas de
texto, y los valores booleanos. En el cdigo 2.1 se muestra un ejemplo de cada
tipo.
Los valores flotantes son implementados a bajo nivel directamente con el tipo
double de C (registro de 64 bits). Por su parte, los nmeros complejos estn
soportados de base y en la prctica se implementan mediante dos flotantes,
uno para la parte real y otro para la parte imaginaria.
2.1. Operadores
Los operadores que soporta el lenguaje Python son los clsicos de cualquier
lenguaje de programacin. Las tablas 1 y 2 muestran un resumen con ejemplos
de estas operaciones. Adems, Python provee de extensiones para operaciones
ms complejas en el mdulo math.
CC-BY-NC-ND PID_00174138 10 El lenguaje Python
El tipo bsico booleano puede recibir dos valores (true, false), y se utilizan
fundamentalmente para expresar el resultado de condiciones, especialmente
tiles en los bucles y control de flujo condicional. En la tabla 3 se resumen los
distintos operadores que trabajan con valores booleanos, comunes a la mayor
parte de lenguajes de programacin.
11 E s t e es un ejemplo de cadenas de c a r a c t e r e s
12 Es p o s i b l e e s c r i b i r s a l t o s de l i n e a
13 s i n necesidad de cdigos de escape .
14
15 d = a + b ; #concatenacin
16 e = " repite "
17 f = 3e ; #repeticin
18 g = e 3; # e q u i v a l e n t e al caso a n t e r i o r
19
20 print d , f , g
Por ltimo, una funcin muy til en Python es str, que permite realizar la Ejemplo
conversin de valores numricos a cadena de caracteres.
Si tecleamos str(8.987) en la
lnea de comandos,
obtendremos la salida
8.987.
CC-BY-NC-ND PID_00174138 12 El lenguaje Python
3. Control de flujo
.
La instruccin condicional if (del ingls si) recibe como entrada una expresin
booleana, y sirve para ejecutar una de porcin de cdigo en funcin de si se
cumple esta condicin (el resultado de su evaluacin es true).
Existe una tercera palabra clave en las instrucciones de control de flujo condi-
cionales, elif, que se utiliza para aadir ms condiciones a la sentencia if. Esto
nos puede ser muy til si tenemos muchos casos que diferenciar y queremos
tratarlos todos. Se pueden aadir tantos bloques elif como queramos. En el
cdigo 3.2 podemos ver un ejemplo de uso del entorno if-elif-else.
En el ejemplo del cdigo 3.3 podemos ver un uso tpico del bucle for para
recorrer un vector de datos.
3.2.2. while
En el ejemplo del cdigo 3.4 se muestra un uso tpico del bucle while.
CC-BY-NC-ND PID_00174138 15 El lenguaje Python
El ejemplo imprime por pantalla todos los nmeros pares del 2 al 20. A ca-
da paso incrementa la variable de control que nos permitir salir del bucle
cuando la condicin no sea satisfecha.
Notad que la sentencia while puede generar bucles infinitos. A veces estos
bucles se generan de forma involuntaria, lo cual va en detrimiento de la ca-
lidad de nuestros programas. Otras veces se generan de forma voluntaria, en
combinacin con la sentencia break. Esta sentencia permite salir de forma
incondicional de un bucle.
4. Funciones
.
En primer lugar notad que la tabulacin vuelve a jugar un papel clave. Pa-
ra diferenciar el final de la definicin de la funcin y el resto de cdigo del
programa principal, basta con mirar el cdigo fuente por encima. La propia
identacin delimita claramente los bloques.
Tambin se puede observar una cadena inicial que empieza por . Estas cade-
nas se utilizan para documentar las funciones. Los programadores familiariza-
dos con JAVA pueden ver cierto paralelismo con el doc usado en este lenguaje.
La sintaxis de este ejemplo es un poco confusa, puesto que an no hemos tra- Ved tambin
tado los tipos de datos complejos, como las listas y las tuplas. Esencialmente se
Las listas y las tuplas se
define un argumento que contiene una tupla con todos los posibles parme- estudian en el apartado 5 de
tros a recibir. Esta tupla se recorre en tiempo de ejecucin para poder utilizar este mdulo.
Hasta ahora se han descrito las funciones Python como fragmentos de cdigo
que efectan unas determinadas acciones de forma reutilizable. Los ejemplos
CC-BY-NC-ND PID_00174138 19 El lenguaje Python
5.1. Tuplas
Es muy habitual agrupar todos los elementos de una tupla entre parntesis,
aunque no es imprescindible (slo se exige el uso del parntesis cuando puede
existir confusin con otros operadores). A menudo se coloca una coma al final
de la tupla para indicar la posicin del ltimo elemento. En el cdigo 5.1 se
pueden ver distintos ejemplos de uso de tuplas.
5.2. Listas
53 >>> print l i s t a 2
54 [ 2 , 3]
55
56 # o p e r a d o r e s s o b r e c a r g a d o s de c o n c a t e n a c i n
57 >>> print l i s t a 2 + l i s t a 2
58 [ 2 , 3 , 2 , 3]
59 >>> print l i s t a 2 4
60 [ 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3]
61 >>>
Notad que los accesos a las listas (y tambin a las tuplas) se hacen mediante
indexacin directa. Para leer el primer elemento de una lista se usa la sintaxis
nombre_lista[0]. Es importante destacar que los ndices empiezan a contar
desde 0, y llegan hasta el (nmero de elementos -1). As, en el ejemplo, lista3
tiene 3 elementos, el primero de los cuales (ndice 0) es otra lista, el segundo
(ndice 1) es un 90 y el tercero (indice 2) good. Existe tambin la posibilidad
de referenciar los elementos de una lista con ndices negativos. En este caso
se empieza a contar desde el final de la lista, siendo el ndice -1 el ltimo
elemento de la lista. Por ejemplo, lista3[-1] nos dara la palabra good, lista3[-2]
un 90, y lista3[-3] la lista equivalente a la lista2.
Para aadir elementos a una lista, disponemos de dos mtodos, append y Ved tambin
Otra funcin muy til en las listas, sobre todo para usar en bucles for, es range.
Esta funcin, dado un nmero natural N, nos devuelve una lista con todos los
elementos hasta N-1. As pues, si tecleamos range(8) en la lnea de comandos,
obtendremos [0, 1, 2, 3, 4, 5, 6, 7], que podrn ser seguidos en un bucle for
para ejecutar una determinada accin 8 veces.
CC-BY-NC-ND PID_00174138 23 El lenguaje Python
5.3. Diccionarios
Los diccionarios conforman uno de los tipos de datos ms tiles para los pro-
gramadores en Python, y representan una interesante novedad respecto a los
lenguajes de programacin imperativos tradicionales. Se trata de unas estruc-
turas de memoria asociativa. Los elementos en los diccionarios no se consul-
tan mediante un ndice, sino que se accede directamente a ellos por conteni-
do. El cdigo 5.3 muestra un ejemplo de diccionario y su uso.
Para crear el diccionario simplemente indicaremos entre llaves {,} las parejas
de elementos que lo conforman. En cada pareja indicaremos primero el valor
llave para acceder al elemento, y despus el valor que contendr (que pue-
de ser de cualquiera de los tipos disponibles en Python). La consulta de un
valor del diccionario se reducir a preguntar por el valor que tiene la llave aso-
ciada. En el ejemplo, guardamos en la variable a el contenido de la posicin
de memoria nombre. El string nombre nos sirve para indexar posiciones de
memoria o variables. Las estructuras de memoria asociativa que permiten esta
funcionalidad son de gran utilidad en el tratamiento de datos textuales y los
sistemas de clasificacin de lenguaje natural.
CC-BY-NC-ND PID_00174138 24 El lenguaje Python
Existen varios mtodos auxiliares para trabajar con diccionarios, entre los que
destacan el mtodo in, que permite consultar si una determinada llave est
presente en el diccionario, el mtodo update que permite combinar dos dic-
cionarios y el mtodo del que elimina una entrada de un diccionario.
5.4. Conjuntos
5.5. Ficheros
Los ficheros no son un tipo de datos en s mismos, sino un objeto que permite Observacin
interactuar con el sistema de entrada y salida para escribir datos en el disco. Hemos preferido explicar la
funcionalidad bsica de los
ficheros en estos apuntes,
En este manual, an no hemos tratado el concepto de orientacin a objetos puesto que pueden ser
en Python. Sin embargo, ser necesario introducir algunos mtodos bsicos necesarios durante todo el
curso para cargar los datos
para acceder al objeto que hace de interfaz con el disco. La funcin bsica de necesarios para los
algoritmos de teora.
acceso a un fichero se denomina open, que recibe como parmetro un nombre
de fichero y un modo (lectura r, escritura w). El acceso a los datos se puede
realizar mediante los mtodos:
Los ficheros de texto son un caso particular que Python permite tratar de
forma mucho ms cmoda e integrada en el lenguaje. Existe un mtodo read-
lines(), que permite leer el contenido del fichero por lneas, devolviendo un
array donde se puede indexar cada una de ellas. Del mismo modo, es posible
acceder lnea por lnea al contenido de un fichero, y efectuar un tratamiento
individualizado de cada una de ellas mediante un simple bucle for. En el ejem-
plo del cdigo 5.6 podis ver el cdigo que recorre un fichero y lo imprime
por pantalla.
Para definir una clase usamos la palabra clave class. En el fragmento de cdigo
6.1 mostramos un ejemplo de definicin de una clase.
Para crear un objeto concreto de una clase, basta con usar el nombre que le
hemos dado a la clase seguido de los argumentos que necesita la funcin de
inicializacin (que aqu tiene un efecto similar a los constructores del lenguaje
C++). En el ejemplo hemos creado dos objetos de la clase Panadera (panade-
ria1 y panaderia2).
6.2. Herencia
Cuando decimos que una clase hereda de otra, nos referimos a que la
clase resultante contendr todos los atributos y mtodos de la clase pa-
dre o superclase, permitiendo de esta forma una especializacin progre-
siva de las clases y una mayor reutilizacin de cdigo.
CC-BY-NC-ND PID_00174138 29 El lenguaje Python
Para hacer que una clase herede de otra en Python, simplemente tenemos que
indicarlo a continuacin del nombre de la clase, entre parntesis. En el cdigo
6.2 se muestra un ejemplo muy simple de herencia.
Observad que en este ejemplo trabajamos con cuatro clases distintas: Animal,
Bird, Mammal y Ostrich. Animal es superclase del resto, que heredan de ella.
En el caso de Ostrich, notad que hereda de dos clases a la vez (aunque no
fuese estrictamente necesario). Python permite herencia mltiple. Ejecutad el
CC-BY-NC-ND PID_00174138 30 El lenguaje Python
Muchos lenguajes no permiten herencia mltiple, dado que esto puede origi-
nar conflictos cuando se heredan mtodos o atributos con el mismo nombre
de dos superclases.
6.3. Encapsulacin
La encapsulacin tiene mucha utilidad si se quieren esconder los detalles de Ved tambin
implementacin de una determinada clase. Supongamos por ejemplo que in-
El concepto de getter y setter
ternamente el peso de una clase Animal se guardase en otras unidades (sistema se ha tratado con
ingls) en lugar de kilogramos. El uso de funciones setters y getters pblicas profundidad en la asignatura
Programacin orientada a
permitira que la interfaz con el usuario fuese siempre la misma, independien- objetos.
temente de esta codificacin interna, que sera privada. Se ha ejemplificado
este hecho en el mtodo getWeight() de la clase Mammal.
Como curiosidad, observad que la funcin __init__ empieza tambin por dos
guiones bajos. Los mtodos Python que empiezan y terminan por guiones
bajos son especiales, y no tienen que ver con el concepto de mtodo privado.
Otra funcin especial es el destructor o __del__ que se llama cuando el objeto
deja de utilizarse para su eliminacin.
CC-BY-NC-ND PID_00174138 31 El lenguaje Python
6.4. Polimorfismo
Las funciones lambda son funciones annimas definidas en lnea, que no se-
rn referenciadas posteriormente. Se construyen mediante el operador lamb-
da, sin usar el parntesis para indicar los argumentos. Estos van directamente
despus del nombre de la funcin, que finaliza su declaracin con dos pun-
tos (:). Justo despus, en la misma lnea se escribe el cdigo de la funcin. En
el ejemplo anterior se ha incluido la versin de llamada a map, filter y reduce
usando funciones lambda. Observad que estas funciones estn limitadas a una
sola expresin.
Una sintaxis alternativa a los iteradores anteriores que se est imponiendo en Pattern matching
las ltimas versiones de Python es la comprensin de listas. En este caso, se
A diferencia de otros
pretende crear una lista a partir de otra lista. La sintaxis es de nuevo muy sen- lenguajes puramente
cilla, se especifica entre corchetes (o parntesis) la expresin a aplicar, seguida funcionales, Python no
implementa pattern
de la palabra clave for, la variable a iterar, la palabra clave in y la lista ori- matching, aunque es posible
gen. Como se puede observar en el ejemplo anterior, hemos reproducido la simularlo. Estos conceptos
quedan ya fuera del alcance
funcin que duplicaba cada elemento de la lista aplicando comprensin, y la de este manual.
expresin se leera: para cada num de l1 haz num*2.
CC-BY-NC-ND PID_00174138 35 El lenguaje Python
Los paquetes no son ms que entidades que organizan los mdulos. Los pa-
quetes tienen su equivalencia con el sistema de carpetas o directorios, donde
podemos guardar de forma estructurada diferentes ficheros (mdulos). La pa-
labra clave import se utiliza tambin para importar mdulos de los paquetes, y
se usa la misma nomenclatura en cuanto a espacio de nombres. As pues, para
importar un mdulo llamado moduloEjemplo, del paquete PaquetesEjemplo, se-
guiramos la sintaxis: import PaquetesEjemplo.moduloEjemplo. Suponiendo que
en este mdulo tuviramos de nuevo definida la funcin double, la llamara-
mos de la siguiente manera: PaquetesEjemplo.moduloEjemplo.double(3), accin
que nos devolvera un 6. Esta notacin se puede simplificar notablemente con
la palabra clave as. Siguiendo el ejemplo, si importramos el cdigo como: im-
port PaquetesEjemplo.moduloEjemplo as e, podramos llamar posteriormente a
la funcin double como e.double(3).
En este curso trabajaremos con varios paquetes de Python, pero tres de ellos
sern imprescindibles puesto que contienen las principales libreras de machi-
ne learning ya implementadas en Python. Se trata de NumPy, PyLab y SciPy.
CC-BY-NC-ND PID_00174138 36 El lenguaje Python
8.1. NumPy
8.2. PyLab
PyLab es una librera que intenta aportar funcionalidades extra a NumPy in-
tegrando gran parte de las funciones Matlab que se han usado histricamente
* http://www.scipy.org/PyLab
en entornos de machine learning. En Internet* se puede encontrar el paquete
listo para descargar, con la correspondiente documentacin.
8.3. SciPy
SciPy es una expansin de NumPy, que integra nuevos paquetes para el tra-
tamiento cientfico de datos. Integra gran cantidad de funciones de procesa-
miento de imgenes, procesado de la seal, estadstica, integracin numrica.
En Internet* se puede encontrar la ltima versin de la plataforma y su docu- * http://www.scipy.org/
mentacin asociada.
CC-BY-NC-ND PID_00174138 37 El lenguaje Python
Resumen
Es aconsejable que realicis los ejercicios para acabar de asentar los conoci-
mientos bsicos. No es necesario realizarlos todos, simplemente intentar hacer
aquellos que a primera vista parezcan ms complejos. Junto con el material,
podris encontrar en el aula las soluciones a los ejercicios, para poder realizar
las consultas y comparaciones oportunas.
CC-BY-NC-ND PID_00174138 38 El lenguaje Python
Ejercicios de autoevaluacin
1. Escribid una funcin en Python que, dada una lista de nmeros, devuelva otra lista en
orden inverso. Para realizar este ejercicio se deber utilizar un bucle o estructura repetitiva.
No se permite el uso de funciones miembro de la clase list (en especial list.reverse()).
2. Escribid una funcin que, dado un nmero entero N, devuelva una lista con todos los
nmeros primos hasta N. Para solucionar el ejercicio debis crear una funcin auxiliar que
indique si un determinado nmero es primo (retornando un valor booleano).
3. Escribid una funcin que reciba una tupla compuesta por caracteres, y devuelva una lista
con los caracteres en maysculas. Debis recorrer la tupla carcter a carcter para realizar
la conversin. Para convertir un carcter a mayscula podis usar el mtodo upper(). Por
ejemplo a.upper() nos devuelve A.
4. Convertid el texto ejemplo en una lista que contenga sus 7 caracteres. Despus conver-
tidlo en una tupla y usando la funcin del ejercicio anterior obtened una lista con el texto
en maysculas.
5. Escribid una funcin que, dada una lista de nmeros, devuelva una lista con slo los
elementos en posicin par.
6. Extended la funcin anterior para que, dada una lista y unos ndices, nos devuelva la lista
resultado de coger slo los elementos indicados por los ndices. Por ejemplo si tenemos la
lista [1,2,3,4,5,6] y los ndices [0,1,3] debera devolver la lista [1,2,4].
7. Escribid una funcin que nos devuelva cuntas veces aparece cada una de las palabras
de un texto (frecuencia de aparicin de las palabras). Para ello podis usar un diccionario
donde la llave sea cada una de las palabras del texto y el contenido guarde el nmero de
apariciones de la palabra. Para simplificar el ejercicio, podis usar el mtodo split( ), que,
dado un separador (el espacio), nos devuelve una lista con todas las palabras de un texto de
forma separada. Por ejemplo: hola esto es un ejemplo.split( ) nos devolvera: [hola, esto,
es, un, ejemplo]
8. Escribid una funcin que devuelva un conjunto formado por los nmeros compuestos
(no primos) menores que un N dado.
9. Codificad una funcin que escriba en un fichero de texto los nmeros primos que van
desde el 1 hasta el 999.999.
10. Escribid una funcin que lea el contenido de un fichero de texto y nos d la frecuen-
cia de aparicin de cada palabra. Podis usar el cdigo del ejercicio 7, en el que se usaban
diccionarios para contar las apariciones de cada palabra.
11. Implementad un programa que tenga dos clases, Camin y Coche, ambas subclases de
la superclase Vehculo. Elegid tres atributos comunes a Coche y Camin y dos atributos
especficos a cada clase. Pensad bien dnde colocar cada atributo. Escribid un mnimo de
dos mtodos en cada clase y ejecutadlos en el programa principal.
12. Escribid una versin del ejercicio 2 que utilice programacin funcional. Podis usar el
iterador filter para mantener slo aquellos valores de la lista que sean primos.
13. Escribid una funcin que dependiendo de un selector ejecute alguno de los primeros 5
ejercicios de este apartado. La funcin recibir un carcter (1,2,...,5) y deber devolver una
funcin que testea el apartado correspondiente. Por ejemplo, si escribimos f=selector(4),
f deber ser una funcin que al ejecutarse finalmente nos devuelva la palabra ejemplo en
maysculas.
CC-BY-NC-ND PID_00174138 39 El lenguaje Python
Bibliografa
Gonzlez Duque, Ral. Python para todos. CC. (Version on-line)