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))