Un módulo es un archivo (con extensión .py) que contiene sentencias y definiciones.¶
¿Algo nuevo?¶
Analicemos un ejemplo en el IDE¶
- ¿Cuántos archivos forman mi programa?
- ¿Cómo se relacionan?
La sentencia import¶
- Permite acceder a funciones y variables definidas en otro módulo.
In [ ]:
Copied!
import random
import random
- Sólo se importa las definiciones de las funciones. No las ejecuta.
- Para ejecutar una función debo invocarla en forma explícita.
In [ ]:
Copied!
random.randrange(10)
random.randrange(10)
- ¿Qué son los archivos .pyc?
- +Info en el sitio oficial
- O podemos leer la PEP 3147
Espacios de nombres¶
- Un espacio de nombres relaciona nombres con objetos.
En principio podemos pensar en tres espacios de nombres:
- Locales
- Globales
- __builtins__
Los espacios de nombres se crean en diferentes momentos y tienen distintos tiempos de vida.
- El espacio de nombres que contiene los nombres __builtins__ se crea al iniciar el intérprete y nunca se elimina.
- El espacio de nombres global de un módulo se crea cuando se lee la definición de un módulo y normalmente también dura hasta que el intérprete finaliza.
- El espacio de nombres local a una función se crea cuando la función es llamada y se elimina cuando la función retorna.
Espacios de nombres y módulos¶
- Cada módulo tiene su propio espacio de nombres.
#funciones
var_x = 10
def print_var_x():
print(var_x)
#uso_funciones
import funciones
var_x = 20
funciones.print_var_x()
- Entonces, ¿qué valor imprime este código?
Volvemos al import¶
- Cuando usamos la sentencia import se actualizan los espacios de nombres.
import mi_modulo
- En este caso, todos los ítems definidos dentro de mi_modulo serán locales a mi_modulo.
- Lo que se agrega al espacio de nombres es el nombre del módulo (mi_modulo).
- Para usarlo debo hacerlo con notación puntual.
import mi_modulo as m
- ¿Y acá?¿Qué nombre se agrega al espacio de nombres?
Importando módulos¶
import funciones
funciones.uno()
- La importación se realización sólo una vez por sesión del intérprete.
- Veamos sobre el ejemplo anterior.
- Si necesito volver a importar: usar reload() incluido en el módulo importlib.
import importlib
importlib.reload(funciones)
Otra forma de importar¶
from mi_modulo import una_funcion
- Sólo se importa una_funcion de mi_modulo (no el nombre del módulo).
- El único nombre que se agrega al espacio de nombres es una_funcion.
from mi_modulo import *
- En este caso, todos los ítems definidos en mi_modulo formarán parte del espacio de nombres actual.
- Esta forma no está recomendada: podrían existir conflictos de nombres.
Veamos qué pasa cuando queremos importar un módulo que no existe:¶
In [ ]:
Copied!
import pp
import pp
¿Dónde se busca los módulos?¶
- Directorio actual + otros directorios definidos en la variable de ambiente PYTHONPATH
In [ ]:
Copied!
import sys
sys.path
import sys
sys.path
Biblioteca de módulos estándar¶
- Existe un conjunto de módulos que vienen incluidos con el intérprete.
- Para usarlos se los debe importar en forma explícita (usando sentencia import).
- Ya usamos algunos, ¿cuáles?
- random, sys, string
- Hay muchos otros que nos ofrecen distinta funcionalidad:
- Ejemplos: math, random, time, sys, collections, etc.
In [ ]:
Copied!
import math
import random
print(math.gcd(12,16))
print(math.sqrt(81))
print(math.pi)
lista = [1, 2, 3, 4]
print(random.choice(lista))
import math
import random
print(math.gcd(12,16))
print(math.sqrt(81))
print(math.pi)
lista = [1, 2, 3, 4]
print(random.choice(lista))
El módulo collections¶
- Define tipos de datos alternativos a los predefinidos dict, list, set, y tuple.
- Counter: es una colección desordenada de pares claves-valor, donde las claves son los elementos de la colección y los valores son la cantidad de ocurrencias de los mismos.
In [ ]:
Copied!
from collections import Counter
cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(cnt)
from collections import Counter
cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(cnt)
In [ ]:
Copied!
print(Counter('abracadabra').most_common(1))
print(Counter('abracadabra').most_common(1))
Para probar luego¶
- El módulo: deque (“double-ended queue”)
- Permite implementar pilas y colas.
In [ ]:
Copied!
from collections import deque
d = deque('abcd')
# agrega al final
d.append("final")
# agrega al principio
d.appendleft("ppio")
# eliminar último
elem = d.pop()
# elimina primero
elem1=d.popleft()
d
from collections import deque
d = deque('abcd')
# agrega al final
d.append("final")
# agrega al principio
d.appendleft("ppio")
# eliminar último
elem = d.pop()
# elimina primero
elem1=d.popleft()
d
El módulo sys¶
Entre otras cosas, define:
- exit([arg]): sale del programa actual;
- path: las rutas donde buscar los módulos a cargar;
- platform: contiene información sobre la plataforma.
In [ ]:
Copied!
import sys
#sys.path
sys.platform
import sys
#sys.path
sys.platform
Los nombres de los módulos¶
- Es posible acceder al nombre de un módulo a través de __name__
In [ ]:
Copied!
print(__name__)
print(__name__)
Tarea¶
- Averiguar cuándo un módulo se denomina __main__,