Registros en Python

Unidad 6 Capítulo 7 Andres Marzal Clase 12 - Capítulo 7 Ing Leonardo Fernández Rosati Comisión 3.1 1 Temario • 7.

Views 87 Downloads 0 File size 162KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Unidad 6 Capítulo 7 Andres Marzal

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

1

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

2

7 Tipos estructurados: registros •

El conjunto de tipos de datos Python que hemos estudiado se divide en tipos: – escalares: (enteros y flotantes) – tipos secuenciales: (cadenas y listas). • En este tema aprenderemos a definir y utilizar tipos de datos definidos por nosotros mismos agregando tipos de datos de diferente o igual naturaleza. • Por ejemplo, podremos definir un nuevo tipo que reúna un entero y dos cadenas o uno diferente con una lista y un flotante. Los datos de estos nuevos tipos reciben el nombre de registros. • Los registros nos permiten modelar objetos del mundo real que deben describirse mediante una colección de informaciones, como personas, canciones, fechas, etc. Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

3

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

4

7.1.1. Asociando datos relacionados Op. 1 Uso de variables independientes I •Supón que en un programa utilizamos:

el nombre, el DNI y la edad de dos personas •variables_sueltas.py # ejecutar 1 nombre = 'Juan Paz' 2 dni = '12345678Z' 3 edad = 19 4 5 otronombre = 'Ana Mir' 6 otrodni = '23456789D' 7 otraedad = 18 •Los datos almacenados en nombre, dni y edad corresponden a la primera persona y los datos guardados en otronombre, otrodni y otraedad corresponden a la segunda persona Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

5

7.1.1. Asociando datos relacionados Op. 1 uso de variables independientes II • Si decidiéramos mostrar los datos ingresados podríamos hacer: 1 def mostrar_persona(nombre, dni, edad): 2 print 'Nombre:', nombre 3 print 'DNI: ', dni 4 print 'Edad: ', edad 14 mostrar_persona(nombre, dni, edad) 15 mostrar_persona(otronombre, otrodni, otraedad) •Que pasa si quiero agregar 50 personas más ? Fácil creo 150 nuevas variables con nombres diferentes •Y si quiero agregar otro campo como el genero, profesión, deporte preferido? Simplemente debo modificar todas la funciones que cree Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

6

7.1.1. Asociando datos relacionados Op. 2 Uso de Listas separadas • imagina que deseas manejar una lista de personas, como los • estudiantes de una clase. Ahora tenemos que gestionar tres listas paralelas: – una con los nombres, – Otra con los DNI y – otra con las edades. • La idea es que los elementos de las tres listas que presentan el mismo índice correspondan a la misma persona. • Supón que has de ordenar las listas para que los nombres aparezcan en orden alfabético. ¿ como hacemos para modificar las otras dos ? • Gestionar tres listas paralelas (o más, si hubiera que gestionar más datos de cada persona) es engorroso.

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

7

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

8

7.1.2. Pero sabemos hacerlo mejor Uso de Listas individuales

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

9

7.1.2. Pero sabemos hacerlo mejor listas individuales • defino una lista para cada persona con tres elementos. 1 juan = ['Juan Paz', '12345678Z', 19] 1 ana = ['Ana Mir', '23456789D', 18] • La función que muestra por pantalla todos los datos de una persona tiene ahora este aspecto 1 def mostrar_persona(persona): 2 print 'Nombre:', persona[0] 3 print 'DNI: ', persona[1] 4 print 'Edad: ', persona[2]

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

10

7.1.2. Pero sabemos hacerlo mejor listas individuales • Creo una variable lista por cada persona • Deberemos recordar que: – El índice 0 accede al nombre, – El índice 1 al DNI y – El índice 2 a la edad.

• Por ejemplo, para acceder a la edad de Juan Paz hemos de escribir juan[2]. • Si decidiésemos añadir la dirección de cada persona a su correspondiente lista, nos veríamos obligados a redefinir mostrar_persona, pero sólo en lo que toca a añadir una línea a su cuerpo para imprimir la nueva información. Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

11

Evolución natural Hacemos la lista de listas •Con todas las listas de personas puedo crear una lista de listas 8 personas = [juan, ana] O, 10 personas = [['JuanuPaz', '12345678Z', 19], \ 11 ['AnauMir,' '23456789D', 18]

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

]

12

Lista de listas • El nombre de Ana Mir, por ejemplo, está accesible en personas[1][0]. • Si deseamos mostrar el contenido completo de la lista podemos hacer: 13 for persona in personas: 14 mostrar_persona(persona)

• Desventajas: Esta aproximación sólo presenta un serio inconveniente: la necesidad de recordar qué información ocupa qué posición en el vector que describe a cada persona (el nombre es el elemento 0, el DNI es el elemento 1, etc.) Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

13

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

14

