try: num = input("Ingrese un número: ") print(num) num=int(num) print(num) resultado = 10 / num print(resultado) except Exception as e: print(f"Ocurrió una excepción no manejada: {e}") else: print("esto se imprime si va bien") # cualquier código lo podemos 'envolver' dentro de un # try: #... # except Exception as e: # Y si sucede un error salta a except # sintaxis del C # java, c++, c#, php, js... # try catch if (){...} # python NO TIENE la sintaxis del C
Soluciones fechas
# PENSAR -> ¿Cómo lo haría yo? ¿Cómo le explico al ordenador como lo haría yo? # divide y vencerás: Todo problema está hecho de problemas más pequeños # PRACTICAR y practicar y practicar MAS QUE LEER import datetime # Crear una función cuanto_falta que nos devuelva los dias que faltan para el fin de # semana. Si ya es fin de semana devolvemos 0 (es mucho más fácil de lo que parece) # cuanto_falta(fecha) -> dias hasta el siguiente fin de semana # saber el día de la semana weekday (0-lunes y 6 domingo) # 0 lunes faltan 5 0+5=5 # 1 martes faltan 4 1+4=5 #... 4 viernes falta 1 4+1=5 5-weekday # 5 sabado faltan 0 # 6 domingo 0 def cuanto_falta(fecha): dia_semana=fecha.weekday() if dia_semana>=5: # in [5,6] return 0 else: return 5-dia_semana print(cuanto_falta(datetime.date(2023,10,16))) # Crear una función primero_de_mes a la que le pasemos un año y nos devuelva una lista # de fechas del 1 de cada mes de ese año: # # primero_de_mes(2024) -> ['2024-01-01'.'2024-02-01',...'2024-12-01'] # ¿Cómo creo yo una fecha a partir de numeros? # datetime.date(año,mes,dia) año->check me lo pasan dia->check siempre es 1 # ¿mes? del 1 al 12 ¿Se hacer un bucle del 1 al 12? for i in range(1,13) # crear una lista lista vacia: [] # añado a la lista: append # ¿Cuantas fechas tengo que crear? 12 una por cada mes def primero_de_mes(anyo): res=[] for i in range(1,13): res.append(datetime.date(anyo,i,1)) return res print(primero_de_mes(2023)) # Crear una funcion fines_de_semana a la que le pasemos un año y un mes y nos devuelva # una lista con todos los fines de semana: # # fines_de_semana(10,2023) -> ['2023-10-01','2023-10-07','2023-10-08',...,'2023-10-29'] # me recorro todos los dias de ese mes y si es fin de semana lo añado a la lista # empiezo por el 1 del mes de ese año, voy sumando un día en un bucle y si el dia es fin # de semana lo añado a la lista # crear una fecha a partir de año mes y dia # sumar un dia a una fecha? + timedelta(days=1) # se si es fin de semana? si el weekday es 5 o 6 # febrero tego que ir del 1 al 28 ¿Cómo lo se yo? # lista con los dias del mes [31,28,31,30,31,30,31,31,30,31,30,31] # el bucle lo hago añadiendo un día, 2023-2-27, 2023-2-28,2023-3-1 # 2023-10-29,2023-10-30,2023-10-31,2023-11-1 # mientras el mes de mi fecha sea el mes que me han pasado sigo en el bucle # en cuanto sea diferente paro def fines_de_semana(mes,anyo): fecha=datetime.date(anyo,mes,1) res=[] while fecha.month==mes: if fecha.weekday() in [5,6]: res.append(fecha) fecha+=datetime.timedelta(days=1) return res print(fines_de_semana(10,2023))
Ejemplos fechas
import datetime import math # Crear un objeto datetime para la fecha y hora actual ahora = datetime.datetime.now() print(ahora) # Resultado: Fecha y hora actual en formato 'YYYY-MM-DD HH:MM:SS' # Obtener la fecha actual fecha_actual = datetime.date.today() print("Fecha actual:", fecha_actual) fecha_formateada = fecha_actual.strftime("%d - %m - %Y") print("Fecha formateada:", fecha_formateada) print(fecha_actual.day) print(ahora.minute) print(ahora.second) # Crear una fecha específica fecha_personalizada = datetime.date(2023, 10, 3) print("Fecha personalizada:", fecha_personalizada) # Crear una fecha y hora específicas fecha_hora_personalizada = datetime.datetime(2023, 10, 3, 14, 30,10,9) print("Fecha y hora personalizada:", fecha_hora_personalizada) anyo_que_viene=datetime.datetime(2024,10,10) print(anyo_que_viene.weekday()) # Crear una fecha a partir de una cadena de texto formateada fecha_desde_cadena = datetime.datetime.strptime("03/10/2023", "%d/%m/%Y") print("Fecha desde cadena:", fecha_desde_cadena) mifecha="10/10/2023" # ¿Es una fecha? No: es una cadena mifecha_a_fecha=datetime.datetime.strptime(mifecha,"%d/%m/%Y") print(mifecha_a_fecha) # ¿Es una fecha? otrafecha=datetime.date(2023,10,10) # ¿Es una fecha? resta=anyo_que_viene-mifecha_a_fecha print(resta.days) print(resta.seconds) hoy=datetime.date.today() manyana=hoy+datetime.timedelta(days=1) semana_que_viene=hoy+datetime.timedelta(days=7) print(manyana) print(semana_que_viene) print("Día de la semana:", fecha_actual.weekday()) # 0 es el lunes el 6 domingo # Ejemplos def antiguedad_empleado2(fecha_contrato): fecha_actual=datetime.date.today() anyos=fecha_actual.year-fecha_contrato.year meses=fecha_actual.month-fecha_contrato.month if (meses<0): meses+=12 anyos-=1 dias=fecha_actual.day-fecha_contrato.day if dias<0: meses-=1 dias+=30 return (dias,meses,anyos) def antiguedad_empleado(fecha_contrato): fecha_actual=datetime.date.today() resta=fecha_actual-fecha_contrato print(resta.days) anyos=math.floor(resta.days/365) print(anyos) meses=math.floor((resta.days-anyos*365)/30) print(meses) dias=resta.days-anyos*365-meses*30 return (dias,meses,anyos) print(antiguedad_empleado2(datetime.date(2015,12,21))) # es fin de semana? def es_fin_de_semana(fecha): """ if fecha.weekday()<5: return False else: return True """ return not fecha.weekday()<5 # No es codigo ninja, es supercomún def siguiente_dia_laborable(fecha): fecha+=datetime.timedelta(days=1) while es_fin_de_semana(fecha): fecha += datetime.timedelta(days=1) return fecha print(siguiente_dia_laborable(datetime.date.today())) print(siguiente_dia_laborable(datetime.date(2023,10,14)))
Repaso (III)
# estructuras de datos # una variable nos permite almacenar un valor # muchos valores no es comodo usar muchas variables # Estructuras que nos permiten almacenar un numero arbitrario de valores # tuplas: se definen con paréntesis, no se pueden modificar tupla=(1,2,3) otra_tupla=(1,"hola",7.8,False) a,b,c=tupla #desempaquetado de tupla a=1, b=2 y c=3 def estadistica(*args): total=0 for numero in args: total+=numero return (total,total/len(args)) print(estadistica(1,2,3)) # listas: colección de elementos que se puede modificar # es el equivalente al array de otros lenguajes lista=[1,2,3,4] otra_lista=[1,"hola",7.0,True] lista[1]=90 print(lista) for i in range(len(lista)): print(lista[i]) lista[i]*=2 for numero in lista: print(numero) numero=numero*2 print(lista) # Comprension de listas # [nuevo_elemento for elemento in secuencia if condición] lista1=[elemento for elemento in lista] print(lista1) lista2=[elemento for elemento in lista if elemento<20] print(lista2) lista3=[elemento/2 for elemento in lista if elemento<20] print(lista3) lista4=[] for elemento in lista: if elemento<20: lista4.append(elemento/2) print(lista4) # diccionarios: conjunto de pares clave, valor diccionario={"Nombre":"Ana","nota":7,"email":"ana@ana.com"} print(diccionario) otro_diccionario={1:"Ana",3:7,9:"ana@ana.com"} print(otro_diccionario) print(diccionario["Nombre"]) print(otro_diccionario[1]) diccionario["Nombre"]="Ana Pi" print(diccionario) for elemento in diccionario: print(elemento) for elemento in diccionario.values(): print(elemento) for elemento in diccionario.items(): print(elemento) # conjunto es lo mismo pero no podemos tener valores repetidos conjunto={1,2,3,5,5,5,5,5} print(conjunto) # tener estructuras complejas: estructuras dentro de estructuras tupla_rara=(1,"cadena", ["a","b","c", {"nombre":"Ana", "notas":(6,9,1, {"nota":9,"observaciones":"Progresa adecuadamente"})}]) valor=tupla_rara[2][3]["notas"][3]["observaciones"] print(valor) clase=[{"nombre":"Ana","notas":[1,2,3]}, {"nombre":"Pep","notas":[11,2,3]}, {"nombre":"Eva","notas":[1,22,3]}] for alumno in clase: # con esto recorro los alumnos print(alumno) print("Para el alumno "+alumno["nombre"]) # ya tengo un alumno individual total=0 for nota in alumno["notas"]: # recorro sus notas print(nota) # ya tengo la nota individual total+=nota print ("La media es "+str(total/len(alumno["notas"])))
Repaso (II)
# funciones: una manera de coseguir varias cosas: # 1) Reaprovechar código # Pongo un código dentro de una etiqueta a la que puedo llamar cuando me haga falta # 2) Organizar el código # Cada cosa está en su sitio # 3) Gano en flexibilidad porque las funciones se pueden llamar unas a otras # Mi código puede ser mejor y más genérico # 4) Gano en legibilidad # Es más fácil leer el código si utilizo funciones # i%2==0 vs esPar(i) """ def nombre_de_la_funcion(parametros si hace falta): hago cosas return algo # si hace falta """ def saludo(): print("hola") saludo() def otro_saludo(nombre="Misteriosa persona"): print("hola "+nombre) print(f"hola {nombre}") otro_saludo("Ana") otro_saludo("Pepe") otro_saludo() def sumar(*args): total=0 for i in args: total+=i # print(total) ##MAL return total print(sumar(1,6,7,3)) # Funciones PURAS # Una función que solamente depende de los parámetros, es independiente del programa # recoge parámetros calcula algo y devuelve el resultado # es una caja negra. import random def moneda(): opciones=["cara","cruz"] return random.choice(opciones) print(moneda())
Repaso (I)
# variables entero=9 decimal=9.6 cadena="hola que tal" booleano=True # estructura de control if # nos permite controlar el flujo del programa si se cumplen condiciones """ if condicion_es_cierta: hago_esto else: hago_esto_otro """ edad=20 if edad>=18: print("Puedes comprar alcohol") else: print("No puedes comprar") # las condiciones pueden ser muy complicadas pais='España' # Los paréntesis EN ESTE CASO no hacen falta if (pais=='España' and edad>=18) or (pais=='EEUU' and edad>=21) or (edad>40) and (pais!='arabia saudi'): print("Puedes comprar alcohol") else: print("No puedes comprar") # Bucles: while y for """ Cuando no sabemos cuando se va a cumplir la condición while condicion: hago algo OJO: que dentro del bucle se cambie la condición """ cont=0 while cont<10: print(cont) cont+=1 # modifiquemos la condicion # empezar por 1 y luego duplicar hasta llegar a 1000000 cont=1 while cont<1000000: print(cont) cont*=2 numero=1 while numero!=0: numero=int(input("Dame un numero (0 para salir")) # bucle for: cuando si sabemos la longitud de lo que queremos recorrer for i in range(1,11): print(i) # Hace algo 10 veces va del 0 al 9 for i in range(10): print(i) # recorre cualquier iterable: tuplas diccionarios conjuntos listas lista=[1,4,2,6,3,9] for numero in lista: print(numero)
Soluciones repaso
# Crear una función que nos calcule el área de un círculo si le pasamos el radio (PI*radio*radio). # Usad el módulo math parra coger el valor de PI import math def area_circulo(radio): area=math.pi*radio**2 return round(area,2) print(area_circulo(1)) # Crear una función acceso a la que le pasamos como parámetros # el departamento y la categoría, nos devuelve true si def acceso(departamento,categoria): res=False if departamento=='gerencia': res=True if departamento=='administracion' and categoria=='mando intermedio': res=True if departamento=='marketing' and categoria=='mando intermedio' or categoria=='jefe de proyecto': res=True return res def acceso2(departamento,categoria): res=False if (departamento=='gerencia' or (departamento=='administracion' and categoria=='mando intermedio') or (departamento=='marketing' and (categoria=='mando intermedio' or categoria=='jefe de proyecto'))): res=True return res # probar todos los casos relevantes print(acceso('administracion','jefe de proyecto')) # Crear una función palabras_largas a la que le pasemos una cadena y nos devuelva una lista de # las palabras cuya longitud sea mayor de 6 def palabras_largas(cadena,longitud=6): palabras=cadena.split(" ") res=[] # [palabra for palabra in palabras if len(palabra)>6] for palabra in palabras: if len(palabra)>longitud: res.append(palabra) return res print(palabras_largas("hola federico que comiste ayer",3)) # conocer lenguaje # antes que eso: saber programar # ante un problema analizar los pasos que daremos pare resolverlo # el plan, la receta, el algoritmo # palabras tengo una cadena y quiero las palabras cuya longitud sea myor de 6 # obtener las palabras # ¿Si tengo una cadena, se obtener la lista de palabras? # si con split(' ') falla si hay signos de puntuación--> para la versión 2.0 # recorriendo las palabras # for palabra in palabras # contando las letras # len() # si son más de seis las apunto # condicion len()>6 necesito un if # añadir append def cadena_mas_larga(cadena): palabras=cadena.split(' ') res=[] for palabra in palabras: if len(palabra)>6: res.append(palabra) return res print(cadena_mas_larga("hola federico que comisteis ayer"))
Soluciones random
# Crear una funcion moneda() que devuelva aleatoriamente 'cara' o 'cruz' # moneda()->'cara' import random def moneda2(): if random.randint(0,1)==0: return "cara" else: return "cruz" def moneda3(): # operador ternario return "cara" if random.randint(0,1)==0 else "cruz" def moneda(): opciones=["cara","cruz"] return random.choice(opciones) print(moneda()) # Crear una función lanzamientos(numero) que nos devuelva una lista de 'caras' y 'cruces' de longitud numero # # lanzamientos(3)->['cara','cara','cruz'] def lanzamientos2(numero): resultado=[] for i in range(numero): resultado.append(moneda()) return resultado def lanzamientos(numero): # utilizar de manera 'ninja' la compresión de listas return [moneda() for i in range(numero)] print(lanzamientos(6)) # Crear una función rascaygana() que nos devuelva un premio de la siguiente manera: # # obtenemos un número entre 1 y 20 # # si el número está entre 1 y 12 no hay premio # # si está entre 13 y 18 un euro de premio # # Si está entre 19 y 20 dos euros def rascaygana2(): numero=random.randint(1,20) if numero<=12: return 0 elif numero<=18: return 1 elif numero<=20: return 2 def rascaygana(): # premios=[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2] premios=[0]*12+[1]*6+[2]*2 return random.choice(premios) print(rascaygana()) print([0]*12+[1]*6+[2]*2)
Ejemplos aleatorios
# obtener un número aleatorio import random numero_aleatorio=random.random() # entre 0 y 1 sin llegar nunca al 1 print(numero_aleatorio) print(round(numero_aleatorio*10)+1) print(random.randint(1,10)) colores = ["rojo", "verde", "azul", "amarillo"] color_aleatorio = random.choice(colores) print(color_aleatorio) # Por ejemplo, "verde" lista=[1,2,3,4,5,6,7,8,9] random.shuffle(lista) print(lista) imagenes=['gatito.jpg','peces.jpg','paisaje.png'] print(random.choice(imagenes)) numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] numeros_aleatorios = random.sample(numeros, 3) # Selecciona 3 números únicos al azar. print(numeros_aleatorios) def dado(): return random.randint(1,6) print(dado()) def carta(): valores=[1,2,3,4,5,6,7,10,11,12] palos=["oros","copas","espadas","bastos"] return str(random.choice(valores))+" de "+random.choice(palos) print(carta()) def baraja(): valores = [1, 2, 3, 4, 5, 6, 7, 10, 11, 12] palos = ["oros", "copas", "espadas", "bastos"] baraja=[] for valor in valores: for palo in palos: baraja.append(str(valor)+" de "+palo) random.shuffle(baraja) return baraja print(baraja())
Solucion Combinadas
# Crear una función a la que le pasemos una lista de números y nos devuelva # una tupla con la suma de los números pares y de los impares: # sumaparidad([1,2,3,4])->(6,4) def sumaparidad(lista): pares=0 impares=0 for numero in lista: if numero%2==0: pares+=numero else: impares+=numero return (pares,impares) def sumaparidad2(lista): pares=[numero for numero in lista if numero%2==0] impares=[numero for numero in lista if numero%2!=0] return (sum(pares),sum(impares)) def sumaparidad3(lista): return (sum([numero for numero in lista if numero%2==0]),sum([numero for numero in lista if numero%2!=0])) print(sumaparidad3([1,2,3,4])) milista=[1,1,1,1,1,2,2,2,2,2] print(sumaparidad3(milista)) # Crear una función a la que le pasamos un diccionario con una lista # de clientes y sus deudas y nos devuelva el total de deudas. # La lista sería así: # clientes={"Ana":[100,500,3000],"Eva":[900,300,200]} # # totaldeuda(clientes)->5000 def totaldeuda(clientes): total=0 for deudas in clientes.values(): total+=sum(deudas) return total def totaldeuda2(clientes): return sum(sum(clientes.values(),[])) print(totaldeuda2(clientes)) # sum(clientes.values(),[]) concatena diferentes listas en una lista print(clientes.values()) print(sum(clientes.values(),[])) lista1=[[1,2,3],[3,4,5],[7,8,9]] lista4=sum(lista1,[]) print(lista4) # Crea una función a la que le pasamos una lista de diccionarios # que son alumnos con el siguiente formato: # clase=[{"nombre":"Ana","notas":[5,7,8]},{"nombre":"Pep","notas":[8,6,8]}] # # Y que nos devuelva la media total de las notas # # media_total(clase)->7 def media_total0(clase): total_notas=0 numero_notas=0 for alumno in clase: for nota in alumno["notas"]: total_notas+=nota numero_notas+=1 return round(total_notas/numero_notas,2) def media_total(clase): total_notas=[] for alumno in clase: total_notas+=alumno["notas"] return round(sum(total_notas)/len(total_notas),2) def media_total_ninja(clase): # Anidación de compresión de listas total_notas=[nota for alumno in clase for nota in alumno["notas"]] return round(sum(total_notas) / len(total_notas), 2) print(media_total_ninja(clase))