# vamos a hacer una función a la que le pasamos un tipo de bono # un tipo de cliente y una cantidad y nos calcule el precio de acuerdo a lo siguiente # bono=vip precio=3000 # bono=extra precio=2000 # bono=normal precio=1000 # tipo cliente= standard, el precio no cambia # tipo cliente=premium, el precio es la mitad # por defecto el bono sea normal y el cliente tambien # los parámetros por defecto siempre al final def precioTotal(cantidad, tipoBono="normal", tipoCliente="normal"): if tipoBono == "normal": precio = 1000 elif tipoBono == "extra": precio = 2000 else: precio = 3000 if tipoCliente == "premium": precio = precio / 2 return cantidad * precio print(precioTotal(10, "normal", "normal")) print(precioTotal(10, "normal", "premium")) print(precioTotal(10, "vip", "premium")) print(precioTotal(10)) # esta función, en teoría, cuenta el número de pares que hay en la lista # ¿Funciona? Si es que no por qué y como arreglarlo def contarPares(lista): total=0 for i in lista: if total%2==0: total+=i return total def contarPares(lista): total = 0 for i in lista: if i % 2 == 0: total += 1 return total # Una función a la que le pasamos un proyecto como este: proyecto = [ {"nombre": "Análisis", "horas": 10, "precio": 60}, {"nombre": "Desarrollo", "horas": 50, "precio": 50}, {"nombre": "Implementación", "horas": 5, "precio": 70}, {"nombre": "Pruebas", "horas": 15, "precio": 40}, ] # Y nos devuelve una lita de las tareas que ocupan más de 10 horas. En el caso anterior, desarrollo y pruebas # tareasLargas(proyecto)->["Desarrollo","Pruebas"] def tareasLargas(proyecto): res=[] for tarea in proyecto: if tarea["horas"]>10: res.append(tarea['nombre']) return res print(tareasLargas(proyecto)) # una función a la que le pasamos una cadena y nos devuelve una lista con la última letra de cada palabra # ultimaLetra("hola que tal")->["a","e","l"] def ultimaLetrafor(cadena): palabras=cadena.split() res=[] for palabra in palabras: res.append(palabra[-1]) return res def ultimaLetra(cadena): return [palabra[-1] for palabra in cadena.split()] print(ultimaLetra("hola que tal"))
Categoría: Python
Soluciones ejercicios funciones
# Crear una función areaCuadrado(lado) a la que le pasamos un lado y nos devuelve el área # areaCuadrado(2)-> 4 def areaCuadrado(lado): return lado*lado # Crear una función a la que le pasamos un número y nos devuelve true si es divisible por # 3 y false en caso contrario # multiploTres(8)->False multiploTres(9)->True def multiploTres(numero): return numero % 3==0 """ if numero % 3==0: return True else: return False """ # Crear una función a la que le pasamos una lista de números y nos dice # el número de pares que hay # numeroPares([1,2,3,4])->2 def numeroPares(lista): contador=0 # recorrer la lista for numero in lista: # cada vez que haya un par contarlo if numero % 2 == 0: contador += 1 return contador # Crear una función a la que le pasamos una cadena y un carácter y nos devuelve una lista # con las palabras que tienen ese caracter # buscaCaracter("Hola que tal","a")->["hola","tal"] # buscaCaracter("Hola que tal","u")->["que"] def buscaCaracter(cadena,caracter): res=[] # recorrer las palabras for palabra in cadena.split(): # Si en esas palabras está el caracter lo añado a res # Si no está, no hago nada if caracter in palabra: res.append(palabra) return res # Crear una función a la que le pasamos una cadena y nos devuelve la lista de palabras # ordenada por longitud # TODO: Preguntar que hacer si la longitud de dos cadenas es igual def ordenarCadena(cadena): # obtener la lista de palabras palabras=cadena.split() palabras=sorted(palabras,key=len) return palabras
Más ejemplos diccionarios anidados
# Así defino un diccionario libro = {"titulo": "El Quijote", "autor": "Cervantes", "precio": 20} # así accedo al valor de una clave print(libro["precio"]) # Así recorro todas las claves for clave in libro: print(clave) # los valores de esa clave print(libro[clave]) # Puedo tener una lista de diccionarios biblioteca = [ {"titulo": "El Quijote", "autor": "Cervantes", "precio": 20}, {"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17}, {"titulo": "Los detectives salvajes", "autor": "Roberto Bolaño", "precio": 23}, {"titulo": "Tom va a la escuela", "autor": "Rick Sánchez", "precio": 10} ] # para acceder a un elemento primero accedo a la posición de la lista print(biblioteca[1]) # {"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17}, print(biblioteca[1]["autor"]) # "Virginia Woolf" # Recorrer esa lista de diccionarios for libro in biblioteca: print(libro) # Quiero ver todos los autores de la biblioteca for libro in biblioteca: print(libro["autor"]) # Puedo hacer cálculos por ejemplo media de precios suma = 0 for libro in biblioteca: suma += libro["precio"] print(suma / len(biblioteca)) proyecto = [ {"nombre": "Análisis", "horas": 10, "precio": 60}, {"nombre": "Desarrollo", "horas": 50, "precio": 50}, {"nombre": "Implementación", "horas": 5, "precio": 70}, {"nombre": "Pruebas", "horas": 15, "precio": 40}, ] # función que me calcule el total de importe del proyecto def totalProyecto(proyecto): total = 0 # recorro las tareas for tarea in proyecto: # Accedo a las propiedades que me interesan. En este caso horas y precio total += tarea["horas"] * tarea["precio"] return total print(totalProyecto(proyecto)) # listas que tienen diccionarios que tienen listas de diccionarios biblioteca = [ {"titulo": "El Quijote", "autor": {"nombre": "Miguel de Cervantes", "pais": "España"}, "ediciones": [ {"editorial": "Alianza", "precio": 15}, {"editorial": "Cátedra", "precio": 20} ] }, {"titulo": "2666", "autor": {"nombre": "Roberto Bolaño", "pais": "Chile"}, "ediciones": [ {"editorial": "Anagrama", "precio": 30}, {"editorial": "Alfaguara", "precio": 28} ] } ] # Al precio de la primera edición de mi primer libro print(biblioteca[0]["ediciones"][0]["precio"]) # 15 # Al precio de la segunda edición de mi segundo libro print(biblioteca[1]["ediciones"][1]["precio"]) # 28 # Si quiero el total de precios de toda la biblioteca # Tengo que recorrer los libros # después recorrer las ediciones # sumar los precios def sumaPreciosBiblioteca(biblioteca): suma=0 for libro in biblioteca: for edicion in libro["ediciones"]: suma+=edicion["precio"] return suma print(sumaPreciosBiblioteca(biblioteca))
Ejercicios preexamen
# Crear una función areaCuadrado(lado) a la que le pasamos un lado y nos devuelve el área # areaCuadrado(2)-> 4 # Crear una función a la que le pasamos un número y nos devuelve true si es divisible por # 3 y false en caso contrario # multiploTres(8)->False multiploTres(9)->True # Crear una función a la que le pasamos una lista de números y nos dice # el número de pares que hay # numeroPares([1,2,3,4])->2 # Crear una función a la que le pasamos una cadena y un carácter y nos devuelve una lista # con las palabras que tienen ese caracter # buscaCaracter("Hola que tal","a")->["hola","tal"] # buscaCaracter("Hola que tal","u")->["que"] # Crear una función a la que le pasamos una cadena y nos devuelve la lista de palabras # ordenada por longitud
Repaso funciones
# funciones # pilar básico de la programación # Nos sirve para encapsular un trozo de código # Y procuramos que las funciones sean 'puras' # los mismos parámetros de entrada devuelven los mismos resultados import math # No es una función pura porque depende del entorno (consola) def saludo(): print("hola que tal") saludo() # Función pura que devuelve un resultado def saludo(): return "hola que tal" # Puedo imprimir en la consola print(saludo()) archivo = open("saludo.txt", "w") # O en un archivo archivo.write(saludo()) archivo.close() # o crear una variable holi = saludo() def saludar(nombre): return "Hola " + nombre + " ¿que tal estás?" print(saludar("Ana")) alumnos = ["Ana", "Eva", "Pep", "Rosa"] for alumno in alumnos: print(saludar(alumno)) saludos = [saludar(alumno) for alumno in alumnos] print(saludos) def esPrimo(numero): for i in range(2, int(math.sqrt(numero))): if numero % i == 0: return False return True # divide y vencerás def listaPrimos(limite): res=[] for i in range(2,limite+1): if esPrimo(i): res.append(i) return res print(esPrimo(17)) print(esPrimo(18)) primos=listaPrimos(50) print(primos)
Repaso for y listas
# estructuras de control """ if condidicion: lo que hacemos si se cumple else: lo que hacemos si no se cumple if condicion: si se cumple elif otra condicion: si se cumple la otra else: en cualquier otro caso if a<1000: 0-1000 elif a<2000: 1000-2000 elif a<3000 2000-3000 las condiciones: tenemos operadores: not, and y or and : Se tienen que cumplir las dos or : Basta que se cumpla una de ellas if edad>=18 and dinero>20: print("Entra en la discoteca") else: Si entra por aquí puede ser porque es menor de 18, porque tiene menos de 20 o por las dos if edad>12 or altura>135: print("Sube a la atracción") Aquí entra porque es mayor de 12, su altura es> 135 o las dos else: Es <12 años y altura<135 """ lista = [1, 2, 3, 4, 5] alumnos = ["aa", "bb", "cc", "dd"] mixta = [1, "cadenas", True] # bucle for. El bucle for nos recorre una lista for numero in lista: # recorro la lista print(numero) # imprime 1,2,3,4,5 for alumno in alumnos: print(alumno) for i in range(10): print(i) numeros = range(20) print(list(numeros)) lista.append(8) # Yo tengo una lista, o cualquier otro objeto complejo (tuplas, diccionarios, conjuntos) # SI quiero procesar los elementos de la lista tendré que hacer EL ESQUEMA # una variable donde calcularé algo # recorreré la lista # modificaré el cálculo a veces dependiendo de una condición # sumar todos los números del 1 al 100 # suma=0 # recorro los numeros del 1 al 100 y los sumo suma = 0 for i in range(1, 101): suma += i print(suma) suma = 0 for i in range(1, 101): if i % 2 == 0: suma += i print(suma) pares = [] for i in range(11): if i % 2 == 0: pares.append(i) print(pares) # Comprension de listas sintaxis: #[ transformación de elemento for elemento in lista condicion de filtro ] codigos=["123","4560","7890","1234","5678"] c1=[elemento for elemento in codigos] print(codigos) print(c1) c2=[len(elemento) for elemento in codigos] print(c2) c3=[elemento[-1] for elemento in codigos] print(c3) c4=["hola" for elemento in codigos] print(c4) c5=[elemento for elemento in codigos if len(elemento)>3] print(c5) c6=[elemento for elemento in codigos if elemento[-1]=="0"] print(c6) c7=[elemento[0:2] for elemento in codigos if elemento[-1]=="0"] print(c7) res=[] for elemento in codigos: if elemento[-1] == "0": res.append(elemento[0:2]) print(res)
Ejercicios soluciones y test unitario
# Crear una función precio que nos calcule el precio de un viaje de la siguiente manera # precioViaje(tipoCliente,destino) # si el cliente es 'vip' y el destino es 'Atenas' 1000 # si el cliente es 'normal' y el destino es 'Atenas' 1300 # si el cliente es 'vip' y el destino es 'Roma' 600 # si el cliente es 'normal' y el destino es 'Roma' 900 def precioViaje(tipoCliente, destino): tabla = [{"tipo": "vip", "destinos": [{"destino": "Atenas", "precio": 1000}, {"destino": "Roma", "precio": 600}]}, {"tipo": "normal", "destinos": [{"destino": "Atenas", "precio": 1300}, {"destino": "Roma", "precio": 900}]} ] for cliente in tabla: for destinos in cliente["destinos"]: if cliente["tipo"] == tipoCliente and destinos["destino"] == destino: return destinos["precio"] return 0 def precioViaje2(tipoCliente, destino): if tipoCliente == 'vip': if destino == 'Atenas': return 1000 if destino == 'Roma': return 600 if tipoCliente == 'normal': if destino == 'Atenas': return 1300 if destino == 'Roma': return 900 return 0 # Crear una función iniciales a la que le pasamos una cadena y nos devuelve una lista # con las primeras letras de cada palabra # iniciales("hola que tal")->['h','q','t'] def iniciales01(cadena): # cogería cada palabra # apuntaría la primera letra palabras = cadena.split() # me convierte una cadena en una lista de palabras res = [] # recorrer las palabras for palabra in palabras: res.append(palabra[0]) return res def iniciales(cadena): # cogería cada palabra # apuntaría la primera letra palabras = cadena.split() # me convierte una cadena en una lista de palabras return [palabra[0] for palabra in palabras] # Crear una función menorLongitud a la que le pasamos una cadena y un numero y nos devuelve # una lista con las palabras que tengan menor longitud que ese numero # menorLongitud("hola que tal estamos. Yo estupendo",4)->['que','tal','Yo'] def menorLongitud01(cadena, numero): palabras = cadena.split() res = [] for palabra in palabras: if len(palabra) < numero: res.append(palabra) return res def menorLongitud(cadena, numero): palabras = cadena.split() return [palabra for palabra in palabras if len(palabra) < numero]
from unittest import TestCase from ejercicios_preexamen01 import precioViaje from ejercicios_preexamen01 import iniciales from ejercicios_preexamen01 import menorLongitud class Test(TestCase): def test_precio_viaje(self): precio = precioViaje('vip', 'Atenas') self.assertEqual(precio, 1000) precio = precioViaje('vip', 'Roma') self.assertEqual(precio, 600) precio = precioViaje('normal', 'Atenas') self.assertEqual(precio, 1300) precio = precioViaje('normal', 'Roma') self.assertEqual(precio, 900) def test_iniciales(self): lista = iniciales("hola que tal") self.assertListEqual(lista, ["h", "q", "t"]) lista = iniciales("yo muy bien sabes") self.assertListEqual(lista, ["y", "m", "b", "s"]) def test_menor_longitud(self): lista=menorLongitud("hola que tal estamos. Yo estupendo",4) self.assertListEqual(lista,['que','tal','Yo']) lista = menorLongitud("aa bbb ccc dddd eeeee fffff ggggggg", 5 ) self.assertListEqual(lista, ['aa', 'bbb', 'ccc','dddd'])
Más ejercicios repaso
# Crear una función precio que nos calcule el precio de un viaje de la siguiente manera # precioViaje(tipoCliente,destino) # si el cliente es 'vip' y el destino es 'Atenas' 1000 # si el cliente es 'normal' y el destino es 'Atenas' 1300 # si el cliente es 'vip' y el destino es 'Roma' 600 # si el cliente es 'normal' y el destino es 'Roma' 900 # Crear una función iniciales a la que le pasamos una cadena y nos devuelve una lista # con las primeras letras de cada palabra # iniciales("hola que tal")->['h','q','t'] # Crear una función menorLongitud a la que le pasamos una cadena y un numero y nos devuelve # u na lista con las palabras que tengan menor longitud que ese numero # menorLongitud("hola que tal estamos. Yo estupendo",4)->['que','tal','Yo']
Tratamiento de errores en Python
# Controlar los errores con try: except import math # Intenta hacer el código entre el try y el except try: edad = int(input("Dime tu edad")) print(edad / 4) # Si ha habido algún tipo de error entra en el código del except except: print("Error") print("Algo no has introducido bien") print("Ten más cuidado la próxima vez") print("adios") def division(a, b): try: return a / b except: return math.inf print(division(4, 2)) print(division(4, 0)) def obtenerNumero(): numero = 0 while (numero == 0): try: numero = int(input("Dame un número: ")) except: numero = 0 return numero print(obtenerNumero()) try: num = int(input("Ingrese un número: ")) resultado = 10 / num except ZeroDivisionError as zde: print(f"Error de división por cero: {zde}") except ValueError as ve: print(f"Error de valor no válido: {ve}") except Exception as e: print(f"Ocurrió una excepción no manejada: {e}") try: a = 9 / 0 except Exception as e: print(e)
Soluciones ejercicios
# 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))