7.2. Registros • La solución pasa por definir un nuevo tipo de datos para las personas llamado, por ejemplo, Persona. • Una variable del tipo Persona agrupará los tres datos de una persona (su nombre, su dni y su edad) de modo similar a como hace una lista. • La diferencia estribará en la forma con que accederemos a cada información: en lugar de usar una notación como juan[0] par a acceder al nombre, usaremos esta otra: juan.nombre

• Persona es un tipo de datos, y no una variable, usaremos siempre inicial en mayúsculas para los identificadores de los tipos de datos. Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

15

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

16

7.2.1. Definición de tipo de dato registro • Python no da soporte nativo para registros, sino para clases, así que los simularemos a través de un módulo llamado record (que en inglés significa registro ) 1 from record import record 2 3 class Persona(record): 4 nombre = '' 5 dni = '' 6 edad = 0 • Fíjate en que decimos que Persona

una variable.

Clase 12 - Capítulo 7

es un tipo de datos, y no

No confundas los conceptos.

Ing Leonardo Fernández Rosati Comisión 3.1

17

Creación de variables tipo registro • persona.py #Ejecutar 8 juan = Persona(nombre='Juan Paz', dni='12345678Z', edad=19) 9 ana = Persona(nombre='Ana Mir', dni='23456789Z', edad=18)

.

.

1 print juan nombre, juan dni

.

2 if juan edad >= 18: 3 print 'Es mayor de edad.‘

¿Notaste el punto?

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

18

Funciones que muestran registros •Para impimir los datos de las personas podemos hacer la siguiente función 13 def mostrar_persona(persona): 14 print 'Nombre:', persona.nombre 15 print 'DNI: ', persona.dni 16 print 'Edad: ', persona.edad Noten que a la función le pasamos los datos particulares de una persona por eso usamos minúsculas •Podemos llamar a la función así: 18 mostrar_persona(juan) Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

19

