# Cread una función a la que le pasamos una cantidad y nos devuelve el PVP # siguiendo las siguientes reglas # Si el precio es <1000 No hay descuento # Está entre 1000 y <3000 5% de descuento # Es 3000 o más 10% de descuento # devuelvo el importe, no el descuento def getPVP(importe): if importe < 1000: return importe if importe >= 1000 and importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 if importe >= 3000: return importe * 0.9 def getPVP2(importe): if importe < 1000: return importe elif importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 else: return importe * 0.9 def getPVP3(importe): if importe < 1000: return importe if importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 return importe * 0.9 print(getPVP(200)) print(getPVP(700)) print(getPVP(1000)) print(getPVP(10000)) def doble(numero): return numero * 2 print(doble(8)) # Cread una función obtenerIRPF(departamento, sueldo) que nos devuelva el % de irpf acorde a: # Si el departamento es 'marketing' 12% # Si el departamento es 'administracion' y el sueldo es <2500 12%, si es mayor 15% # Si el departamento es 'contabilidad' tiene los siguientes tramos: # hasta 3000 10% de 3000 a 5000 12% mas de 5000 15% def obtenerIRPFOld(departamento, sueldo): if departamento == 'marketing': return .12 if departamento == 'administracion' and sueldo < 2500: return .12 if departamento == 'administracion' and sueldo >= 2500: return .15 if departamento == 'contabilidad' and sueldo < 3000: return .10 if departamento == 'contabilidad' and sueldo >= 3000 and sueldo < 5000: return .12 if departamento == 'contabilidad' and sueldo >= 5000: return .15 def obtenerIRPFClean(departamento, sueldo): if departamento == 'marketing': return .12 if departamento == 'administracion': if sueldo < 2500: return .12 else: return .15 if departamento == 'contabilidad': if sueldo < 3000: return .10 elif sueldo < 5000: return .12 else: return .15 # primero va el and y después el or def obtenerIRPF(departamento, sueldo): if departamento == 'marketing' or (departamento == 'administracion' and sueldo < 2500) or (departamento == 'contabilidad' and sueldo >= 3000 and sueldo < 5000): return .12 if departamento == 'administracion' and sueldo >= 2500 or departamento == 'contabilidad' and sueldo >= 5000: return .15 if departamento == 'contabilidad' and sueldo < 3000: return .10 print(obtenerIRPF('marketing', 1000)) print(obtenerIRPF('administracion', 1000)) print(obtenerIRPF('administracion', 3000)) print(obtenerIRPF('contabilidad', 2000)) print(obtenerIRPF('contabilidad', 3500)) print(obtenerIRPF('contabilidad', 6000))
Categoría: Python
Ejercicios If
# Cread una función a la que le pasamos una cantidad y nos devuelve el PVP # siguiendo las siguientes reglas # Si el precio es <1000 No hay descuento # Está entre 1000 y <3000 5% de descuento # Es 3000 o más 10% de descuento # devuelvo el importe, no el descuento # Cread una función obtenerIRPF(departamento, sueldo) que nos devuelva el % de irpf acorde a: # Si el departamento es 'marketing' 12% # Si el departamento es 'administracion' y el sueldo es <2500 12%, si es mayor 15% # Si el departamento es 'contabilidad' tiene los siguientes tramos: # hasta 3000 10% de 3000 a 5000 12% mas de 5000 15%
Ejemplo función recursiva para buscar un archivo
Probad a crear una carpeta meted un archivo dentro y mirad a ver si lo encuentra
import os def buscar_archivo(ruta, nombre_archivo): """ Busca un archivo con un nombre específico en una carpeta y sus subcarpetas. :param ruta: La ruta de la carpeta en la que iniciar la búsqueda. :param nombre_archivo: El nombre del archivo a buscar. :return: La ruta completa del archivo si se encuentra, de lo contrario None. """ # Recorremos todos los elementos dentro de la carpeta actual for elemento in os.listdir(ruta): # Construimos la ruta completa del elemento ruta_completa = os.path.join(ruta, elemento) # Si el elemento es un archivo y su nombre coincide con el que buscamos if os.path.isfile(ruta_completa) and elemento == nombre_archivo: return ruta_completa # Si el elemento es una carpeta, llamamos recursivamente a la función elif os.path.isdir(ruta_completa): resultado = buscar_archivo(ruta_completa, nombre_archivo) if resultado: return resultado # Si no encontramos el archivo, devolvemos None return None # Ejemplo de uso ruta_busqueda = 'c:\\xampp' nombre_archivo = 'index.html' resultado = buscar_archivo(ruta_busqueda, nombre_archivo) if resultado: print(f'Archivo encontrado en: {resultado}') else: print('Archivo no encontrado')
Ejemplos modulo os
import os # La carpeta en la que estoy directorio_actual = os.getcwd() print(directorio_actual) # Me devuelve una lista de todos los archivos en una carpeta determinada archivos_en_directorio = os.listdir(directorio_actual) print(archivos_en_directorio) # Lista que se puede recorrer for archivo in archivos_en_directorio: print(archivo) if os.path.isfile(archivo): print('Es un archivo.') elif os.path.isdir(archivo): print('Es un directorio.') elif os.path.islink(archivo): print('Es un enlace simbólico.') archivos_en_directorio = os.listdir("c:\\xampp") print(archivos_en_directorio) # Si un archivo existe. Muy útil si yo quiero abrir un archivo print(os.path.exists("c:\\xampp\\pepe.txt")) # False print(os.path.exists("c:\\xampp\\uninstall.dat")) # True porque en mi ordenador sí que existe # Compruebo antes de crear que la carpeta no exista if not os.path.exists("nueva_carpeta"): # Creo la carpeta os.mkdir("nueva_carpeta") # Compruebo que no existe la ruta de carpetas que quiero crear if not os.path.exists("carpeta\\con\\subcarpetas"): # Creo la carpeta con sus subcarpetas os.makedirs("carpeta\\con\\subcarpetas") #Compruebo que existe el archivo if os.path.exists("pais.txt"): # Si existe, lo elimino. OJO CUIDADO no se puede deshacer os.remove("pais.txt") #os.rename("numeros01.txt","numeros1.text") ruta_absoluta = os.path.abspath('prueba.txt') print(ruta_absoluta)
Soluciones fechas
import datetime # crear una función cuantoFalta(fecha) a la que le pasamos una fecha # y nos devuelve cuantos días faltan hasta esa fecha def cuantoFalta(fecha): # Calcular cuantos días faltan hasta la fecha que me pasan # que día es hoy hoy = datetime.datetime.now() # Hago la resta, en python es tan sencillo como restar faltan = fecha - hoy # timedelta que es un periodo de tiempo # De ese periodo de tiempo me interesan los días return faltan.days # La fecha de mi cumpleaños miFecha = datetime.datetime(2024, 8, 13) # ¿Cuanto falta hasta mi cumpleaños? print(cuantoFalta(miFecha)) # 75 # crear una función primerosDeMes(anyo) que nos devuelva una lista con las fechas # de los primeros de mes de ese año (1 de enero, 1 de febrero, 1 de marzo...) def primerosDeMes(anyo): # Crear una lista de fechas res = [] # creo una fecha datetime.date(año,mes,dia) # ¿Cuantas fechas tengo que crear? 12 for i in range(12): res.append(datetime.datetime(anyo, i + 1, 1)) # res.append("01/"+str(i+1)+"/"+str(anyo)) return res print(primerosDeMes(2024)) # [2024-1-1,2024-2-1,....,2024-12-1] print(primerosDeMes(2556)) # [2024-1-1,2024-2-1,....,2024-12-1] fechas = primerosDeMes(2024) for fecha in fechas: print(fecha.strftime("%d/%m/%Y"), cuantoFalta(fecha)) # crear una función a la que le pasamos una cadena con una fecha en formato dia/mes/año # y nos devuelve true si es fin de semana y false en caso contrario # esFinDeSemana(cadena) def esFinDeSemana(cadena): res = False # Pasar de cadena a fecha fecha = datetime.datetime.strptime(cadena, "%d/%m/%Y") if fecha.weekday() >= 5: res = True return res print(esFinDeSemana(("01/06/2024"))) # true print(esFinDeSemana(("04/06/2024"))) # false # crear una función a la que le pasamos un año, un mes y un día y nos devuelve una lista # con todas las horas exactas de ese día # crearAgendaDia(2024,5,1)->[2024-5-1 00:00,2024-5-1 01:00,2024-5-1 02:00,2024-5-1 03:00,...2024-5-1 23:00] def crearAgendaDia(anyo, mes, dia): res = [] # crear una lista con unas horas que van de donde a donde? de 0 a 23 for i in range(24): res.append(datetime.datetime(anyo, mes, dia, i)) return res print(crearAgendaDia(2024, 5, 1)) # [2024-5-1 00:00,2024-5-1 01:00,2024-5-1 02:00,2024-5-1 03:00,...2024-5-1 23:00]
Ejercicios fechas
# crear una función cuantoFalta(fecha) a la que le pasamos una fecha # y nos devuelve cuantos días faltan hasta esa fecha # crear una función primerosDeMes(anyo) que nos devuelva una lista con las fechas # de los primeros de mes de ese año (1 de enero, 1 de febrero, 1 de marzo...) # crear una función a la que le pasamos una cadena con una fecha en formato dia/mes/año # y nos devuelve true si es fin de semana y false en caso contrario # esFinDeSemana(cadena) # crear una función a la que le pasamos un año, un mes y un día y nos devuelve una lista # con todas las horas exactas de ese día # crearAgendaDia(2024,5,1)->[2024-5-1 00:00,2024-5-1 01:00,2024-5-1 02:00,2024-5-1 03:00,...2024-5-1 23:00]
Ejercicio fechas y archivos
import datetime def primerDiaLaborable(fecha): if fecha.weekday() >= 5: # pasar al lunes ¿Cómo? # Si es un 5 le sumo 2 y si es un 6 le sumo 1 # 5-->2 # 6-->1 # suman 7 7-weekday()=lo que yo le tengo que sumar fecha += datetime.timedelta(days=7-fecha.weekday()) """ if fecha.weekday() == 5: fecha += datetime.timedelta(days=2) if fecha.weekday() == 6: fecha += datetime.timedelta(days=1) """ return fecha def crearCitas(fechaInicio, diasIntervalo, numero): """ Función para crear una serie de citas :param fechaInicio: La fecha en que empiezan las citas :param diasIntervalo: Cada cuantos días será la cita :param numero: El número de citas :return: Una lista con todas las citas """ citas = [] intervalo = datetime.timedelta(days=diasIntervalo) for i in range(numero): # antes de añadir la fecha a la lista tengo que comprobar si es fin de semana o no fechaInicio = primerDiaLaborable(fechaInicio) citas.append(fechaInicio) fechaInicio += intervalo return citas def crearArchivo(nombre, titulo, citas): archivo = open(nombre, "w") for cita in citas: archivo.write(cita.strftime("%d/%m/%Y") + ";" + titulo + "\n") archivo.close() hoy = datetime.datetime.now() print(hoy.weekday()) misCitas = crearCitas(hoy, 10, 20) print(misCitas) crearArchivo("citas.txt", "Seguimiento Python", misCitas) # Mi idea va a ser crear un archivo para crear citas. Este archivo lo voy a importar # con un programa de calendario # El formato que necesito es # d/m/Y;titulo de la cita # Como añadido: no puedo tener citas en fin de semana. Si aluna cita cae en fin de semana # se pasa al lunes siguiente
Ejemplos fechas
import datetime # fechas, horas, fechas y horas # date, time, datetime # Obtener la fecha y hora actual con now ahora=datetime.datetime.now() # Tengo el momento actual print(ahora) # los valores de fecha (año, mes y día) print(ahora.year,ahora.month,ahora.day) # los valores de tiempo (hora,minutos, segundos, microsegundos) print(ahora.hour,ahora.minute,ahora.second,ahora.microsecond) # día de la semana, la parte de la fecha o la parte de la hora print(ahora.weekday(),ahora.date(),ahora.time()) # si solo me interesa la fecha uso el date y el today. No tengo datos de tiempo hoy=datetime.date.today() print(hoy) # Crear una fecha dando los valores a mano (año,mes,día,hora,minuto,segundo) unaFecha=datetime.datetime(2024,6,4,18,30,00) # Lo puedo hacer con parámetros nombrados otraFecha=datetime.datetime(day=5,month=1,year=2025,hour=20,minute=30) print(unaFecha) print(otraFecha) # Lo mismo sin tiempo, solo la fecha soloFecha=datetime.date(2024,1,15) print(soloFecha) # Restar y sumar fechas. Esto me da un objeto timedelta que es intervalo de tiempo diferencia=unaFecha-ahora print(diferencia.days,diferencia.seconds) # calculo una diferencia entre fechas se crea un objeto timedelta # Intervalo de tiempo lo creo poniendo los valores que necesite intervalo=datetime.timedelta(hours=2,minutes=30) # Puedo restar o sumar a la fecha ese intervalo de tiempo print(ahora-intervalo) # Al imprimir se muestra en formato año mes dia hora minuto segundo # Podemos cambiar como se muestra dia mes año print(ahora.strftime("%d-%m-%Y")) # Hora minutos segundos print(ahora.strftime("%H-%M-%S")) # hora am/pm minutos segundos print(ahora.strftime("%I%p-%M-%S")) # dia del año y semana del año print(ahora.strftime("%j %U %W")) # fecha completa print(ahora.strftime("%c")) miFecha="03/03/2025" # convierto de una cadena a una fecha con un formato determinado # tendríamos que saber el formato fecha=datetime.datetime.strptime("03/03/2025","%d/%m/%Y") print(fecha,fecha.month)
Solución modulo random
# vamos a crear una función tiradaMoneda() que nos devuelve 'cara' o 'cruz' aleatoriamente import random def tiradaMoneda(): # tiradas posibles tiradas = ['cara', 'cruz'] # devuelvo una al azar return random.choice(tiradas) # la puedo usar para imprimir por la consola print("Una tirada de moneda", tiradaMoneda()) # Y otra función tiradaMonedas(veces) que nos devuelva una lista de x tiradas aleatorias # de monedas. tiradaMonedas(3)->["cara","cara","cruz"] # Le paso como parámetro las veces def tiradaMonedas(veces): # esquema típico. Tengo un valor que inicializo a algo # en este caso una lista y la inicializo a lista vacía lista = [] # recorro las veces que me pasan como parámetro for i in range(veces): # añado a la lista una tirada (modifico el valor que voy a devolver) lista.append(tiradaMoneda()) # la puedo usar para guardarla en una lista return lista print(tiradaMonedas(10)) # y otra función tiradaFrecuente(tiradas) a la que le pasamos una lista de tiradas y nos # devuelve 'cara' si hay más caras que cruces 'cruz' si hay más cruces que caras y 'empate' # si hay la misma cantidad def tiradaFrecuente(tiradas): # inicializo dos valores a 0 cruces = 0 caras = 0 # recorro las tiradas que me pasan for tirada in tiradas: # si la tirada es cara modifico el valor a devolver (le sumo 1) if tirada == 'cara': caras += 1 # si la tirada es cruz modifico el valor a devolver (le sumo 1) if tirada == 'cruz': cruces += 1 # No devolvemos directamente el número de carras y de cruces # Si no que a partir de ahí calculamos lo que vamos a devolver if cruces > caras: return 'cruz' if caras > cruces: return 'cara' return 'empate' def tiradaFrecuenteTupla(tiradas): # inicializo dos valores a 0 cruces = 0 caras = 0 # recorro las tiradas que me pasan for tirada in tiradas: # si la tirada es cara modifico el valor a devolver (le sumo 1) if tirada == 'cara': caras += 1 # si la tirada es cruz modifico el valor a devolver (le sumo 1) if tirada == 'cruz': cruces += 1 # No devolvemos directamente el número de carras y de cruces # Si no que a partir de ahí calculamos lo que vamos a devolver return (caras, cruces) tiradas = tiradaMonedas(6) print(tiradas) print(tiradaFrecuente(tiradas)) caras, cruces = tiradaFrecuenteTupla(tiradas) print(caras, cruces)
Ejercicios random
# vamos a crear una función tiradaMoneda() que nos devuelve 'cara' o 'cruz' aleatoriamente # Y otra función tiradaMonedas(veces) que nos devuelva una lista de x tiradas aleatorias # de monedas. tiradaMonedas(3)->["cara","cara","cruz"] # y otra función tiradaFrecuente(tiradas) a la que le pasamos una lista de tiradas y nos # devuelve 'cara' si hay más caras que cruces 'cruz' si hay más cruces que caras y 'empate' # si hay la misma cantidad