Página inmutable History Adjuntos

Diferencias para "Cursos/Principiantes/Parte3"

Nombre de la página: Diferencias para "Cursos / Principiantes / Parte3"
Diferencias entre las revisiones 4 y 5
Versión 4 con fecha 2013-07-06 22:52:30
Tamaño: 11229
Editor: JoelRivera
Comentario:
Versión 5 con fecha 2016-06-06 20:35:28
Tamaño: 11238
Editor: JoelRivera
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 59: Línea 59:
    print "elemento:", elemento     print("elemento:", elemento)
Línea 121: Línea 121:
    print "Imprime '12': ", horas[0]
    print "Imprime '23': ", horas[2]
    print("Imprime '12': ", horas[0])
    print("Imprime '23': ", horas[2])
Línea 124: Línea 124:
    print "Imprime '11': ", horas[-1]
    print "Imprime '2': ", horas[-3]
    print("Imprime '11': ", horas[-1])
    print("Imprime '2': ", horas[-3])
Línea 139: Línea 139:
    print "Cantidad de '11's en horas:", horas.count(11)     print("Cantidad de '11's en horas:", horas.count(11))
Línea 141: Línea 141:
    print 'Donde esta el 10:', horas.index(10)     print('Donde esta el 10:', horas.index(10))
Línea 226: Línea 226:
        print "LLave: ", llave
        print "Valor: ", valor
        print("LLave: ", llave)
        print("Valor: ", valor)



Colecciones

Hasta el momento hemos visto como asignar variables con el operador de asignación =, ademas de realizar muchas otras operaciones ya con la variable definida por ejemplo dentro de una estructura de control, ìf, ocasionalmente comenzamos a notar que muchas de las variables terminan creando relaciones en sentidos de jerarquía o conceptos que engloban varias variables.

La aproximación más sencilla en ese caso es usar nomenclaturas (los nombres de las variables) con prefijos o sufijos por ejemplo:

precio_fruta_manzana = 2
precio_fruta_pera = 4
precio_fruta_papaya = 12

Para un conjunto de imágenes:

img_1 = "rio.jpg"
img_2 = "lago.jpg"
img_3 = "mar.gif"
img_4 = "presa.jpg"
img_5 = "arroyo.png"
img_6 = "charco.jpg"

El tener ese prefijo "img" y el sufijo de número le indica al programador el sentido de esa variable, una vez que se lee eso, se entiende que "arroyo.png" es "una imagen que esta en la posición 5".

Este tipo de aproximación a los problemas con muchas variables se vuelve todo un problema si no se abstraen adecuadamente las variables en colecciones por ejemplo las imágenes podrían ser una tupla:

imagenes = ('rio.jpg', 'lago.jpg', 'mar.gif',
            'presa.jpg', 'arroyo.png', 'chargo.jpg')

si buscamos la tercer imagen, seria tan sencillo como

imagenes[2]

Las colecciones a cubrir son las más comunes y construidas en el mismo lenguaje, con las cuales en la mayor parte de los casos son más que suficientes para los problemas de la vida diaria de un programador.

Todas las estructuras que se mencionan tienen la propiedad de que son iterables, esto significa que las podemos usar de las siguiente manera:

   1 for elemento in COLECCION:
   2     print("elemento:", elemento)
   3     # mas cosas con el elemento.

La propiedad de que son iterables facilita la transformación de un tipo de colección a la otra.

Ademas de lo que se cubrirá en esta sesión se les invita a explorar el modulo de la librera estándar collections y Queue (queue en python3) por si quieren buscar estructuras más especializadas.

Colecciones a cubrir:

Nombre Función Repr. Literal Ejemplos
Tuple tuple (a1, a2) (1, 2 , 3, 4, 5, 6, 7)
List list [a1, a2] ['a', 'b', 'c']
Dictionary dict {key1: val1, key2: val2} {'nombre': 'Monterrey', 'abbr': 'mty'}
Set set {e1, e2, e3} {10, 20, 30, 40, 50}
FrozenSet frozenset --NA-- frozenset((2, 4, 8))

   1 def tuplas():
   2     """
   3     Tuplas (tuple)
   4     ^^^^^^^^^^^^^^
   5 
   6     Las tuplas son colecciones inmutables de objetos, identificables
   7     por su posición en la colección a partir de un indice numérico
   8     comenzando en cero.
   9     """
  10     # Como se crean:
  11     horas = (12, 10, 23, 0, 11, 7, 2, 11, 11)
  12     # Los paréntesis son opcionales
  13     horas = 12, 10, 23, 0, 11, 7, 2, 11, 11
  14     # pero se recomienda buena practica siempre usarlos
  15     # debido a que se requieren para tener tuplas de tuplas,
  16     # y mejorar la legibilidad del código.
  17 
  18     # ¿Como convierto de otra collecion a una tupla?:
  19     # usando la función, `tuple`
  20     tuple([12, 10, 23, 00])
  21     # O podemos generar una tupla vacía con 
  22     tuple() == ()
  23 
  24     #
  25     # Lo siguientes ejemplos aplican de igual manera a las listas.
  26     #
  27     
  28     # La posición de los objetos contenidos es relevante
  29     # y se puede llegar a cada objeto de manera
  30     # individual a través de `[INDICE]` donde
  31     # el conteo de las posiciones comienza desde CERO.
  32     print("Imprime '12': ", horas[0])
  33     print("Imprime '23': ", horas[2])
  34     # La posición puede ser en retroceso:
  35     print("Imprime '11': ", horas[-1])
  36     print("Imprime '2': ", horas[-3])
  37     # Se pueden obtener una nueva colección 
  38     # a partir de rangos [INICIO:FINAL]
  39     # donde el INICIO es inclusivo y FINAL exclusivo
  40     # en un sentido matemático [), en caso de omitir
  41     # INICIO o FINAL, se toma la posición máxima,
  42     # [0:len(LISTA)]
  43     horas[1:5] == (10, 23, 0, 11)
  44     horas[2:5] == (23, 0, 11)
  45     # La forma completa de un slice/rango se puede definir un incremento
  46     # [INICIO:FINAL:INCREMENTO]
  47     horas[::2] == (12, 23, 11, 2, 11)
  48     # Métodos comunes
  49     # `count`
  50     print("Cantidad de '11's en horas:", horas.count(11))
  51     # `index`
  52     print('Donde esta el 10:', horas.index(10))
  53     
  54     
  55     
  56 def listas():
  57     """
  58     Listas (list)
  59     ^^^^^^^^^^^^^
  60 
  61     Las listas son colecciones mutables de objetos, identificables
  62     por su posición en la colección a partir de un indice numerico
  63     comenzando en cero.
  64     """
  65     # Como se crean
  66     estudiantes = ["Pedro", 'Tatiana', 'Jorge', 'Eduardo', 'Julia']
  67     # ¿Como convierto de otra colección a una lista?:
  68     # usando la función, `list`
  69     list(("Pedro", 'Tatiana', 'Jorge', 'Eduardo', 'Julia'))
  70     # O podemos generar una lista vacía con 
  71     list()
  72     # que es igual a 
  73     []
  74     list() == []
  75     # Todos los métodos de indices mencionados para las tuplas aplican de igual
  76     # manera para las listas. (ver función `tuplas`)
  77 
  78     # Dado que las listas son mutables, se permite agregar elementos
  79     # a la lista aun y cuando ya se hayan definido para esto existen 
  80     # distintas tecnicas.
  81     # substituyo lo que este en la posicion 0 ('Pedro') por 'Joel'
  82     estudiantes[0] = "Joel"
  83     # Agrego a 'Pedro' al final de la lista
  84     estudiantes.append("Pedro")
  85     # Saca el ultimo elemento de la lista y regresa su valor
  86     estudiantes.pop() == 'Pedro'
  87     # invierte el orden de la lista en su lugar,
  88     # no regresa ningun valor
  89     estudiantes.reverse()
  90     estudiantes == ['Julia', 'Eduardo', 'Jorge', 'Tatiana', 'Joel']
  91     
  92 
  93     
  94 def diccionarios():
  95     """
  96     Diccionario (dict)
  97     ^^^^^^^^^^^^^^^^^^
  98 
  99     Los diccionarios son colecciones mutables de objectos 
 100     identificados por una llave, sin un orden en particular,
 101     su posición en la colección es irrelevante.
 102     """
 103     # Como se crean
 104     persona = {'ciudad': 'Monterrey',
 105                'nombre': 'Juan Perez',
 106                'edad': 30}
 107     # Como convierto de otra colección a un diccionario?
 108     # la colección que se desea convertir necesita
 109     # ser estar dividida en grupos de dos en dos, donde
 110     # el elemento 0 sera la llave y el 1 el valor.
 111     # Por ejemplo:
 112     persona = dict([('ciudad', 'Monterrey'),
 113                     ('nombre', 'Juan Perez'),
 114                     ('edad', 30)])
 115     # Como tercera opcion se puede crear directamente con 
 116     # la función dict con argumentos con nombre:
 117     persona = dict(ciudad='Monterrey',
 118                    nombre='Juan Perez',
 119                    edad=30)
 120     # La forma recomendada es el diccionario literal con las
 121     # llaves y dos puntos {LLAVE: VALOR, }
 122     # Diccionarios vacíos:
 123     dict() == {}
 124     # Para agregar nuevos elementos
 125     persona['pais'] = 'Mexico'
 126     persona['estado'] = 'Nuevo leon'
 127     # Para borrar un elemento.
 128     del persona['edad']
 129     # Métodos comunes.
 130     persona.keys()    # regresa una tupla de las llaves
 131     persona.values()  # regresa una tupla de los valores
 132     persona.items()   # regresa una tupla de la forma:
 133     # ((llave1, valor1),  (llave2, valor2), (llave3, valor3), ...)
 134     # una tupla de tuplas de dos elementos.
 135     # Iteraciones comunes
 136     for llave, valor in persona.items():
 137         print("LLave: ", llave)
 138         print("Valor: ", valor)
 139 
 140 def conjuntos():
 141     """
 142     Conjunto (set)
 143     ^^^^^^^^^^^^^^
 144     
 145     Los conjuntos son colecciones mutables de objetos UNICOS sin 
 146     un orden definido, la identificación es solo de existencia o
 147     ausencia del conjunto, no se puede referir por indices numéricos.
 148 
 149     Una de las características de los conjuntos es que tienen todas
 150     las operaciones esperadas del sentido matemático de conjuntos.
 151     """
 152     # Como se crean:
 153     pares = {2, 4, 6, 8, 10}
 154     nones = {1, 3, 5, 7, 9}
 155     # ¿Como convierto de otra colección a un conjunto?:
 156     pares = set((2, 4, 6, 8, 10))
 157     nones = set([1, 3, 5, 7, 9, 9])
 158     # tomando en cuenta que se ELIMINARAN
 159     # LOS ELEMENTOS QUE SE REPITEN
 160 
 161     # Como agregar un elemento
 162     pares.add(12)
 163     # como eliminar un elemento:
 164     pares.remove(12)
 165     # union de dos conjuntos
 166     pares | nones == pares.union(nones)
 167     # intersección de dos conjuntos
 168     pares & nones == pares.intersection(nones)
 169     # unión de dos conjuntos, excluye al elemento
 170     # si se encuentra en los dos conjuntos
 171     pares ^ nones == pares.symmetric_difference(nones)
 172 
 173     # un caso común de obtener listas
 174     # con elementos únicos es pasarlos a set 
 175     # y de nueva cuenta a lista.
 176     a = [1, 2, 3, 4, 5, 'Mochila', 4, 'Sillon', 'Manzana']
 177     a_uniq = list(set(a))
 178     
 179     
 180     
 181 
 182 def conjuntos_inmutables():
 183     """
 184     Conjunto inmutable (frozenset)
 185     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 186     
 187     Los conjuntos son colecciones INMUTABLES de objetos UNICOS sin 
 188     un orden definido, la identificación es solo de existencia o
 189     ausencia del conjunto, no se puede referir por indices numéricos.
 190 
 191     Una de las características de los conjuntos es que tienen todas
 192     las operaciones esperadas del sentido matemático de conjuntos.
 193     """
 194     # A diferencia de las colecciones anteriores los 
 195     # conjuntos inmutables no tienen representación literal
 196     # es necesario crearlos a partir de otra colección.
 197     metodos = frozenset(('GET', 'POST', 'DELETE'))
 198     # Todos los métodos de las operaciones de sets aplican a los
 199     # frozensets.
 200 
 201     # La diferencia principal radica en que dado a que son
 202     # inmutables, se pueden usar como llaves en los diccionarios,
 203     # no significa que ahorren memoria y una vez que veamos
 204     # objetos se mostraran algunos casos prácticos con frozensets.