<jupyter_start><jupyter_text>Decoradores Intrucciones que permiten generar patrones de impresion con patrones disenados que permiten generar un codigo mas limpio, mejor documentado y permite eliminar la repeticion de codigo a la hora de manejar formatos de impresion.Los decoradores se aplican sobre las funciones y trabajan como un envoltorio sobre lo que imprimen estas.En terminos practicos, los decoradores son funciones que operan sobre otras funciones y retornan a otras funciones.<jupyter_code>def suma(a, b):
    return a + b
suma(2, 3)
def decorador(f):
    def nueva(*args):
        print("******************")
        f(*args)
        print("******************")
    return nueva
@decorador
def suma(a, b):
    print(a + b)

suma(2, 3)
def decorador2(f):
    def nueva(a, b):
        print("#######################")
        print(f(a, b))
        print("#######################")
    return nueva
# Dos decoradores sobre funcion con return

@decorador
@decorador2
def suma(a, b):
    return (a + b)

suma(2, 3)
# Decoradores sobre una funcion sin argumentos
#@decorador
@decorador
def saludo():
    print("Hola")
saludo()<jupyter_output><empty_output><jupyter_text>Funcion lambda Son funciones anonimas a las que no se les asigna ninguna variable. Solo existen en el momento en que son llamadas y luego nunca mas, por lo tanto se usan para fines practicos y de legibilidad.<jupyter_code># evaluando un polinomio
def evaluar(numero):
    """polinomio x^3-2x^2+x-1"""
    return numero**3 -2*numero**2 + numero - 1
    
evaluar(5)
print((lambda x: x**3 - 2*x**2 + x - 1)(5))
print((lambda x: x**2)(-50))
# Se puede asignar a las funciones lambda a variables y llamarlas nuevamente
residuo = lambda x: x%2         
print(residuo(100))
print(residuo(89))<jupyter_output><empty_output><jupyter_text>MINIDESAFIO **1.** Escriba una funcion lambda que permita determianr si un numero es impar. Si el numero pasado es impar, se debe imprimir True, de lo contrario se debe imprimir False.**2.** Escriba una funcion lambda que tome una lista y la vuelva al reves.**3.** Escriba una funcion lambda que tome un string y lo imprima en formato titulo<jupyter_code>impar = lambda x: x%2 != 0
print(impar(11))
def impar(numero):
    if numero % 2 == 0:
        return False
    else:
        return True
impar(14)
reves = lambda lista: lista[::-1]
print(reves([1, 2, 3, 4]))<jupyter_output><empty_output><jupyter_text>Funcion map Es una funcion que recibe como argumentos una funcion y un iterables, y retorna otro iterable proveniente de la aplicacion de la funcion sobre el primer iterable<jupyter_code># funcion que calcula los cuadrados de una lista de numeros
lista = [2, 4, 6, 8, 10]
def cuadrado(lista):
    resultado = []
    for i in lista:
        resultado.append(i**2)
    return resultado

print(cuadrado(lista))
# los mismo de antes pero con map
def cuad(x):
    return x**2

results = list(map(cuad, lista))
print(results)
# otro ejemplo. Una funcion que retorne el cubo de un numero
cubo = list(map(lambda x: x**3, lista))
print(cubo)
intAstring = list(map(lambda x: str(x), lista))
print(intAstring)
type(intAstring[0])<jupyter_output><empty_output><jupyter_text>Funcion filter Funcion que recibe como argumento una funcion condicional y un iterable, y filtra del iterable los valores que coinciden con la condicion.<jupyter_code>def multiplosDe5(numero):
    if numero % 5 == 0:
        return True
