# ## Profesores
# * Alvaro Montenegro, PhD,
# * Campo Elías Pardo, PhD,
# * Daniel Montenegro, Msc,
# * Camilo José Torres Jiménez, Msc,
# ## Asesora Medios y Marketing digital
# * Maria del Pilar Montenegro, pmontenegro88@gmail.com
# * Jessica López Mejía, jelopezme@unal.edu.co
# ## Jefe Jurídica
# * Paula Andrea Guzmán, guzmancruz.paula@gmail.com
# ## Coordinador Jurídico
# * David Fuentes, fuentesd065@gmail.com
# ## Desarrolladores Principales
# * Dairo Moreno, damoralesj@unal.edu.co
# * Joan Castro, jocastroc@unal.edu.co
# * Bryan Riveros, briveros@unal.edu.co
# * Rosmer Vargas, rovargasc@unal.edu.co
# * Venus Puertas, vpuertasg@unal.edu.co
# ## Expertos en Bases de Datos
# * Giovvani Barrera, udgiovanni@gmail.com
# * Camilo Chitivo, cchitivo@unal.edu.co
# ## Introducción
# Existe una manera de saber qué paquetes se encuentran instalados en el entorno/ambiente actual, sin salir del cuaderno.
#
# Basta con colocar `!comando_deseado` en una celda de código.
# **Ejemplo:**
#
# Verifiquemos la versión de Python que estamos usando, qué entornos/ambientes tenemos disponibles, cuál es el que se encuentra activo y qué paquetes están instalados en dicho entorno, todo esto sin salir del cuaderno.
# In[ ]:
# Versión de python que se está utilizando
get_ipython().system('python --version')
# In[ ]:
# Entornos disponibles
get_ipython().system('conda env list')
# In[ ]:
# Paquetes instalados en el entorno activo
get_ipython().system('conda list')
# **¿Qué es un módulo?**
#
# Un módulo es un archivo que tiene extensión *.py*, es decir, es un archivo de texto que tiene adentro código de python que se puede ejecutar. Un módulo puede definir funciones, clases y variables.
#
# Cabe resaltar lo siguiente: **Python es un lenguaje de programación orientado a objetos**.
#
# Para términos de visualización, imagínese una caja que tiene muchas cajas por dentro y dentro de cada caja existen herramientas de trabajo distintas.
#
# **Ejemplo:**
#
# Mi maleta. Mi maleta tiene dentro lo siguiente:
#
# - Una cartuchera.
# - Un computador.
# - Un cuaderno.
#
# Los roles serían los siguientes:
#
# - Maleta $\rightarrow$ Paquete
# - Cartuchera $\rightarrow$ Módulo
# - Cuaderno $\rightarrow$ Módulo
#
# Entonces, si queremos usar la cartuchera, debemos primero abrir la maleta y tomarla.
#
# **O sea, del paquete, vamos a usar un módulo**.
#
# Dentro de la cartuchera tengo marcadores, lápices, y borrador.
#
# Estos toman el rol de **atributos**, objetos que hacen tareas específicas.
#
# Por tanto, si quiero usar un borrador, debería hacer lo siguiente
#
# Abrir maleta $\rightarrow$ Tomar cartuchera $\rightarrow$ Abrir Cartuchera $\rightarrow$ Tomar Borrador
#
# En Python, estas acciones se pueden **traducir** a lo siguiente:
#
# ```import Maleta```
#
# ```Maleta.Cartuchera.Borrador()```
#
# Para saber qué módulos están disponibles en el ambiente de trabajo, basta con usar el siguiente comando:
# In[ ]:
help("modules")
# Parece que es una lista bastante larga...
#
# Veamos alguna documentación de alguno de los módulos y sus atributos.
#
# Por ejemplo random.
# In[ ]:
#help("random") # Muestra toda la documentación
import random
#?random # Muestra una pequeña documentación
# Para acceder a los atributos del mósulo, basta colocar ```dir(modulo)```
# In[ ]:
dir(random)
# Vaya que la lista sigue siendo larga...
#
# Sigamos metiendo dentro de cada cosa (algún día llegaremos al fin...no?)
# In[ ]:
get_ipython().run_line_magic('pinfo', 'random.random')
# **Bingo!** Al fin algo que podemos usar:
# In[ ]:
x = random.random()
print("Número aleatorio en [0,1]: ",x)
# In[ ]:
get_ipython().run_line_magic('pinfo', 'random.randint')
# In[ ]:
y=random.randint(3,6)
print("Número entero aleatorio entre 3 y 6: ",y)
# ## Alias para módulos
#
# Otra propiedad genial de Python es su capacidad para reducir la cantidad de código escrito usando unos secretos milenarios: aliases.
#
# Por ejemplo, si me llamo Daniel, mi **alias** puede ser Dani.
#
# Entonces, acada vez que me digan Dani, yo miraré en respuesta.
#
# Traducir a Python luce así:
#
# ```import modulo as alias```
#
# **Ejemplo:**
# In[ ]:
import math as m
# Una vez nombrado el alias, siempre se debe referir a ese alias y no al nombre principal
#dir(math) genera error
dir(m)
# ## Aplicación:
#
# Una pequeña aplicación de Matemáticas:
#
# **Área de una circunferencia de radio r:**
#
# $A = \pi r²$
# In[ ]:
# Aplicación: Área de un círculo de radio 10 cm
r = 10; # Declarar el radio
z = m.pi*(r**2) # Escribir la fórmula matemática
print("El Área del círculo es: ",z,"cm²")
# Como pueden observar, los módulos son el **alma de Python**.
#
# ## Tareas:
#
# - Conocer los 10 módulos de Python más usados.
# - Hacer un ejercicio práctico con cada módulo investigado.
# - Investigar si es posible crear un módulo de Python. En caso afirmativo, crear uno simple.
# - Explicar la lógica subyacente de la siguiente línea:
# In[ ]:
# You Must Reset Kernel 0,0
from math import pi
A = pi*r**2
print(A)
# In[ ]:
math.pi
# ## Bonus: Fractales
#
# Usando un módulo llamado ```turtle``` podemos crear un árbolito bonito.
# In[ ]:
import turtle
def tree(length,n):
if length < (length/n):
return
turtle.forward(length)
turtle.left(45)
tree(length * 0.5,length/n)
turtle.left(20)
tree(length * 0.5,length/n)
turtle.right(75)
tree(length * 0.5,length/n)
turtle.right(20)
tree(length * 0.5,length/n)
turtle.left(30)
turtle.backward(length)
return
turtle.left(90)
turtle.backward(30)
tree(200,4)
# Y también formas que tienen forma de pedazos de copitos de nieve (Koch Curve):
# In[ ]:
from turtle import *
def Recursive_Koch(length, depth):
if depth == 0:
forward(length)
else:
Recursive_Koch(length, depth-1)
right(60)
Recursive_Koch(length, depth-1)
left(120)
#Recursive_Koch(length, depth-1)
Recursive_Koch(length, depth-1)
right(60)
Recursive_Koch(length, depth-1)
# ----------
Recursive_Koch(3, 6)