Ejemplos de estructuras basicas en python

Miguel Alejandro Salgado Zapien

2021-05-13

Continuaremos con algunos ejemplos de manipulación de datos utilizando Python.

La instrucción para seguir el código durante la clase pasada fue ejecutar todos los bloques como si fuesen archivos.

En esta ocasión podemos intentar copiar el código a un solo notebook.

Diccionarios

Los diccionarios son utilizados para almacenar pares de llave y valor, donde la única restricción para que algo pueda ser llave, es que soporte la función hash.

var_a = "hello"
var_b = 123.432
var_c = (1, 2, "TM")
var_d = [1, 2, "TM"]

print(hash(var_a))
print(hash(var_b))
print(hash(var_c))
print(hash(var_d))
2141899817001268532
996124179980320891
5464310548096334618
Traceback (most recent call last):
  File "/home/ekiim/Documents/siringa/.cache/0c3bc041cf8e64984f31a0c883be5ee9.py", line 9, in <module>
    print(hash(var_d))
TypeError: unhashable type: 'list'

hash

Es una función que regresa un valor numérico entero resultante al haber calculado algun hash sobre el objeto en turno.

El valor retornado por hash es el valor que utilizan los diccionarios en su estructura interna para almacenar objetos.

help(hash)
Help on built-in function hash in module builtins:

hash(obj, /)
    Return the hash value for the given object.
    
    Two objects that compare equal must also have the same hash value, but the
    reverse is not necessarily true.

Ejemplos de diccionario

Para crear un diccionario tenemos distintas maneras.

  • Con el constructor del tipo de dato (la función dict)
  • Con las llaves.

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
f = dict({'one': 1, 'three': 3}, two=2)
print(a == b == c == d == e == f)
True

A un diccionario podemos preguntarle cosas, cómo

  • Su longitud len(a),
  • Cuales son sus llaves a.keys(),
  • Cuales son sus valores a.values(),
  • Cuales son sus elementos, a.items(),
  • Si contiene una llave, foo in a,
  • Cual es el elemento en la llave foo, a["foo"] o a.get("foo", None),

A un diccionario podemos realizar las siguientes ediciones, cómo

  • Asignarle un valor a una llave a["foo"] = "FOO",
  • Remover una llave, del a["foo"],
  • Mezclarlo con otro diccionario c = a | b
  • Mezclarlo con otro diccionario a |= b

Cuando realizamos una operación invalida (en general) se genera algo llamado excepciones, dichas excepciones las podemos interceptar para evitar que nuestros programas se detengan de maneras inesperadas, utilizando la sintaxis para try, except.

try:
    # Bloque de codigo
    # con potencial de fallo
except KeyError: # nombrar el tipo de fallo que esperamos
    # Que haremos en caso de fallo

Dominando la función print

print es la función que utilizamos para imprimir la mayor parte del tiempo, dicha función cuenta con 3 argumentos importantes, (en realidad 4, pero solo observaremos 3).

  • sep
  • end
  • file

Adicionalmente esta función es tiene un comportamiento basado en sus args, que son los argumentos de la función definidos por su posición.

print("1ro", "2do", "3ro", sep=",", end="\n", file=sys.stdout)
  • En este caso "1ro", "2do", "3ro" son los argumentos definidos por su posición.
  • Y sep=",", end="\n", file=sys.stdout son los argumentos definidos por su nombre.

Abriendo archivos

Existen dos maneras de acceder a archivo, (aunque internamente hacen lo mismo).

Por medio de objetos o por medio de manejadores de contexto.

Como Objeto seria, utilizar la función open, que recibe como argumentos, nombre de archivo, y modo (entre otros argumentos),

# Abrir en modo lectura de texto
fp_1 = open("path/to/file.txt", "r")
# Abrir en modo lectura de binario
fp_2 = open("path/to/file.txt", "rb")
# Abrir en modo escritura
fp_3 = open("path/to/file.txt", "w")
# Abrir en modo escritura binaria
fp_4 = open("path/to/file.txt", "wb")
# Abrir en modo escritura al final (append)
fp_5 = open("path/to/file.txt", "a")

Cuando tenemos un archivo abierto en modo objeto, necesitamos hacernos responsables por el cerrado de dicho archivo, debido a que el sistema operativo tiene mecanismos para evitar la apertura de archivos de manera simula tena por dos programas o mas.

Es decir que si no cerramos el archivo podemos causar errores en otros programas.

La manera de cerrar es la siguiente:

fp_1.close()

Con un manejador de contexto seguir utilizando open pero de manera distinta, ahora escribiremos dentro de un bloque de código todas las operaciones que desamas realizar mientras que el archivo este abierto.

De esta manera no necesitamos cerrar el archivo debido a que saliendo del contexto el archivo de cierra automáticamente.

with open("path/to/file.txt, "r") as file:
    content = file.read()
    print(content)