lista = [2, 4, 6, 8, 10, 12, 14, 5]
nueva = list(filter(multiplosDe5, lista))
print(nueva)
#Otro ejemplo
solucion = list(filter(lambda x: x%2==0, lista))
print(solucion)
# otro ejemplo
lista2 = [2, 4, "k", "tres", 8, 0, "nueve"]
numeros = list(filter(lambda x: str(x).isdigit(), lista2))
print(numeros)<jupyter_output><empty_output><jupyter_text>MINIDESAFIO **1.** Escriba un miniprograma que tome la lista indicada mas abajo, la filtre manteniendo unicamente los valores que sean strings, y luego tome esa lista y convierta todos sus elementos en mayusculas.         lista = [1, 2, "hola", "correcto", 2, "no", 7, "eva", 10, "vamos"]<jupyter_code>lista = [1, 2, "hola", "correcto", 2, "no", 7, "eva", 10, "vamos"]
string = list(filter(lambda x: not str(x).isdigit(), lista))
print(string)
mayusculas = list(map(lambda x: x.upper(), string))
print(mayusculas)<jupyter_output><empty_output><jupyter_text>Libreria math Funcion parte de la libreria estandar de python que ofrece ciertas funciones matematicas sobre los reales.<jupyter_code>import math<jupyter_output><empty_output><jupyter_text>ceil(x): Devuelve el entero más próximo mayor o igual que x.<jupyter_code>print(math.ceil(5.3))
print(math.ceil(-2.3))<jupyter_output><empty_output><jupyter_text>floor(x): Devuelve el entero más próximo menor o igual que x.<jupyter_code>print(math.floor(5.3))
print(math.floor(-2.3))<jupyter_output><empty_output><jupyter_text>gcd(a, b): Devuelve el máximo común divisor ("greatest common divisor") de los números a y b.<jupyter_code>print(math.gcd(2, 8))
print(math.gcd(7, 17))<jupyter_output><empty_output><jupyter_text>OTRAS FUNCIONES* math.exp(x): Devuelve $e^x$.* math.log(x, [base]): Devuelve el logaritmo neperiano de x. Si se incluye el segundo argumento, devuelve el logaritmo de x en la base indicada.* math.log2(x): Devuelve el logaritmo en base 2 de x.* math.log10(x): Devuelve el logaritmo en base 10 de x.* math.pow(x, y): Devuelve xy.* math.sqrt(x): Devuelve la raíz cuadrada de x.* math.cos(x): Devuelve el coseno de x.* math.sin(x): Devuelve el seno de x.* math.tan(x): Devuelve la tangente de x.* math.degrees(x): Convierte un ángulo de grados sexagesimales a radianes.* math.radians(x): Convierte un ángulo de radianes a grados sexagesimales.* math.pi: Número pi.* math.e: Número e:Ver mas en: https://docs.python.org/3/library/math.html  MINIDESAFIO **1.** ![image.png](attachment:image.png)<jupyter_code>v1 = [2, 4, -5, 8, 3]
v2 = [0, -2, -3, 7, 1]
resultado = list(map(lambda x,y: x*y, v1, v2))
print(sum(resultado))<jupyter_output><empty_output><jupyter_text>**2.** Investigar la ley de gravitacion universal de Newton, y con los valores $m_1 = 50 kg$, $m_2 = 60 kg$ y $r = 3 m$, calcular la fuerza gravitacional. Recordar tomar la constante de gravitacion G en el sistema MKS.**3.** Cree una funcion que genere una lista de 300 numeros aleatorios entre 1 y 1000 usando el modulo randint de random. Cree una funcion que tome esa lista y evalue cada valor de la lista en la siguiente funcion:$f(x) = \frac{\cos(x - 2)}{\log(x)}$        Asegurese de evitar errores de division por cero, exigiendole al programa la evasion de esta posibilidad. Imprima la lista resultante.**Pista:** Es mas facil si utiliza la funcion map<jupyter_code>from random import randint
lista = [randint(1, 1000) for i in range(300)]
nueva = list(filter(lambda x: x != 1, lista))
def funcion(lista):
    resultado = []
    for i in lista:
        resultado.append(math.cos(i - 2)/math.log10(i))
    return resultado
resultado = funcion(nueva)
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.scatter(nueva, resultado)
plt.show()<jupyter_output><empty_output><jupyter_text>Archivos Con python e sposible importar archivos para trabajar directamente con ellos. La utilidad redica en que podremos trabajar con archivo externos creados por otros usuarios, y gustadar nuestro trabajo al final de la jornada en el mismo o en otro archivo.  Leyendo archivos<jupyter_code>ls<jupyter_output><empty_output><jupyter_text>La instruccion with permite que python se encargue de abrir y cerrar el archivo por si mismo, evitando que se den posibles errores y perdida de datos<jupyter_code>with open('ventas.txt') as archivo:
    contenidos = archivo.read()
    print(contenidos)<jupyter_output><empty_output><jupyter_text>Cuando el archivo no esta en el mismo directorio...<jupyter_code># Llamado erroneo de ventas2.txt
with open('ventas2.txt') as archivo:
    contenidos = archivo.read()
    print(contenidos)<jupyter_output><empty_output><jupyter_text>Obteniendo mi directorio de trabajao con os y getcwd():<jupyter_code># Obtener el directorio de trabajo
