Introducción a Python para Programadores
Introducción a Python para Programadores
P R O G R A M A C I Ó N
02.01 - Python
introducción
fran_montoiro@ies_san_clemente#v1
DAM/DAW
02.01 - Python. Introducción programación
Características (I)
Python es un lenguaje de programación potente y fácil de aprender. En
líneas generales, podemos considerar este lenguaje como:
fran_montoiro@ies_san_clemente#v1 2
DAM/DAW
02.01 - Python. Introducción programación
Características (y II)
● Python soporta diferentes paradigmas de programación como la
programación estructurada o la orientada a objetos
fran_montoiro@ies_san_clemente#v1 3
DAM/DAW
02.01 - Python. Introducción programación
Versiones (I)
Las versiones de Python se identifican por tres números X.Y.Z:
● X corresponde a las grandes versiones de Python (1, 2 y 3), siendo
incompatibles entre sí. Actualmente se mantienen en desarrollo dos
versiones de Python, la 2 y la 3
● Y corresponde a versiones importantes en las que se introducen
novedades en el lenguaje pero manteniendo la compatibilidad (salvo
excepciones). Suelen publicarse cada año y medio y se mantienen
durante cinco años, excepto la versión 2.7 (última que se liberará de la
versión 2) que se mantendrá durante diez años hasta 2020
● Z se corresponde con revisiones menores que son liberadas durante el
periodo de mantenimiento. Corrigen errores y fallos de seguridad.
● Las últimas versiones publicadas de las ramas 2 y 3 son la 2.7.15 (mayo
de 2018) y la 3.7.0 (junio de 2018)
fran_montoiro@ies_san_clemente#v1 6
DAM/DAW
02.01 - Python. Introducción programación
Versiones (y II)
Discontinuado
Activo
Planeado
fran_montoiro@ies_san_clemente#v1 7
DAM/DAW
02.01 - Python. Introducción programación
Instalación (I)
Linux
● En general, en las distribuciones Linux nos encontraremos con que
Python ya se encuentra instalado por defecto en el sistema, bien en su
versión 2, en la 3 ó en ambas. Podemos comprobarlo mediante la
ejecución de los siguientes comandos:
● Versión 2:
zeroth@prog01:~$ python -V
Python 2.7.9
● Versión 3:
zeroth@prog01:~$ python3 -V
Python 3.4.2
fran_montoiro@ies_san_clemente#v1 8
DAM/DAW
02.01 - Python. Introducción programación
Instalación (II)
● En caso contrario, los paquetes necesarios para la instalación se
encontrarán en el repositorio de la distribución correspondiente y
podrán ser instalados con las herramientas disponibles en cada
distribución para ello. Por ejemplo, en Debian (como root):
● Versión 2:
root@prog01:~# apt-get update
root@prog01:~# apt-get install python idle
● Versión 3:
root@prog01:~# apt-get update
root@prog01:~# apt-get install python3 idle3
Instalación (III)
Windows
● Las siguientes imágenes muestran el proceso de instalación en
Windows 7 de Python 3. El instalador incluye el intérprete y las
herramientas IDLE y PIP. El espacio total requerido es de ~100MB
1) Descargar Python de la web oficial: [Link]
fran_montoiro@ies_san_clemente#v1 10
DAM/DAW
02.01 - Python. Introducción programación
Instalación (IV)
● Verificaremos la carpeta de
instalación y que las casillas de
“Instalación para todos los
usuarios” y “Añadir Python 3.7 al
PATH” estén marcadas.
Instalación (V)
4) Se abrirá una ventana solicitando permisos
para que la nueva aplicación haga cambios en
el sistema. Aceptaremos y ...
5) Se mostrará la ventana de
Progreso de Instalación
fran_montoiro@ies_san_clemente#v1 12
DAM/DAW
02.01 - Python. Introducción programación
Instalación (y V)
6) Por último, se mostrará un mensaje
indicado la finalización correcta de la
instalación.
Verificación de la instalación
● En el menú de programas se habrá creado una entrada nueva llamada Python.
Pulsaremos sobre el icono Python 3.7 (32-bit), que lanzará una consola del intérprete.
● Para verificar que el PATH se ha actualizado correctamente, abriremos una consola de
Windows y ejecutaremos el comando python, que debería lanzar la misma consola
fran_montoiro@ies_san_clemente#v1 13
DAM/DAW
02.01 - Python. Introducción programación
En este ejemplo se hace uso de una función print de Python para mostrar
el mensaje que se pasa como argumento. El texto del mensaje puede ir
encerrado con entrecomillado simple o doble.
fran_montoiro@ies_san_clemente#v1 15
DAM/DAW
02.01 - Python. Introducción programación
IDLE (I)
● Las distribuciones de Python incluyen un IDE simple, denominado
IDLE (o IDLE3), para facilitar la escritura, ejecución y depurado de
programas en Python
● Podemos lanzar IDLE desde el
menú de Python o desde la
consola con el comando idle (idle3
para Python 3)
● Al iniciarse nos muestra la típica
consola Python, con la diferencia
de que incluye resaltado de
sintaxis
● Los atajos Alt+p y Alt+n nos permiten recuperar comandos que
introdujimos en la consola con anterioridad.
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
02.01 - Python. Introducción programación
IDLE (II)
● IDLE utiliza resaltado de sintaxis para identificar y diferenciar
diferentes elementos del lenguaje o errores:
○ Las palabras reservadas de Python (las que forman parte del
lenguaje) se muestran en color naranja
○ Las cadenas de texto se muestran en verde
○ Los resultados de las órdenes se escriben en azul
○ Los mensajes de error se muestran en rojo
○ Las funciones se muestran en púrpura
● El siguiente ejemplo muestra un error al tratar de ejecutar una función
(print) sin encerrar sus argumentos (en este caso, el mensaje a mostrar)
entre paréntesis:
>>> print ”¡Hola, Mundo!”
SyntaxError: invalid syntax
>>>
fran_montoiro@ies_san_clemente#v1 19
DAM/DAW
02.01 - Python. Introducción programación
IDLE (III)
● Si bien la consola puede ser útil para
realizar pequeñas pruebas, a la hora de
programar aplicaciones desearemos
que nuestro código se guarde en un
archivo que podamos editar
posteriormente. Desde el menú File >
New File (ctrl+n) podremos lanzar una
nueva ventana del editor de IDLE para
crear un nuevo archivo de Python.
IDLE (y IV)
● Para poder ejecutar nuestro programa,
antes deberemos guardarlo. Usaremos la
opción File > Save (ctrl+S) ó File > Save As
(ctrl+shift+S) del menú.
● Es importante que el archivo tenga la
extensión .py para que el editor active el
resaltado de sintaxis al abrirlo.
● Para ejecutarlo usaremos la opción
Run > Run Module (F5)
● En la consola de la ventana principal
de IDLE se nos mostrará la salida del
programa, en este caso, el mensaje
que pasamos a la función print
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
02.01 - Python. Introducción programación
● Spyder
Home: [Link]
Windows (WinPython): [Link]
Linux (Debian/Ubuntu): instalar desde repositorios
● pyCharm
Home: [Link]
Descarga (Windows/Linux): [Link]
Instalación: [Link]
fran_montoiro@ies_san_clemente#v1 23
DAM/DAW
P R O G R A M A C I Ó N
02.02 - Python
básicos
fran_montoiro@ies_san_clemente#v1
DAM/DAW
02.02 - Python. Básicos programación
Tipos de datos
● Con objeto de facilitar el tratamiento de los datos por parte de nuestro
programa, Python, al igual que el resto de lenguajes de alto nivel,
ofrece una serie de tipos de datos para categorizarlos.
● Estos tipos de datos definen cómo se almacenan internamente dichos
datos y qué operaciones podemos realizar con ellos.
● En general, se suele distinguir entre tipos de datos escalares, que se
utilizan para tipos de datos atómicos y unidimensionales, y
no-escalares, para almacenar datos multidimensionales
Escalares No-Escalares
la función type()
int, para enteros str, para cadenas de caracteres permite
float, para reales (aproximación) tuple, para tuplas obtener el tipo
bool, para valores lógicos (True/False) list, para listas de un valor o
NoneType, para el valor None dict, para diccionarios variable
complex, para números imaginarios
fran_montoiro@ies_san_clemente#v1 2
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 3
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 5
DAM/DAW
02.02 - Python. Básicos programación
>>> 3 + 4 * 2
el producto tiene mayor precedencia que la suma y se
11
asocia por la izquierda, así que el orden en que se
resolvería sería: primero 4*2 y, al resultado, sumarle 3
>>> (3 + 4) * 2
14 el uso de paréntesis nos permite modificar el orden en
>>> (3 + 4) * (4 - (2 + 1)) que se evalúa la expresión, desde los paréntesis más
7 internos a los más externos
fran_montoiro@ies_san_clemente#v1 7
DAM/DAW
02.02 - Python. Básicos programación
>>> 0b110101
53
>>> 0b1 + 0b0001
2
>>> 0o10 + 0o10
8
>>> 0xcafe
51966
>>> 6 - 0b11*2 + 0xa
10
fran_montoiro@ies_san_clemente#v1 8
DAM/DAW
02.02 - Python. Básicos programación
Operador Descripción
& Y (AND)
| O (OR)
^ O exclusivo (XOR)
~ NOT
fran_montoiro@ies_san_clemente#v1 9
DAM/DAW
02.02 - Python. Básicos programación
and or not
fran_montoiro@ies_san_clemente#v1 11
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 12
DAM/DAW
02.02 - Python. Básicos programación
Operadores
● Tabla de operadores
fran_montoiro@ies_san_clemente#v1 13
DAM/DAW
02.02 - Python. Básicos programación
Variables (I)
Variables y asignaciones
● Las variables son elementos o estructuras del lenguaje que posibilitan
que nuestros programas almacenen valores para su uso posterior
>>> pulgadas_a_metros = 0.0254
>>> 50 * pulgadas_a_metros
1,27
fran_montoiro@ies_san_clemente#v1 14
DAM/DAW
02.02 - Python. Básicos programación
Variables (II)
● Una vez creada la variable, podremos usarla en posteriores sentencias
de nuestro programa. En el momento de la ejecución, el nombre de la
variable será “sustituido” por el valor que en ese momento tenga la
posición de memoria a la que apunta
● Mediante el operador de asignación (=) (no confundir con el operador
de comparación ==) podremos cambiar el valor de cualquier variable
existente.
● De forma general, la asignación es: variable = expresión
1) se evalúa la expresión a la derecha del símbolo igual (=)
2) se guarda el valor resultante en la variable indicada a la izquierda
● La primera operación sobre una variable debe ser la asignación de un
valor (inicialización). Si se intenta usar una variable no inicializada
generará un error de tipo NameError
fran_montoiro@ies_san_clemente#v1 15
DAM/DAW
02.02 - Python. Básicos programación
Variables (III)
Creación de pi
>>> pi = 3.14159265359 pi 3.14159265359
(inicialización)
Creación de r
>>> r = 1.23 r 1.23
(inicialización)
>>> perim = 2 * pi * r perim 7.72831792278314 Creación de perim
(inicialización)
>>> perim
7.72831792278314
>>> r = 2 asignación de
r 2
nuevo valor
>>> perim = 2 * pi * r perim 12.56637061436 asignación de
nuevo valor
>>> perim
12.56637061436
Variables (IV)
● Identificadores o nombre de variable
● El nombre de una variable es su identificador. Para que un identificador
sea válido, debe estar formado por letras, dígitos numéricos (no puede
ser el primer carácter) y/o el carácter de subrayado (_)
● Un identificador no puede coincidir con una de las palabras reservadas
o clave del lenguaje, es decir palabras que ya tienen un significado
predefinido para Python
False None True and as assert break class continue
def del elif else except finally for from global
if import in is lambda nonlocal not or pass
raise return try while with yield
Variables (V)
● Asignaciones con operador
● Al igual que muchos otros lenguajes, Python soporta la forma
compacta de asignación con operador asociado.
● Todos los operadores aritméticos disponen de su versión compacta con
asignación. Son de la forma:
>>> a = 5
operador= >>> b = 2
(sin espacio entre el operador y el signo =) >>> a += 4 * b
>>> a
● Estas construcciones permiten 13
>>> z = 1
reemplazar sentencias como: >>> z *= 3
>>> z **= 2
contador = contador + 1 >>> z -= 1
>>> z //= 2
por otras más compactas como: >>> z %= 4
>>> z
contador += 1 0
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 19
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 20
DAM/DAW
02.02 - Python. Básicos programación
Esto es un
ejemplo de un
texto multilínea
>>>
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 27
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 28
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 29
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 31
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 32
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 33
DAM/DAW
02.02 - Python. Básicos programación
fran_montoiro@ies_san_clemente#v1 34
DAM/DAW
P R O G R A M A C I Ó N
02.03 - Python
control de flujo
fran_montoiro@ies_san_clemente#v1
DAM/DAW
02.03 - Python. Control de Flujo programación
Introducción
Control del Flujo de Ejecución
● Las sentencias de control del flujo de ejecución de nuestros programas
permiten, bajo determinadas condiciones, alterar la ejecución
secuencial de las instrucciones de nuestros programas.
● Python proporciona diversas instrucciones para controlar flujo de
ejecución:
○ Sentencias condicionales o de selección: if
Permiten tomar decisiones en base a los datos y/o resultados y, en
función de estos, ejecutar ciertas sentencias y otras no
○ Sentencias iterativas o de repetición: for, while
Permiten tomar decisiones en base a los datos y/o resultados y, en
función de estos, ejecutar ciertas sentencias y otras no
fran_montoiro@ies_san_clemente#v1 2
DAM/DAW
02.03 - Python. Control de Flujo programación
a·x + b = 0
● Una posible solución podría ser:
'''
ecu_1G_solver.py ver.1
Resuelve ecuaciones de 1er grado
'''
# coeficientes
a = float(input('Introduce el coeficiente A: '))
b = float(input('Introduce el coeficiente B: '))
# resultado
x = -b/a
print('La solución es x = {0:.2f}'.format(x))
fran_montoiro@ies_san_clemente#v1 3
DAM/DAW
02.03 - Python. Control de Flujo programación
# coeficientes
a = float(input('Introduce el coeficiente A: '))
b = float(input('Introduce el coeficiente B: '))
# fin programa
print('Fin del programa')
fran_montoiro@ies_san_clemente#v1 6
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 8
DAM/DAW
02.03 - Python. Control de Flujo programación
if condición: No Sí
¿condición?
bloque de acciones si
condición es True
else:
bloque de acciones si Bloque de acciones Bloque de acciones
condición es False si condición es si condición es
False True
fran_montoiro@ies_san_clemente#v1 9
DAM/DAW
02.03 - Python. Control de Flujo programación
'''
ecu_1G_solver.py ver.4
Resuelve ecuaciones de 1er grado
'''
if a != 0:
x = -b/a
print('La solución es x = {0:.2f}'.format(x))
else:
# si a es 0 se informa al usuario
print('La ecuación no tiene solución')
fran_montoiro@ies_san_clemente#v1 10
DAM/DAW
02.03 - Python. Control de Flujo programación
if condición_1 : Sí No
# Se ejecuta si condición_1 es True ¿condición_1?
bloque 1
else :
Bloque 1
# Se ejecuta si condición_1 es False Sí
¿condición_2?
if condición_2 :
# Se ejecuta si condición_2 es True
bloque 2 Bloque 2
No
else :
# Se ejecuta si ambas condiciones son False
bloque 3 Bloque 3
fran_montoiro@ies_san_clemente#v1 11
DAM/DAW
02.03 - Python. Control de Flujo programación
if a != 0:
x = -b/a
print('La solución es x = {0:.2f}'.format(x))
else:
if b == 0:
print('Indeterminado: la ecuación tiene infinitas soluciones')
else:
print('La ecuación no tiene solución')
print('Fin del programa')
fran_montoiro@ies_san_clemente#v1 12
DAM/DAW
02.03 - Python. Control de Flujo programación
'''
ecu_1G_solver.py ver.6
Resuelve ecuaciones de 1er grado
'''
if a != 0:
x = -b/a
print('La solución es x = {0:.2f}'.format(x))
elif b == 0:
print('Indeterminado: la ecuación tiene infinitas soluciones')
else:
print('La ecuación no tiene solución')
fran_montoiro@ies_san_clemente#v1 14
DAM/DAW
02.03 - Python. Control de Flujo programación
Identación en Python
● Una nota final sobre la identación o sangrado que usa Python para
definir bloques de instrucciones. Si bien puede hacerse un tanto extraño
al principio, especialmente a programadores que vienen de otros
lenguajes como C o Java, donde se usa { } para definir dichos bloques,
tiene como claro objetivo obligar y facilitar la legibilidad del código.
● Fíjate en el código del siguiente programa. Es nuestro ejemplo pero
escrito en lenguaje C. Está un poco ”ofuscado” a propósito (de hecho se
podría haber escrito todo el programa en un par de líneas)
#include <stdio.h>
void main(){ float a,b,x;
printf("Coef A: "); scanf("%f", &a); printf("Coef B: "); scanf("%f", &b);
if(a!=0) {printf("La solución es x=%.2f", -b/a);} else {if(b==0)
{printf("Indeterminado");} else {printf("Sin solución");}}
printf("\nFin programa");}
print('\aDESPEGUE!!!\n') Esta instrucción sólo se ejecutará una vez que se salga del bucle
fran_montoiro@ies_san_clemente#v1 17
DAM/DAW
02.03 - Python. Control de Flujo programación
● En cada iteración del bucle, variable irá tomando uno de los valores de
serie_de_valores. Habrá tantas iteraciones como valores en la serie
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
02.03 - Python. Control de Flujo programación
● El siguiente ejemplo usa la función range, que nos permite generar una
secuencia de valores entre un valor inicial y otro final, para calcular el
factorial de un número introducido por el usuario:
num = int(input('Introduce un número: '))
fran_montoiro@ies_san_clemente#v1 19
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 20
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 22
DAM/DAW
02.03 - Python. Control de Flujo programación
output:
fran_montoiro@ies_san_clemente#v1 24
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 25
DAM/DAW
02.03 - Python. Control de Flujo programación
fran_montoiro@ies_san_clemente#v1 28
DAM/DAW
02.03 - Python. Control de Flujo programación
try:
num = int(input("Introduce un número: ")) Si se produce un error en
if num%2 == 0: la conversión, la
print(num, "es par") ejecución del programa
else: salta al bloque except
print(num, "es impar") encargado de la gestión
except ValueError: de dicha excepción
print("valor no válido")
fran_montoiro@ies_san_clemente#v1 29
DAM/DAW
02.03 - Python. Control de Flujo programación
try:
acciones que pueden generar un error
except tipo_de_error_1:
acciones a ejecutar si se produce tipo_de_error_1
except tipo_de_error_2:
acciones a ejecutar si se produce tipo_de_error_2
. . .
except :
acciones a ejecutar si se produce un error no contemplado
else:
acciones a ejecutar si no se produce ningún error
finally:
acciones a ejecutar siempre (con o sin error)
fran_montoiro@ies_san_clemente#v1 31
DAM/DAW
02.03 - Python. Control de Flujo programación
>>> try:
... num1 = float(input("Dividendo: ")) Dependiendo del error
... num2 = float(input("Divisor: ")) se ejecutará la cláusula
... result = num1/num2 except correspondiente
... except ValueError as err:
... print(err)
... except ZeroDivisionError: Si no hay errores, se
... print("Error: división entre 0") ejecuta la cláusula else
... else:
... print("{0}/{1} = {2:.3f}".format(num1, num2, result))
fran_montoiro@ies_san_clemente#v1 33
DAM/DAW
02.03 - Python. Control de Flujo programación
try:
fichero = open("[Link]") # abrimos el fichero con los valores
linea = [Link]() # lee una línea del archivo
while linea != "":
num = float(linea) # convertimos el valor leído a número
suma += num
linea = [Link]() # lee una nueva línea del archivo
except ValueError:
print("'{0}' no se puede convertir a float".format([Link]()))
except Exception as err: capturamos cualquier error que no sea ValueError
print("Error inesperado:", err)
else: else se ejecuta si no hubo ningún error
print("El total es {0:.2f}€".format(suma))
finally: finally siempre se ejecuta,
[Link]() # cerramos el fichero hubiera o no errores
02.04 - Python
funciones
fran_montoiro@ies_san_clemente#v1
DAM/DAW
02.04 - Python. Funciones programación
Introducción (I)
Funciones
● En muchos de los ejemplos visto hasta ahora, ya hemos hecho uso de
funciones proporcionadas por el propio lenguaje: print(), input(), sqrt(),...
Estas estructuras del lenguaje son la base de la programación modular,
que se cimenta sobre dos conceptos clave: abstracción y descomposición
fran_montoiro@ies_san_clemente#v1 2
DAM/DAW
02.04 - Python. Funciones programación
Introducción (y II)
● Desde el punto de vista de la descomposición, el empleo de funciones
nos permite la división de problemas complejos en tareas más simples
y abordables computacionalmente.
● En general, estas unidades funcionales:
○ son autocontenidas, es decir, representan tareas bien definidas que
la función puede resolver (si dispone de los datos necesarios)
○ permiten la división del código, facilitando su organización y
mantenimiento
○ son reutilizables
○ facilitan el trabajo en equipo ya que permiten repartir mejor la
carga de trabajo entre diferentes programadores
● Permiten su inclusión en bibliotecas o librerías de forma que sólo se
programen una vez pero se puedan usar por múltiples programas
fran_montoiro@ies_san_clemente#v1 3
DAM/DAW
02.04 - Python. Funciones programación
Definición
● Python nos permite crear nuestras propias funciones. Se declaran con
la cláusula def y todas tendrán:
○ un nombre def es_par ( i ):
○ parámetros (0 o más), """Chequea si un número es par.
fran_montoiro@ies_san_clemente#v1 4
DAM/DAW
02.04 - Python. Funciones programación
Invocación
● El código de una función, es decir, su cuerpo, sólo se ejecutará cuando
la llamemos (invocar) desde algún punto de nuestro programa
● La función deberá definirse antes de que pueda ser invocada
else: F Cuerpo de i 5
par = False la función
return par
x 5 par False
# Inicio del programa
x = int(input('Número?'))
ret = f(x) # invocación
if ret: ret False El ámbito de la función se destruye
print('Par')
else: una vez que finaliza, volviéndose a
crear en la siguiente invocación
print('Impar')
fran_montoiro@ies_san_clemente#v1 5
DAM/DAW
02.04 - Python. Funciones programación
Retorno (I)
● La cláusula return se emplea para devolver el control del programa al
punto desde el que se llamó a la función (invocación), y devolver un
valor de retorno que podrá ser empleado en cualquier expresión
● Una función puede tener varias cláusulas return (sólo una se ejecutará)
y el valor devuelto puede ser resultado de cualquier expresión, incluso
llamadas a otras funciones. Las siguiente funciones son equivalentes:
def es_par(i): def es_par(i):
if i%2 == 0: return i%2 == 0
return True
else:
return False
Retorno (II)
● Intenta determinar la salida del siguiente programa:
def func_a():
print("dentro de func_a")
print(func_a())
print(5 + func_b(2))
print(func_c(func_a))
fran_montoiro@ies_san_clemente#v1 7
DAM/DAW
02.04 - Python. Funciones programación
Retorno (y III)
● Las funciones en Python, pueden devolver más de un valor:
def min_max(vals):
"""Devuelve el máximo y el mínimo de una lista de valores.
Args:
vals (List): lista de valores.
Returns:
(float, float): Mínimo y máximo.
"""
[Link]()
return vals[0], vals[-1] return devuelve varios valores
separados por comas
recogemos los valores
valores = [7, 9, 2.5, 3, 12.2]
devueltos en varias variables
min, max = min_max(valores) separadas por comas.
print("Mínimo:", min, "; Máximo:", max) No es obligatorio recoger
todos los valores devueltos
x = 3 x 3
x 3
z = f( x ) Actual parameter (+1) 4
print("x =",x,"; z =",z)
z 4
en f(x): x = 4
x = 3 ; z = 4
fran_montoiro@ies_san_clemente#v1 9
DAM/DAW
02.04 - Python. Funciones programación
2 5 UnboundLocalError:
5 6 local variable 'x'
5 referenced before
assignment
fran_montoiro@ies_san_clemente#v1 10
DAM/DAW
02.04 - Python. Funciones programación
x = 5
h()
print(x)
fran_montoiro@ies_san_clemente#v1 12
DAM/DAW
02.04 - Python. Funciones programación
Argumentos (I)
● Nuestras funciones pueden tener el número de parámetros formales
que precisemos. En la invocación de la función debemos proporcionar
suficientes valores para todos ellos y en el orden indicado, según la
especificación de la función
def autor(nom, apel, f_nac): Especificación
. . .
autor("Frank", "Miller", "27/01/1957")
fran_montoiro@ies_san_clemente#v1 13
DAM/DAW
02.04 - Python. Funciones programación
Argumentos (II)
● Podemos establecer valores por defecto para los parámetros de la
función. Para ello, se les asignará un valor en la definición y podrán ser
omitidos en la invocación (se usarán los valores por defecto). Si hay
parámetros obligatorios y opcionales, estos deben ir al final
def autor(nom, apel, f_nac, activo="s"):
. . .
autor("Frank", "Miller", "27/01/1957") se usa el valor por defecto "s" de activo
autor("Stan", "Lee", "28/12/1922", "n") se usa el valor "n" proporcionado
fran_montoiro@ies_san_clemente#v1 14
DAM/DAW
02.04 - Python. Funciones programación
Argumentos (III)
● Python nos permite definir funciones que acepten un número variable
de argumentos. Para ello, usaremos los parámetros especiales *args y
**kwargs (args y kwargs pueden ser nombre arbitrarios).
*args
● Se creará en la función una tupla de nombre args y longitud variable
que recogerá los parámetros pasados. Los argumentos pasados en la
llamada pueden ser de diferente tipo
def sumatorio(*nums):
print("sumar:",nums)
sumar: (1, 2, 3)
suma = 0 6
for n in nums: sumar: (15, 10, -10, 5)
suma += n 20
return suma
print(sumatorio(1, 2, 3))
print(sumatorio(15, 10, -10, 5))
fran_montoiro@ies_san_clemente#v1 15
DAM/DAW
02.04 - Python. Funciones programación
Argumentos (y IV)
**kwargs (key-word arguments)
● En este caso, se creará un diccionario de nombre kwargs y longitud
variable que recogerá los parámetros pasados como parejas
nombre=valor. Los argumentos pasados en la llamada pueden ser de
cualquier tipo
def perso(**data): **data = {'nom': 'Frank', 'apel': 'Miller'}
print("\n**data = ", end="")
nom > Frank
print(data) apel > Miller
print()
for k in data: **data = {'edad': 51, 'pais': 'Japón',
'nom_apel': 'Taiyo Matsumoto'}
print(k,">",data[k])
edad > 51
perso(nom="Frank", apel="Miller") pais > Japón
nom_apel > Taiyo Matsumoto
perso(nom_apel="Taiyo Matsumoto",
edad=51, pais="Japón")
fran_montoiro@ies_san_clemente#v1 16
DAM/DAW
02.04 - Python. Funciones programación
Docstrings (I)
● Las docstrings nos proporcionan un mecanismo para asociar
documentación a los módulos, funciones, clases y métodos
● Se añaden como comentarios, empleando triple entrecomillado, en la
primera línea del elemento comentado
● A diferencia de los comentarios convencionales del código fuente, las
docstrings describen qué hace la función, no cómo
● Son empleados por diferentes herramientas para la generación de
documentación (help, sphinx), baterías de pruebas (doctest),...
>>> import math
>>> help([Link])
cos(...)
cos(x)
fran_montoiro@ies_san_clemente#v1 17
DAM/DAW
02.04 - Python. Funciones programación
Docstrings (II)
Guía de estilo
● Las líneas y párrafos docstring deben comenzar con letras mayúsculas
y terminar con punto (.)
● La primera línea (summary line), que será una descripción breve, debe
comenzar justo a continuación de la triple comilla
● Si hay más líneas, la segunda debe ser en blanco, separando la
descripción breve del resto de de la documentación
● Todas las funciones deberían tener un docstring
● El docstring de un módulo comenzará en la primera línea del archivo
● La triple comilla final se colocará al final de la primera línea (si no hay
más) o sóla en una línea
● El PEP (Python Enhancement Proposal) 257 establece las convenciones
para la creación de docstrings
● Ejemplo: [Link]
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
02.04 - Python. Funciones programación
Docstrings (III)
El módulo doctest y los docstrings
● El módulo doctest busca en los docstrings porciones de texto que
simulan sesiones interactivas de Python con ejemplos de uso de las
funciones y verifica que se ejecuten del modo propuesto.
● Esto nos va a permitir:
○ Verificar que los docstrings están actualizados y que los ejemplos
interactivos funcionan tal cual se indica
○ Realizar pruebas de regresión (regression tests) desde los archivos de
baterías de pruebas de nuestras funciones, verificando que siguen
funcionando de forma correcta tras modificaciones
○ Escribir documentación de tipo tutorial para nuestros módulos y
paquetes, ilustrándola con ejemplos de uso “ejecutables”
fran_montoiro@ies_san_clemente#v1 19
DAM/DAW
02.04 - Python. Funciones programación
Docstrings (y IV)
"""Módulo de 'ejemplo'."""
def suma(*nums):
"""Devuelve la suma de los números de la lista.
Args:
n (list): lista de números
Returns:
(float): sumatorio
"""
suma = 0.0
for num in nums:
suma += num
return suma
Módulos (I)
● A medida que nuestros programas van creciendo y se van haciendo
más complejos, es necesario dividirlos de diferentes archivos para
facilitar su mantenimiento
● De igual modo, es probable que algunas de las funciones que ya
tenemos escritas, queramos reutilizarlas en algún otro programa sin
tener que “copiar” en él la definición de las mismas
● Python nos permite escribir las definiciones de las funciones en
archivos Python independientes o módulos.
● Para poder usar en un programa las funciones contenidas en un
módulo, deberemos importar dicho módulo (o una función concreta)
desde nuestro programa mediante el uso de la sentencia import
● El siguiente ejemplo, muestra un módulo (archivo [Link]) con dos
funciones para resolver la serie de Fibonacci hasta un número dado
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
02.04 - Python. Funciones programación
Módulos (II)
"""Módulo de la serie de Fibonacci ([Link])."""
def fib(n):
"""Imprime la serie de Fibonacci."""
a, b = 0, 1 # Asignación simultánea de a y b
while b < n:
print (b, end=' ')
a, b = b, a+b
def fib2(n):
"""Devuelve una lista con la serie de Fibonacci."""
result = []
a, b = 0, 1
while b < n:
[Link](b)
a, b = b, a+b
return result
fran_montoiro@ies_san_clemente#v1 22
DAM/DAW
02.04 - Python. Funciones programación
Módulos (III)
● Vamos a hacer un pequeño programa (test_fibo.py) para probar las
funciones del módulo anterior (ambos archivos deben estar en la
misma carpeta)
import fibo importamos el módulo fibo
fran_montoiro@ies_san_clemente#v1 23
DAM/DAW
02.04 - Python. Funciones programación
Módulos (IV)
● La sentencia import fibo hace que el nombre del módulo se importe en
la tabla de símbolos del programa, de forma que las distintas funciones
que contiene pueden ser accedidas mediante la sintaxis:
nombre_de_módulo.nombre_de_la_función
● Existe una variante de import que nos permite importar directamente
los nombres de las funciones a la tabla de símbolos. De ese modo,
podremos invocarlas directamente sin tener que anteponer el nombre
del módulo:
from nombre_de_módulo import nombre_de_la_función
Módulos (V)
● Nuestro anterior programa podría quedar:
fran_montoiro@ies_san_clemente#v1 25
DAM/DAW
02.04 - Python. Funciones programación
Módulos (VI)
alias de nombre de módulo/función
● La sintaxis de import permite la definición de alias de nombres
import nombre_de_módulo as alias
A partir de ese momento, deberemos invocar las funciones mediante:
alias.nombre_de_la función
fran_montoiro@ies_san_clemente#v1 26
DAM/DAW
02.04 - Python. Funciones programación
Módulos (VII)
Búsqueda de módulos en el sistema
● Python busca nuestros módulos en la carpeta actual. Cuando están
contenidos en diferentes subcarpetas, deberemos “replicar” esa misma
estructura en la sentencia import concatenando las subcarpetas
mediante puntos (.) Si en el ejemplo anterior, el archivo [Link] del
módulo estuviera en una subcarpeta denominada “mods” haríamos
import [Link] (con alias, import [Link] as f )
Las funciones se invocarían mediante:
[Link] y [Link].fib2 (con alias, [Link] y f.fib2, no cambia! )
fran_montoiro@ies_san_clemente#v1 27
DAM/DAW
02.04 - Python. Funciones programación
Módulos (y VIII)
La variable __name__
● Cuando el intérprete Python carga un nuevo archivo para su ejecución,
inicializa la variable de sistema __name__ con el siguiente valor:
○ “__main__”, si el archivo se lanzó como un script y es el
punto de entrada de la aplicación (main scope)
○ “nombre_del_modulo”, si el archivo se importó como módulo
● Es habitual que los scripts de Python evalúen al iniciarse esta variable
para determinar cómo fueron invocados y actuar en consecuencia. Por
ejemplo, podríamos añadir lo siguiente a un módulo de funciones para
ejecutar pruebas con doctest:
if __name__ = '__main__':
import doctest
[Link](verbose=True)
fran_montoiro@ies_san_clemente#v1 28
DAM/DAW
02.04 - Python. Funciones programación
[Link](filename="[Link]", level=[Link],
format='%(asctime)s %(levelname)-8s %(message)s')
[Link]('Lista de argumentos: ', ' '.join([Link]))
# decoraciones
[Link]('Gráficas')
[Link]('x')
[Link]('y')
[Link](True)
[Link]()
fran_montoiro@ies_san_clemente#v1 35
DAM/DAW
P R O G R A M A C I Ó N
02.05 - Python
Tipos estructurados
fran_montoiro@ies_san_clemente#v1
DAM/DAW
02.05 - Python. Tipos estructurados programación
Introducción (I)
● Hasta el momento, todo el tratamiento computacional se ha realizado
sobre datos de tipos primitivos (int, float, boolean) y un tipo particular
de colección, las cadenas de texto (String)
● De igual modo que las funciones nos proporcionan un mecanismo para
agrupar código en una única “entidad” e invocarlo cuando lo
necesitemos, los lenguajes de programación suelen disponer de
estructuras de datos que nos permiten agrupar colecciones de datos (de
igual o diferente tipo) y tratarlos de modo conjunto.
● Python proporciona los siguientes tipos estructurados:
ARRAY TUPLA LISTA SET DICCIONARIO
ORDENADO (ind) X X X
NO ORDENADO X X
INMUTABLE X
fran_montoiro@ies_san_clemente#v1 2
DAM/DAW
02.05 - Python. Tipos estructurados programación
Introducción (II)
● Varios de los tipos estructurados para el manejo de colecciones son de
tipo secuencia (array, lista, tupla, string). Cada elemento de la colección
se encuentra en una posición concreta (índice) dentro de la secuencia.
● Operaciones comunes de secuencias (tipos mutables e inmutables):
Operación Resultado
len(s) Longitud de s
[Link](x[, i[, j]])) Indice de la primera ocurrencia de x en s (desde i hasta j)(i,j no impl. siempre)
fran_montoiro@ies_san_clemente#v1 3
DAM/DAW
02.05 - Python. Tipos estructurados programación
Introducción (III)
● Operaciones comunes de secuencias de tipos mutables:
Operación Resultado
del s[i:j:k] Elimina los items desde desde i hasta (j-1) y salto k
fran_montoiro@ies_san_clemente#v1 4
DAM/DAW
02.05 - Python. Tipos estructurados programación
Introducción (y IV)
● Una característica de estas estructuras de datos de tipo secuencia, al
igual que otros objetos de tipo contenedor como los String, es que
soportan la iteración a través de sus elementos.
fran_montoiro@ies_san_clemente#v1 5
DAM/DAW
02.05 - Python. Tipos estructurados programación
Arrays (I)
● Los arrays son el método tradicional de crear colecciones de datos
primitivos, donde todos los datos de la colección, son del mismo tipo.
Si bien son populares en lenguajes como C, C++ o Java, no lo son tanto
en Python, pues dispone de tipos estructurados más flexibles (listas).
● En general, cuando la gente habla de arrays en Python, suelen referirse
a las listas. Sin embargo, son estructuras de datos diferentes. En
Python, los arrays pueden ser vistos como una manera eficiente de
almacenar cierta listas, donde todos los elementos son del mismo tipo.
● En Python, el soporte de arrays lo proporciona el módulo array que
debe ser importado antes de poder inicializarlos y usarlos.
● Durante la creación del array, deberemos indicar su tipo de datos,
limitando de esta manera el rango y tipo de los valores almacenados
● Documentación oficial: [Link]
fran_montoiro@ies_san_clemente#v1 6
DAM/DAW
02.05 - Python. Tipos estructurados programación
Arrays (II)
CÓDIGO TIPO TIPO C EQUIV TIPO PYTHON TAMAÑO(Bytes) RANGO VALORES
fran_montoiro@ies_san_clemente#v1 8
DAM/DAW
02.05 - Python. Tipos estructurados programación
Tuplas (I)
● Las tuplas son secuencias inmutables, generalmente empleadas para el
almacenamiento ordenado de datos heterogéneos.
● Su diferencia fundamental con las listas es que, una vez creada, no
puede ser modificada, a diferencia de las listas. Suelen emplearse para
almacenar secuencias de valores constantes (por ejemplo, las claves de
un diccionario) o en retornos de funciones de varios valores.
● Las tuplas pueden ser construidas de diferentes maneras:
○ Usando un par de paréntesis para denotar la tupla vacía: ( )
○ Usando una coma final para una tupla simple: a, ó (a,)
○ Separando los items con comas: a, b, c ó (a, b, c)
○ Usando el constructor tuple( ): tuple( ) ó tuple(iterable)
● En realidad es la coma, no el paréntesis, lo que determina a una tupla.
Son opcionales salvo en casos ambiguos (paso parámetros a función,...)
fran_montoiro@ies_san_clemente#v1 9
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 10
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 11
DAM/DAW
02.05 - Python. Tipos estructurados programación
Listas (I)
● Como las tuplas, las listas son secuencias ordenadas de datos del
mismo o diferente tipo. La principal diferencia es que las listas son
mutables. Es decir, una vez creadas, pueden ser modificadas.
● Este hecho aporta una gran flexibilidad. Por otro lado, puede dar lugar
a situaciones indeseables. Por ejemplo, una lista pasada a una función,
podría ver modificado su contenido en el interior de la misma.
● Las listas pueden ser construidas de diferentes maneras:
○ Usando un par de corchetes para denotar la lista vacía: [ ]
○ Usando corchetes, separando los items con comas: [a], ó [a, b, c]
○ Usando listas por comprensión: [x for x in iterable]
○ Usando el constructor list( ): list( ) ó list(iterable)
● Además de los métodos y operaciones de las secuencias mutables, las
listas disponen también del método sort( )
fran_montoiro@ies_san_clemente#v1 12
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 13
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 14
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 15
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 16
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 17
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
02.05 - Python. Tipos estructurados programación
x 0 1 2
x = [1, 2, 1] x[2] → 1
1 2
y = x x 0 1 2
x[2] → 1
y[2] → 1
y
1 2
x[2] = 3 x 0 1 2
x[2] → 3
y[2] → 3
y
1 2 3
fran_montoiro@ies_san_clemente#v1 20
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
02.05 - Python. Tipos estructurados programación
x 0 1 2
x = [1, 2, 1] x[2] → 1
1 2
0 1 2
y = x[:] x
x[2] → 1
1 2 y[2] → 1
y
0 1 2
0 1 2
x[2] = 3 x
x[2] → 3
1 2 3 y[2] → 1
y
0 1 2
fran_montoiro@ies_san_clemente#v1 22
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 23
DAM/DAW
02.05 - Python. Tipos estructurados programación
1 2
0 1
y = x[:] x
0 1
x[1] → [1, 2]
1 y[1] → [1, 2]
y
2
0 1
0 1
x[1][0] = 2 x
0 1
x[1] → [2, 2]
1 y[1] → [2, 2]
y
2
0 1
1 2
0 1 0 1
y = [Link](x) x
x[1] → [1, 2]
1 2 y[1] → [1, 2]
y
0 1 0 1
0 1 0 1
x[1][0] = 2 x
x[1] → [2, 2]
1 2 y[1] → [1, 2]
y
0 1 0 1
Sets (I)
● Los sets o conjuntos, son secuencias de elementos que cumplen:
○ No están ordenados. No soporta indexado.
○ Cada elemento es único (no se permiten duplicados)
○ El set es mutable pero sus elementos tienen que ser de tipo inmutable
● Usos habituales de los sets son su empleo como claves de diccionarios,
eliminación de duplicados y el cálculo de operaciones matemáticas del
álgebra de conjuntos (unión, intersección, diferencia, complemento,...)
● Al igual que el resto de colecciones, soporta el operador pertenencia (in),
la función len( ) y su recorrido mediante bucles for.
● Los sets pueden ser construidos de diferentes maneras:
○ Usando llaves, separando los items con comas: {1}, ó {a, b, c}
○ Usando el constructor set( ): set( ) ó set(iterable)
fran_montoiro@ies_san_clemente#v1 27
DAM/DAW
02.05 - Python. Tipos estructurados programación
Sets (III)
● Operaciones de álgebra de conjuntos:
Operación Ejemplo
fran_montoiro@ies_san_clemente#v1 29
DAM/DAW
02.05 - Python. Tipos estructurados programación
Sets (y IV)
x1 = {'foo', 'bar', 'baz'}
x2 = {'baz', 'qux', 'quux'}
[Link](x2) [Link](x2)
x1 | x2 x1 & x2
[Link](x2) x1.symmetric_difference(x2)
x1 - x2 x1 ^ x2
fran_montoiro@ies_san_clemente#v1 30
DAM/DAW
02.05 - Python. Tipos estructurados programación
Diccionarios (I)
● Los diccionarios son estructuras de datos del tipo arrays asociativos.
Consisten en colecciones no ordenadas y mutables de pares clave:valor,
donde cada clave referencia (indexa) un valor concreto. El acceso a los
diferentes valores almacenados en el diccionario se realiza a través de
la clave correspondiente.
● Las agendas o los diccionarios de las lenguas, son típicos ejemplos de
diccionarios. También lo sería cualquier tabla cuyos registros estuvieran
identificados por un campo clave, índice o primary key
● Las claves son únicas (no puede haber claves duplicadas) y deben ser de
un tipo inmutable (tipos primitivos y tuplas, si no contienen tipos
mutables)
● No hay restricciones en cuanto al tipo de datos de los valores. Además,
distintas claves pueden tener valores de diferentes tipos
fran_montoiro@ies_san_clemente#v1 31
DAM/DAW
02.05 - Python. Tipos estructurados programación
Diccionarios (II)
● Los diccionarios pueden ser construidos de diferentes formas:
○ Usando llaves para denotar un diccionario vacío: { }
○ Usando llaves, separando las parejas clave:valor mediante comas:
{ 1:'uno', 2:'dos', 'otra_clave':'otro_valor' }
○ Usando el constructor: dict( ) ó dict(secuencia de parejas)
● Desde Python 3.5, se dispone de una nueva sintaxis (operador **) para
generar nuevos diccionarios a partir de la unión de otros (PEP 448)
>>> d1 = {1:'uno', 2:'dos', 3:'tressss'}
>>> d2 = {4:'cuatro', 3:'tres'}
>>> d3 = {**d1, **d2, 5:'cinco', 6:'seis'}
>>> d3
{1: 'uno', 2: 'dos', 3: 'tres', 4: 'cuatro', 5: 'cinco', 6: 'seis'}
fran_montoiro@ies_san_clemente#v1 34
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 35
DAM/DAW
02.05 - Python. Tipos estructurados programación
fran_montoiro@ies_san_clemente#v1 36
DAM/DAW
P R O G R A M A C I Ó N
03.02 - POO
Python
fran_montoiro@ies_san_clemente#v1
DAM/DAW
03.02 - POO. Python programación
class Coordenada(object):
self.x = x
self.y = y
método
datos de inicialización de
constructor
estado del nuevo objeto
heredado
de la clase
parámetro con la referencia a
object
la nueva instancia
fran_montoiro@ies_san_clemente#v1 7
DAM/DAW
03.02 - POO. Python programación
Creando objetos
● Vamos a crear objetos de la clase Coordenada anterior:
c = Coordenada(3, 4) Creamos nuevos objetos (instancias)
de la clase Coordenada utilizando
origen = Coordenada(0, 0)
su nombre de clase
print(c.x)
print(origen.x, origen.y) Proporcionamos los parámetros
necesarios según la definición del
constructor. El argumento para self
● Empleamos el operador “.” no se proporciona, es proporcionado
para acceder a los miembros automáticamente por Python
del objeto
● c.x se interpreta como
“accede al valor asociado a La función isinstance(obj, class)
x en el contexto (frame) c”, nos permite chequear si un objeto
es decir, la variable de concreto es una instancia de una
instancia x del objeto c clase determinada. Ej:
isinstance(c, Coordenada)
fran_montoiro@ies_san_clemente#v1 8
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 11
DAM/DAW
03.02 - POO. Python programación
p1 = Coordenada(3, 4) p1 = Coordenada(3, 4)
p2 = Coordenada(-3, -4) p2 = Coordenada(-3, -4)
print([Link](p2)) print([Link](p1, p2))
fran_montoiro@ies_san_clemente#v1 13
DAM/DAW
03.02 - POO. Python programación
class Coordenada:
. . .
def __str__(self):
return '<{}, {}>'.format(self.x, self.y)
p1 = Coordenada(3, 4)
print(p1)
<3, 4>
fran_montoiro@ies_san_clemente#v1 15
DAM/DAW
03.02 - POO. Python programación
False
¿Cómo modificaríamos la
+ __add__(self, other)
- __sub__(self, other)
== __eq__(self, other)
clase para que comparara
< __eq__(self, other)
coordenadas?
len() __len__(self)
[Link]
fran_montoiro@ies_san_clemente#v1 16
DAM/DAW
03.02 - POO. Python programación
p1 = Coordenada(3, 4)
p2 = Coordenada(3, 4)
print(p1 == p2)
True
fran_montoiro@ies_san_clemente#v1 17
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 18
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 19
DAM/DAW
03.02 - POO. Python programación
class Temp:
def __init__(self, temp):
[Link] = []
self.set_temp(temp)
def set_temp(self, temp):
[Link] = temp
>>> from u03_02 import Temp
[Link](temp)
>>> t1 = Temp(21)
def get_temp(self):
>>> t1.set_temp(23)
return [Link]
>>> print("Tª actual:", t1.get_temp())
def get_temps(self):
Tª actual: 23
return [Link]
>>> print("Tª registradas:", t1.get_temps())
Tª registradas: [21, 23]
>>> lista_t = t1.get_temps()
Obtenemos una copia de la lista de tª
>>> id([Link]), id(lista_t)
(139869576302280, 139869576302280)
En realidad, la clase no nos devuelve
>>> lista_t.extend([18, -2, 35])
una copia, devuelve la misma lista
>>> print("Tª registradas:", t1.get_temps())
(fíjate que tiene el mismo id)
Tª registradas: [21, 23, 18, -2, 35]
Si hacemos cambios en la “copia” (que
no es tal), nos afecta al propio objeto
fran_montoiro@ies_san_clemente#v1 21
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 22
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 23
DAM/DAW
03.02 - POO. Python programación
fran_montoiro@ies_san_clemente#v1 24
DAM/DAW
03.02 - POO. Python programación
Herencia (I)
● La herencia nos permite crear jerarquías de clases
● Estas jerarquías nos permiten agrupar en las clases padre (superclase)
características y comportamientos comunes de sus hijos (subclase), al
tiempo que vamos refinando los comportamientos (especialización) a
medida que descendemos por los diferentes niveles de la jerarquía.
● Vamos a ver cómo maneja la herencia en Python. Para ello,
implementaremos las clases de la siguiente jerarquía:
Animal
Estudiante
fran_montoiro@ies_san_clemente#v1 25
DAM/DAW
03.02 - POO. Python programación
Herencia (II)
class Animal:
def __init__(self, edad):
[Link] = edad
[Link] = None
def get_edad(self):
return [Link]
getters
def get_nombre(self):
return [Link] __init__ y __str__
def set_edad(self, edad): se heredan de object
[Link] = edad
setters
def set_nombre(self, nombre = ""):
[Link] = nombre
def __str__(self):
return "animal:{}:{}".format([Link], [Link])
Hereda de Animal
Usa su método __init__ y sobreescribe el método __str__
class Gato(Animal):
def habla(self):
Añade nueva funcionalidad a través de un nuevo método
print("miau!!")
def __str__(self):
return "gato:{}:{}".format([Link], [Link])
fran_montoiro@ies_san_clemente#v1 26
DAM/DAW
03.02 - POO. Python programación
Herencia (III)
>>> import u03_02
>>> mi_animal = u03_02.Animal(3) Importamos el módulo donde están
>>> print(mi_animal) definidas las clases
animal:None:3
>>> mi_animal.set_nombre("dude")
>>> print(mi_animal)
animal:dude:3
>>> mi_animal.get_edad()
3
>>> yin = u03_02.Cat(1) Se busca el método en la clase (Gato).
>>> [Link]() Como no se encuentra, se sube por la
miau!! jerarquía hasta encontrarlo (Animal)
>>> yin.set_nombre("YinYang")
>>> yin.get_nombre()
'YinYang'
>>> print(yin)
gato:YinYang:1
>>> print(Animal.__str__(yin)) Podemos invocar el método sobreescrito del padre
animal:YinYang:1
>>> blob = u03_02.Animal(1)
>>> blob.set_nombre() Se usa el valor por defecto del método
>>> print(blob)
animal::1
fran_montoiro@ies_san_clemente#v1 27
DAM/DAW
03.02 - POO. Python programación
Herencia (IV)
class Perro(Animal):
def habla(self):
print("guau!!")
def __str__(self):
return "perro:{}:{}".format([Link], [Link])
class Persona(Animal):
def __init__(self, nombre, edad):
Animal.__init__(self, edad) Llamada al constructor de la superclase
self.set_nombre(nombre)
[Link] = []
def get_amigos(self): Nuevo atributo
return [Link][:]
def add_amigo(self, amigo):
if isinstance(amigo, Persona) and amigo not in [Link]:
[Link](amigo)
def habla(self): Añadimos nuevos objetos sólo de tipo
print("hola!") Persona (incluye subclases)
def set_nombre(self, nombre = ""):
[Link] = nombre
def __str__(self):
return "persona:{}:{}".format([Link], [Link])
fran_montoiro@ies_san_clemente#v1
DAM/DAW
03.02 - POO. Python programación
Herencia (V)
import random
class Estudiante(Persona):
def __init__(self, nombre, edad, estudia=None):
Persona.__init__(self, nombre, edad) Llamada al constructor de la superclase
[Link] = estudia
def get_estudia(self): Nuevo atributo
return [Link]
def set_cursa(self, estudia):
[Link] = estudia
def habla(self):
r = [Link]() Genera un float entre [0, 1)
if r < 0.25:
print("tengo deberes")
elif 0.25 <= r and r < 0.5:
print("necesito dormir")
elif 0.5 <= r and r < 0.75:
print("tengo hambre!")
else:
print("estoy viendo la tele")
def __str__(self):
return "estudiante:{}:{}:{}".format([Link], [Link], [Link])
fran_montoiro@ies_san_clemente#v1
DAM/DAW
03.02 - POO. Python programación
Herencia (y VI)
>>> import u03_02
>>> eric = u03_02.Persona("eric", 41)
>>> joe = u03_02.Persona("joe", 32)
>>> print(joe)
persona:joe:32
>>> josh = u03_02.Estudiante("josh", 19, "Biología")
>>> fred = u03_02.Estudiante("fred", 18)
>>> print(josh)
estudiante:josh:19:Biología
>>> print(fred)
estudiante:fred:18:
>>> [Link]()
'tengo hambre!'
>>> eric.add_amigo(joe)
>>> eric.add_amigo(josh)
>>> eric.add_amigo(fred)
>>> for amigo in eric.get_amigos():
... print(amigo.get_nombre() + "> ", end="")
... [Link]()
joe> hola! Enlazado dinámico del método (polimorfismo)
josh> necesito dormir
fred> estoy viendo la tele
fran_montoiro@ies_san_clemente#v1 30