Omisión de argumentos • Cuando construyes una variable de tipo Persona puedes omitir alguno de sus campos: 1 maria = Persona(nombre='María Ruiz', dni='12345701Z’) • En tal caso, el campo que no aparece entre los argumentos del constructor existe y toma el valor por defecto que indicamos al definir el registro 1 print maria.edad 0 • En cualquier instante puedes modificar el valor de un campo: 1 maria.edad = 20 2 juan.edad += 1 Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

20

Definición de listas del tipo Persona • Ahora podemos definir listas cuyos elementos básicos son del tipo Persona 20 listapersonas = [Persona(nombre=’Juan Paz’, dni=’12345678Z’, edad=19), \ 1 Persona(nombre=’Ana Mir’, dni=’23456789Z’, edad=18) ]

• O bien a través de valores almacenados en variables, 23 juan = Persona(nombre=’Juan Paz’, dni=’12345678Z’, edad=19) 24 ana = Persona(nombre=’Ana Mir’, dni=’23456789Z’, edad=18) 25 Listapersonas = [ juan, ana] Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

21

Operaciones con listas del tipo Persona • Podemos recorrer el contenido completo de la lista con un bucle: 27 for persona in personas: 28 mostrar_persona(persona)

• Acceder a los campos de cada elemento es sencillo: 30 print personas[0].nombre 31 print personas[0].dni 32 print personas[0].edad

• Y podemos pasar elementos de la lista como argumentos de una función: 34 mostrar_persona(personas[0]) Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

22

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

23

7.2.2. Referencias a registros • Las variables apuntan a registros y se comportan como las referencias a listas ,si asignas un registro a otro , ambos apuntan a la misma dirección de memoria. 1 juan = Persona(nombre='JuanuPaz', dni='12345678Z', edad=19) 2 otro = juan 1 otro.edad = 20 2 print juan.edad

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

24

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

25

7.2.3. Copia de registros ficheros con clases y funciones • Vamos a definir un modulo con un tipo de datos para ayudar a registrar datos de varias estaciones meteorológicas. – Cada registro contendrá las temperaturas y litros por metro cuadrado medidos en cuatro instantes de un día (a las 0:00, a las 6:00, a las 12:00 y a las 18:00) en una estación meteorológica determinada. – La estación se codificara con una cadena que describe su ubicación. Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

26

7.2.3. ficheros con clases y funciones • meteo.py

# en este archivo defino la clase y las funciones que necesito

1 from record import record 3 class Meteo(record): 4 estacion ='' 5 temp = [0, 0, 0, 0] 1 lluvia = [0, 0, 0, 0] 2 3 def mostrar_meteo(meteo): 9 print 'Estación meteorólogica', meteo.estacion 10 print 'Hora Temperatura Litros/m2' 11 print ' 0:00 %11.2f %9.2f' % (meteo.temp[0], meteo.lluvia[0]) 12 print ' 6:00 %11.2f %9.2f' % (meteo.temp[1], meteo.lluvia[1]) 13 print '12:00 %11.2f %9.2f' % (meteo.temp[2], meteo.lluvia[2]) 14 print '18:00 %11.2f %9.2f' % (meteo.temp[3], meteo.lluvia[3])

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

27

7.2.3. fichero de datos • prueba_meteo.py # Ejecutar 1 from meteo import Meteo, mostrar_meteo 2 3 cs = Meteo(estacion='CS1', temp=[20.2, 19.1, 27.2, 24.8], lluvia=[0, 0, 0, 0]) 4 mostrar_meteo(cs) Estación meteorólogica CS1 Hora Temperatura Litros/m2 0:00 20.20 0.00 ------------------18:00 24.80 0.00

Copia de registros por referencia • Supón ahora que la estación VR1, muy próxima a CS1, ha registrado las mismas temperaturas. 1 from meteo import Meteo, mostrar_meteo 2 3 cs = Meteo(estacion='CS1', temp=[20.2, 19.1, 27.2, 24.8], lluvia=[0, 0, 0, 0]) 4 vr = cs 5 vr.estacion = 'VR1' 6 mostrar_meteo(cs) 7 mostrar_meteo(vr)

Le cambiamos el nombre a las dos estaciones

Copia de registros • Para evitar la copia por referencia genero un nuevo registro y • copio los valores del viejo usando el operador de corte que construye una nueva lista, aunque su contenido sea idéntico al de la original • Prueba_meteo2.py 1 from meteo import Meteo, mostrar_meteo 2 3 cs = Meteo(estacion='CS1', temp=[20.2, 19.1, 27.2, 24.8], lluvia=[0, 0, 0, 0])

4 vr = Meteo(estacion='VR1', temp=cs.temp[:], lluvia=cs.lluvia[:]) 5 mostrar_meteo(cs) 6 mostrar_meteo(vr) Si hiciera temp =cs.temp volvería a crear una referencia a ese campo

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

31

7.3.2.Ejemplos : Fechas • •

• • •

Muchas aplicaciones utilizan tipos de datos que no están predefinidos en Python. Un tipo de datos fecha nos vendría bien en numerosas aplicaciones. fecha.py 1 from record import record 2 3 class Fecha(record): 4 dia = 1 5 mes = 1 6 anyo = 1 8 def fecha_breve(fecha): 1 return '%d/%d/%d' % (fecha.dia, fecha.mes, fecha.anyo) >>> from fecha import * >>> torres_gemelas = Fecha(dia=11, mes=9, anyo=2001) >>> print 'El atentado de Nueva York tuvo lugar el', fecha_breve(torres_gemelas) El atentado de Nueva York tuvo lugar el 11/9/2001

Año bisiesto • Definamos ahora una función que indique si un año es bisiesto o no. • Recuerda que un año es bisiesto si es divisible por 4, excepto si es divisible por 100 y no por 400: • fecha.py 11 def fecha_en_anyo_bisiesto(fecha): 1 if fecha.anyo % 4 == 0 \ 2 and (fecha.anyo % 100 != 0 or fecha.anyo % 400 == 0) : 13 return True 14 else: 15 return False

Leer desde teclado • fecha.py 18 def lee_fecha(): 19 dia = int(raw_input('Día: ')) 20 while dia 31: 21 dia = int(raw_input('Día: ')) 22 23 mes = int(raw_input('Mes: ')) 24 while mes 12: 25 mes = int(raw_input('Mes: ')) 26 27 anyo = int(raw_input('Año: ')) 28 29 return Fecha(dia=dia, mes=mes, anyo=anyo)

Temario •

7. Tipos estructurados: registros 313 – 7.1. Asociando datos relacionados...313 • 7.1.1. Lo que sabemos hacer...313 • 7.1.2. Pero sabemos hacerlo mejor 314 – 7.2. Registros .316 • 7.2.1. Definición de nuevos tipos de dato 316 • 7.2.2. Referencias a registros...318 • 7.2.3. Copia de registros .319 – 7.3. Algunos ejemplos 322 • 7.3.1. Gestión de calificaciones de estudiantes . 322 • 7.3.2. Fechas...332 • 7.3.3. Anidamiento de registros 335 • 7.3.4. Gestión de un videoclub .337 • 7.3.5. Algunas reflexiones sobre cómo desarrollamos la aplicación de gestión del videoclub 346

Clase 12 - Capítulo 7

Ing Leonardo Fernández Rosati Comisión 3.1

35

7.3.3. Anidamiento de registros • Puedes usar registros como campos de un registro • persona con fecha.py 1 from record import record 2 from fecha import fecha 3 4 class Persona(record): 5 nombre = '' 6 apellido = '' 7 fecha_nacimiento = None

Agregar registros a persona con fecha • Cuando instanciamos un registro de tipo Persona podemos instanciar también la fecha de nacimiento: • persona con fecha.py 1 ana = Persona(nombre='Ana', \ 2 apellido='Paz', \ 3 fecha_nacimiento=Fecha(dia=31, mes=12, anyo=1990)) Puedes acceder al día de nacimiento así: 1 print ana.fecha_nacimiento.dia