import os
directorio = os.getcwd()
print(directorio)
ls
# Llamado correcto de ventas2
with open(directorio + '\\archivos\\ventas2.txt') as archivo:
    contenidos = archivo.read()
    print(contenidos)<jupyter_output><empty_output><jupyter_text>Mas sobre os: https://uniwebsidad.com/libros/python/capitulo-10/modulos-de-sistema  Leyendo linea por linea<jupyter_code>with open('ventas.txt') as archivo:
    for linea in archivo:
        print(linea, end = "")<jupyter_output><empty_output><jupyter_text>Guardando las lineas en listas<jupyter_code>with open('ventas.txt') as archivo:
    lineas = archivo.readlines()
print(lineas)
for i in lineas:
    print(i.rstrip())
# Trabajando con los datos
lista = ''
for i in lineas:
    lista += i.rstrip()
print(lista)<jupyter_output><empty_output><jupyter_text>MINIDESAFIO **1**. Aprendiendo Python: abre un archivo en blanco en tu editor de texto y escribe algunas líneas que resuman lo que has aprendido sobre Python hasta ahora. Empiece cada línea con la frase En Python puede.... Guarde el archivo como python.txt en el mismo directorio que este notebook. Escribe un programa que lea el archivo e imprima lo que escribiste tres veces. Imprima el contenido una vez leyendo todo el archivo, una vez haciendo un bucle sobre el objeto de archivo y una vez almacenando las líneas en una lista y luego trabajando con ellas fuera del bloque with.**2.** Aprendizaje C: puede usar el método replace() para reemplazar cualquier palabra en una cadena con una palabra diferente. A continuación, se muestra un ejemplo rápido que muestra cómo reemplazar "perro" por "gato" en una oración:    >>> message = "Me gustan mucho los perros".    >>> message.replace ('perro', 'gato')    'Me gustan mucho los gatos'.    Lea cada línea del archivo que acaba de crear, python.txt, y reemplace la palabra Python con el nombre de otro idioma, como C. Imprima cada línea modificada en la pantalla.<jupyter_code>with open('python.txt') as f:
    contenido = f.read()
print(contenido)    
with open('python.txt') as f:
    for i in f:
        print(i, end = "")
with open('python.txt') as f:
    lista = f.readlines()
print(lista)
with open('python.txt') as f:
    for i in f:
        print(i.lower().replace("python", "C"), end = "")<jupyter_output><empty_output><jupyter_text>Escribiendo en un archivo Para poder escribir en un archivo, es necesario llamar a open con un segundo argumento que indique que se puede escribir. Otras opciones para ese parametro son **r**: solo lectura, **r+**: lectura y escritura, **a**: modo agregar, entre otros. Cuando no se agrega argumento, se asume **r**, por defecto. Si el archivo llamado no existe, se creara uno con el nombre indicado. Cuando python llama al archivo con w, lo primero que hace es borrar su contenido.<jupyter_code>ls
with open('texto.txt', 'w') as archivo:
    archivo.write("Esta venta no se hizo.")
    archivo.write("Esta es otra linea.")
# Con multiples lineas
with open('texto.txt', 'w') as archivo:
    archivo.write("Esta venta no se hizo. \n")
    archivo.write("Hablar con el contador. \n")<jupyter_output><empty_output><jupyter_text>Si se desea abrir el archivo pero sin borrar su contenido, sino mas bien para agregar a lo que ya ahi, se debe usar append en vez de write:<jupyter_code>with open('texto.txt', 'a') as archivo:
    archivo.write("Esta venta tampoco se hizo. \n")
    archivo.write("Hablar con el abogado. \n")<jupyter_output><empty_output><jupyter_text>MINIDESAFIO **1.** Invitado: escriba un programa que solicite al usuario su nombre. Cuando responda, escriba su nombre en un archivo llamado guest.txt.**2.** Libro de visitas: escriba un bucle while que solicite a los usuarios su nombre. Cuando ingresen su nombre, imprima un saludo en la pantalla y agregue una línea que registre su visita en un archivo llamado guest_book.txt. Asegúrese de que cada entrada aparezca en una nueva línea del archivo.**3.** Encuesta de programación: escriba un bucle while que pregunte a las personas por qué les gusta programar. Cada vez que alguien ingrese un motivo, agregue su motivo a un archivo que almacena todas las respuestas.<jupyter_code># Ejercicio 3
respuestas = []
while True:
    motivo = input("Por que le gusta programar? (0 para salir): ")
    if motivo == '0':
        break
    respuestas.append(motivo)

with open('motivos.txt', 'a') as file:
    for i in respuestas:
        file.write(str(i) + "\n")
# Ejercicio 1
nombres = []
while True:
    name = input("Escriba su nombre (0 para salir): ")
    if name == '0':
        break
    nombres.append(name)

with open('guest.txt', 'a') as file:
    for i in nombres:
        file.write(str(i) + "\n")
# Ejercicio 2
nombres = []
while True:
    name = input("Escriba su nombre (0 para salir): ")
    if name == '0':
        break
    print("Bienvenido " + name)
    nombres.append(name)

with open('guest_book.txt', 'a') as file:
    for i in nombres:
        file.write(str(i) + "\n")<jupyter_output><empty_output><jupyter_text>Excepciones Cuando python no sabe que hacer en una cierta parte del codigo, levanta una excepcion que puede ser manejada y redirigida por el programador, usando bloques try-except  Manejando la excepcion ZeroDivisionError<jupyter_code>print(5/0)
try:
    print(5/0)
except ZeroDivisionError:
    print("No se puede dividir por cero.")    
# Ejemplo con posible error
print("Introduzca dos numeros: ")
print("Presione q para salir.")

while True:
    primero = input("Primer numero: ")
    if primero == 'q':
        break
    segundo = input("Segundo numero: ")
    
    respuesta = int(primero)/int(segundo)

print(respuesta)
# Ejemplo corregido
print("Introduzca dos numeros: ")
print("Presione q para salir.")

while True:
    primero = input("Primer numero: ")
    if primero == 'q':
        break
    segundo = input("Segundo numero: ")
    
    try:
        respuesta = int(primero)/int(segundo)
    except ZeroDivisionError:
        print("No se puede dividir por cero.")

print(respuesta)<jupyter_output>Introduzca dos numeros: 
Presione q para salir.
Primer numero: 10
Segundo numero: 2
Primer numero: 10
Segundo numero: 0
No se puede dividir por cero.
Primer numero: 7/0
Segundo numero: 7<jupyter_text>Instruccion Else<jupyter_code># Ejemplo corregido con instruccion else
# Ejemplo corregido
print("Introduzca dos numeros: ")
print("Presione q para salir.")

while True:
    primero = input("Primer numero: ")
    if primero == 'q':
        break
    segundo = input("Segundo numero: ")
    
    try:
        respuesta = int(primero)/int(segundo)
    except ZeroDivisionError:
        print("No se puede dividir por cero.")
    else:
        print(respuesta)<jupyter_output>Introduzca dos numeros: 
Presione q para salir.
Primer numero: 10
Segundo numero: 2
5.0
Primer numero: 7
Segundo numero: 0
No se puede dividir por cero.
Primer numero: 895
Segundo numero: 1357
0.6595431098010317
Primer numero: q<jupyter_text>Manejando el error FileNotFoundError<jupyter_code>ls
archivo = 'alicia.txt'
with open(archivo) as f:
        contents = f.read()

archivo = 'alicia.txt'
try:
    with open(archivo) as f:
        contents = f.read()
except FileNotFoundError:
    print("El archivo " + archivo + " no existe.")<jupyter_output>El archivo alicia.txt no existe.<jupyter_text>Analizando texto<jupyter_code>titulo = "wonderland.txt"

try: 
    with open(titulo) as f:
        contenidos =f.read()
except:
    print("El archivo " + titulo + " no existe.")
else:
    """contar las palabras en el texto"""
    palabras = len(contenidos.split())
    print("Numero de palabras en el texto: ", palabras)<jupyter_output>Numero de palabras en el texto:  14904
{'fraction_non_alphanumeric': 0.11082786310623925, 'fraction_numerical': 0.01446689184883054, 'mean_word_length': 4.4809640237513095, 'pattern_counts': {'":': 0, '<': 101, '<?xml version=': 0, '>': 107, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '26', 'dir': 'jupyter-structured-clean-dedup', 'id': '334878', 'license': 'MIT', 'n_tokens_mistral': 5672, 'n_tokens_neox': 5547, 'n_words': 1845, 'path': 'Semana-2/Varios.ipynb', 'repo_name': 'bel4212a/Curso-ciencia-de-datos', 'size': '15691'}