# Cread una función provincias() que nos devuelva una tupla con las provincias de Catalunya # utilizad desempaquetamiento para asignarlo a cuatro variables a,b,c,d # Recorred la tupla con un for # Cread una función descuentos que nos devuelva una tupla con descuentos de 5,10 y 20 # utilizad desempaquetamiento para: # obtener los 3 descuentos # obtener el primer descuento e ignorar los otros dos # Cread una función estadística a la que le pasamos una lista de números y nos devuelve una tupla # con la cantidad de números, la suma, y la media # estadistica([1,2,3,4])->(4,10,2.5) # Cread un diccionario para almacenar los datos de un cliente que son nombre Eva, email eva@eva.com # telefono 666777666 y credito 5000 # Cread una función a la que le pasamos un diccionario como el de los libros y nos devuelve el # título del libro que tenga más ejemplares
Categoría: Python
Ejemplos diccionarios
# Un diccionario es una estructura de datos que almacena un conjunto de pares # clave, valor # Es decir, no son valores únicos, sino que se componen de una clave y de un valor # La clave es inmutable y el valor no persona = { "nombre": "Ana", "edad": 30, "profesion": "Ingeniera" } print(persona) print(persona["edad"]) # 30 persona["edad"] = 32 print(persona) persona["sueldo"] = 5000 print(persona) # print(persona["foo"]) # Da error porque no hay esa clave print(persona.get("foo")) # NO da error aunque no hay esa clave print(persona.get("foo", "Sin valor")) # NO da error aunque no hay esa clave y le doy un valor por defecto # probad a crear un diccionario para un alumno que tenga nombre, nota y curso alumno = { "nombre": "Ana", "nota": 8, "curso": "Bachillerato" } print(alumno.keys()) # Me devuelve todas las claves print(alumno.values()) # Me devuelve todos los valores print(alumno.items()) # Me devuelve todos los pares clave,valor # recorrer un diccionario for clave, valor in alumno.items(): print(f"La clave {clave} tiene el valor {valor}") for i in alumno.items(): print(i) # 1. Crear un diccionario con libros y su cantidad en inventario inventario = { "Cien años de soledad": 4, "El Principito": 10, "1984": 6 } # 2. Añadir un nuevo libro inventario["Don Quijote"] = 3 # 3. Modificar la cantidad de un libro existente inventario["1984"] = 8 # 4. Eliminar un libro del inventario del inventario["El Principito"] # inventario.pop("El Principito") # 5. Recorrer el diccionario e imprimir el inventario print("Inventario actual:") for titulo, cantidad in inventario.items(): print(f"{titulo}: {cantidad} ejemplares") # 6. Obtener solo los títulos disponibles titulos = [titulo for titulo in inventario] print("\nTítulos disponibles:", titulos) # 7. Crear una lista de libros con más de 5 ejemplares populares = [titulo for titulo, cantidad in inventario.items() if cantidad > 5] print("\nLibros populares (más de 5 ejemplares):", populares) # 8. Crear un nuevo diccionario con solo los libros escasos (3 o menos) escasos = {titulo: cantidad for titulo, cantidad in inventario.items() if cantidad <= 3} print("\nLibros escasos:", escasos)
Tuplas
# las tuplas son como las listas, pero inmutables # No se pueden modificar # Si las listas se definen con corchetes, las tuplas se definen con paréntesis mitupla = (1, 2, 3, 4) otratupla = ("Ana", "Pep", "Eva") for numero in mitupla: print(numero) print(mitupla[1]) print(mitupla[-1]) print(mitupla[1:3]) def extremos(lista): ordenada = sorted(lista) # [1,2,3,4,5,8] return (ordenada[0], ordenada[-1]) print(extremos([2, 4, 1, 8, 5, 3])) # desempaquetar tupla menor, mayor = extremos([2, 4, 1, 8, 5, 3]) print((menor)) print((mayor)) i, j = extremos([2, 4, 1, 8, 5, 3]) print((i)) print((j)) # desempaqueto 4 valores a, b, c, d = mitupla # a=1,b=2,c=3,d=4 print(c) tupla = (2, 4, 8) a, b, c = tupla # a=2, b=4, c=8 def foo(): return ("Sí", "No", "Quizás") def tablairpf(): return (5, 10, 12, 18) s, n, q = foo() # s="Sí", n="No", q="Quizás" print(q) bajo, medio, alto, superior = tablairpf() # desempaquetar múltiples valores b, *m, s = tablairpf() print(b) # 5 print(m) # [10,12] print(s) # 18 b, m, *s = tablairpf() print(b) # 5 print(m) # 10 print(s) # [12, 18] *_, m, s = tablairpf() print(b) # [5, 10] print(m) # 12 print(s) # 18 def suma(*numeros): suma = 0 for numero in numeros: suma += numero return suma print(suma(1, 2)) print(suma(1, 2, 4, 5, 7)) print(suma(1, 2, 4, 5, 7, 8, 9, 10)) s, n, _ = foo() # s="Sí", n="No", _ se ignora
Ejercicios comprension
Nivel fácil
- Crea una lista con los cuadrados de los números del 1 al 10.
- Obtén una lista con los números del 0 al 20 que sean múltiplos de 3.
- Dada la lista
["Ana", "Luis", "Pedro"]
, obtén una lista con sus longitudes.
🔧 Nivel intermedio
- Crear una función fueraNegativos a la que le pasamos una lista y nos devuelve solo los positivos
fueraNegativos ([3, -1, -7, 5, 0])->[3,5,0]
- Crea una función a la que se le pasa un límite y un número y nos devuelve una lista con todos los números hasta ese límite que son múltiplos de ese número listaMultiplos(10,4)->[4,8]
- Crea una función a la que le pasamos un número y nos devuelve una lista con la tabla de multiplicar de ese número tablaMultiplicar(7)->[7,14,21,…70]
🔬 Nivel avanzado
- Crea una función a la que le pasamos una lista de palabras y nos devuelve solo las que tengan vocales conVocales([“hola”,”qwfr”,”que”])->[“hola”,”que”]
Ejemplos comprension
def media(lista): suma = 0 for numero in lista: suma += numero return (suma / len(lista)) def mediaAprobados2(lista): aprobados = [] for numero in lista: if numero >= 5: aprobados.append(numero) return media(aprobados) # Filtro la lista con el if >=5, no hago ninguna expresión def mediaAprobados3(lista): aprobados = [nota for nota in lista if nota >= 5] return media(aprobados) def contarCadenas(lista, longitud): # una variable donde contar cont = 0 # recorrer la lista de cadenas for cadena in lista: # Si la cadena tiene una longitud mayor de 'longitud' contarla y si no hago nada if len(cadena) > longitud: cont += 1 return cont # Filtro la lista por las que tengan una longitud mayor que la que me pasan def contarCadenas2(lista, longitud): # Palabras mayores de una longitud mayores = [cadena for cadena in lista if len(cadena) > longitud] # ¡Ojo! Devuelvo la longitud, porque estoy contando return len(mayores) def minusculas(lista): resultado = [] for elemento in lista: resultado.append(elemento.lower()) return resultado # No hago ningún filtro, solo transformo a minúsculas def minusculas2(lista): minusculas = [cadena.lower() for cadena in lista] return minusculas def longitudPar(lista): resultado = [] for elemento in lista: if len(elemento) % 2 == 0: resultado.append(elemento) return resultado # filtro las que tengan longitud par def longitudPar2(lista): resultado = [cadena for cadena in lista if len(cadena) % 2 == 0] return resultado
Comprension de listas
# Hemos visto en muchos ejercicios que recorrer y procesar una lista es habitual # En python tenemos la comprension de listas # [expresión for elemento in iterable] cuadrados = [x ** 2 for x in range(1, 10)] print(cuadrados) # Hace exactamente lo mismo que esto cuadrados = [] for x in range(1, 10): cuadrados.append(x ** 2) letrasdobles = [letra * 2 for letra in "hola que tal"] print(letrasdobles) notas = [4, 15, 7, 19, 12] notas10 = [nota / 2 for nota in notas] print(notas10) notascopia = [nota for nota in notas] print(notascopia) # tabla de multiplicar del 7 (7,14,21,...,70) tabla7 = [x * 7 for x in range(1, 11)] print(tabla7) # Añadir una condición: seleccionar lo elementos del iterable que cumplan una determinada condición # [expresion for elementi in interable if condicion] # Buscamos los que sean pares (x%2==0) pares = [x for x in range(1, 11) if x % 2 == 0] print(pares) # Las cadenas de una determinada longitud cadenas = ["a", "bb", "ccc", "dddd", "eeeeee", "fffffff"] largas = [cadena for cadena in cadenas if len(cadena) > 4] print(largas) # Buscamos las notas aprobadas (>10) y además las transformamos notas10aprobadas = [nota / 2 for nota in notas if nota >= 10] print(notas10aprobadas) # Operador ternario: Igual que un if pero en vez de controlar el flujo # devuelve un valor dependiendo de la condicion # valor_si_cierto if condicion else valor_si_falso numero = 27 espar = "par" if numero % 2 == 0 else "impar" print(espar) if numero % 2 == 0: espar = "par" else: espar = "impar" ciudad = "Logroño" envio = 5 if ciudad == "Barcelona" else 10 print(envio) # 10 def calculoEnvio(ciudad): return 5 if ciudad == "Barcelona" else 10 print(calculoEnvio("Barcelona")) # 5 # Podemos usar como expresión un operador ternario notasCorte = ["Aprobada" if nota >= 10 else "Suspendida" for nota in notas] print(notasCorte) longitudes = ["corta" if len(cadena) < 4 else "larga" for cadena in cadenas] print(longitudes) # Todo junto numeros = [1, 4, -5, 7, -2, 20] # A los números positivos si es par lo duplicamos y si es impar lo elevamos al cuadrado calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0] print(calculo) # nucleo que es recorer una lista # for elemento in iterable: for numero in numeros # Parte derecha yo puedo poner una condición: ejemplo if numero>=0 (los positivos) [1,4,7,20] # parte izquierda pongo una expresión puede ser numero en cuyo caso no hacemos ninguna transformación calculo = [numero for numero in numeros if numero >= 0] print(calculo) # Una expresión sencilla, por ejemplo, elevar al cubo calculo = [numero ** 3 for numero in numeros if numero >= 0] print(calculo) # Liarme la manta a la cabeza y usar un operador ternario, en este caso # si es par duplicamos, si es impar elevamos al cubo # en el operador ternario hacemos lo mismo, empezamos por el núcleo, la condición # if numero%2==0 # en la parte derecha ponemos lo que devolvemos si NO se cumple la condición numero**2 # en la parte izquierda ponemos lo que devolvemos si SÍ se cumple numero*2 # numero * 2 if numero % 2 == 0 else numero ** 2 # Juntando todo obtengo lo siguiente: calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0] print(calculo) frases = ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"] # Vamos a hacer un código que filtre las palabras con una longitud mayor de 4 # Si tienen un espacio dejamos la cadena, si no tienen ningún espacio ponemos "No es frase" # yo empiezo por el núcleo que siempre es recorrer la lista filtro = [frase for frase in frases] # puesto que ni filtro ni pongo expresión lo siguiente me devuelve la propia lista print(filtro) # ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"] # Aplico la condición, la longitud debe ser mayor de 4 filtro = [frase for frase in frases if len(frase) > 4] print(filtro) # ["que tal", "epanadiplosis", "En un lugar de la mancha", "otorrinolaringologo"] # Ahora tengo que construir el operador ternario que, si tiene un espacio me devuelve la frase # Y si no lo tiene me devuelve "No hay frase2 # Empiezo por el núcleo # if " " in frase # Si se cumple: devuelvo frase # Si no se cumple: devuelvo "No es frase" # frase if " " in frase else "No es frase" # Meto el operador ternario en lo que tenía antes filtro = [frase if " " in frase else "No es frase" for frase in frases if len(frase) > 4] print(filtro) # ['que tal', 'No es frase', 'En un lugar de la mancha', 'No es frase']
Soluciones ejercicios
# Cread una función a la que le pasamos un número y nos lo devuelva multiplicado por 3 # triplicar(5) -> 15 def triplicar(numero): return numero * 3 # Cread una función a la que le pasamos una cadena y una letra y nos devuelva True si la cadena tiene esa letra # tieneLetra("hola que tal","t")->true def tieneLetra(cadena, letra): for i in cadena: if i == letra: return True return False tieneLetra("hola que tal", "t") # Cread una función a la que le pasamos una ciudad y un importe y nos devuelve los gastos de envío # acordes a la siguiente: # Barcelona: 0 Tarragona o Girona con importe < 500 5€, resto 0€ Resto de ciudades 6€ # gastosEnvio("Barcelona",50)->0 gastosEnvio("Logroño",50)->6 def gastosEnvio(ciudad, importe): if ciudad == "Barcelona": return 0 elif ciudad == "Tarragona" or ciudad == "Girona": if importe < 500: return 5 else: return 0 else: return 6 # Otra manera def gastosEnvio2(ciudad, importe): if ciudad == "Barcelona": return 0 elif (ciudad == "Tarragona" or ciudad == "Girona") and importe<500: return 5 elif (ciudad == "Tarragona" or ciudad == "Girona") and importe >= 500: return 0 else: return 6 print(gastosEnvio("Barcelona", 50)) # 0 print(gastosEnvio("Logroño", 50)) # 6 print(gastosEnvio("Girona", 50)) # 5 print(gastosEnvio("Tarragona", 5000)) # 0 # cread una función que nos diga si alguien puede subir a una atracción de acuerdo a su edad y su altura # si tiene más de 18 años o una altura superior a 135 cm puede subir, en caso contrario no # puedeSubir(20,130)->True puedeSubir(10,140)->True puedeSubir(10,130)->False def puedeSubir(edad, altura): if edad >= 18 or altura >= 135: return True else: return False print(puedeSubir(20, 130)) # True print(puedeSubir(10, 140)) # True print(puedeSubir(10, 130)) # False
Ejercicios repaso
# Cread una función a la que le pasamos un número y nos lo devuelva multiplicado por 3 # triplicar(5) -> 15 # Cread una función a la que le pasamos una cadena y una letra y nos devuelva True si la cadena tiene esa letra # tieneLetra("hola que tal","t")->true # Cread una función a la que le pasamos una ciudad y un importe y nos devuelve los gastos de envío # acordes a la siguiente: Barcelona: 0 Tarragona o Girona con importe < 500 5€, resto 0€ Resto de ciudades 6€ # gastosEnvio("Barcelona",50)->0 gastosEnvio("Logroño",50)->6 # cread una función que nos diga si alguien puede subir a una atracción de acuerdo a su edad y su altura # si tiene más de 18 años o una altura superior a 135 cm puede subir, en caso contrario no # puedeSubir(20,130)->True puedeSubir(10,140)->True puedeSubir(10,130)->False
Repaso general
# Variables # Caja donde almacenar valores edad = 90 nombre = "Ana" sueldo = 5000 iva = .21 tieneSaldo = True # Podemos hacer operaciones edad += 1 sueldoneto = sueldo * .85 nombre = nombre + " Pi" # Tema de los nombres, mayúsculas y minúsculas cuentan # no es lo mismo 'nombre' que 'Nombre' que 'NOMBRE' # empezamos con minuscula y si hay palabra nueva a) Usamos mayusculas b) usamos guión bajo sueldoBruto = sueldo * 1.1 sueldo_bruto = sueldo * 1.1 sb = sueldo * 1.1 # Los operadores 'extraños' son el módulo %, la división entera // y la exponenciación resto = 7 % 3 # El resto de divivir 7 entre 3, es decir 1 entero = 7 // 3 # división entera luego 2 potencia = 2 ** 10 # 2 elevado a la décima potencia, es decir 1024 cont = 0 # sumar 1 cont = cont + 1 cont += 1 # concatenar cadena alumno = "Ana" alumno = alumno + " Pi" alumno += " Pi" # >,>=,<,<= pero ojo igual es '==' y diferente es '!=' # Operadores booleanos, que nos dan cierto o falso # and cierto si los dos son ciertos or cierto si alguno es cierto y not cierto si es falso y viceversa # funciones # trozo de código reutilizable al que le pasamos parámetros y frecuentemente devolvemos un resultado # sintaxis # def nombre_funcion(parametros): # codigo # return resultado # IMPORTANTE: Una función debe ser 'pura', es decir, solo depende de los parámetros que le pasamos # devuelve un resultado que a igual parámetro igual resultado # NO modifica el entorno, si yo le paso na variable fuera de la función debe tener el mismo valor # con los tipos simples no hay problema, pero con las listas hay que tener cuidado # si modificamos la lista dentro de la función también la modificamos fuera def saludo(): return "Hola que tal" # Tengo la función, después la tengo que llamar hola = saludo() print(saludo()) def saludo2(nombre): return f"Hola {nombre} que tal estás" print(saludo2("Ana")) nombre = "Federido I de Prusia" print(saludo2(nombre)) def saludos(cantidad=2): resultado = "" for i in range(cantidad): resultado += saludo() + "\n" # resultado=resultado+saludo()+"\n" return resultado print(saludos(5)) print(saludos()) # Condicional. Nos permite dirigir el flujo del código dependiendo de condiciones # if condicion: # codigo si se cumple # else: # codigo si no se cumple # La condición puede ser compleja utilizando and, or y not def mayor(a, b): if a > b: return a else: return b print(mayor(6, 9)) # 9 def login(usuario, password): if usuario == "admin" and password == "1234": return True else: return False print(login("Ana", "11212")) # False print(login("admin", "1234")) # True usuario = input("Dime tu usuario") password = input("Dime la contraseña") if login(usuario, password): print("Puedes entrar") else: print("No puedes entrar") def irpf(sueldo): if sueldo < 1000: return .02 elif sueldo < 3000: return .05 elif sueldo < 5000: return .1 else: return .2 def sueldoNeto(sueldo): return sueldo - sueldo * irpf(sueldo) print(irpf(2500)) # 0.05 print(sueldoNeto(2500)) miSueldo = sueldoNeto(2500) totalAnyo = miSueldo * 12 print(f"Este año voy a ganar neto {totalAnyo}") # bucles # while y el for # while es un bucle que se ejecuta mientras se cumpla una condición def geometrica(inicio, razon, limite): while inicio < limite: inicio *= razon return inicio print(geometrica(1, 2, 500)) # cogemos cualquier número, si es par dividimos entre 2 si impar *3+1 def serieAl1(numero): lista = [numero] while numero != 1: if numero % 2 == 0: numero = numero / 2 else: numero = numero * 3 + 1 lista.append(numero) return lista print(serieAl1(4500)) # for nos permite recorrer 'iterables' ¿QUé es un iterable? # Elementos de python que se pueden recorrer # Una cadena se puede recorrer letra a letra for letra in "hola": print(letra) # Una lista se puede recorrer elemento a elemento for elemento in [4, 2, 7, 9, 6]: print(elemento) # Puedo crear rangos de números consecutivos con 'range' for i in range(8): # 0..7 print(i) for i in range(2, 8): # 2..7 print(i) for i in range(2, 8, 2): # 2,4,6 print(i) for i in range(7, 0, -1): # 7,6,5,4,3,2,1 print(i) # Con esto de los rangos consecutivos también puedo hacer el repetir una acción # un número determinado de veces # Imprime "hola" 5 veces. En este caso no nos importa el valor de i, simplemente hacer algo 5 veces for i in range(5): print("hola") # Las cadenas tienen una serie de funciones para saber si tienen una subcadena, pasar mayúsculas/minúsculas # obtener subcadenas con el 'slicing', etcétera def fragmentos(cadena): resultado=[] for i in range(len(cadena)): resultado.append(cadena[0:i]) return resultado print(fragmentos("anastasia")) # Listas: colecciones de elementos de cualquier tipo lista = [1, 2, 5, 2, "hola", True] # Se pueden recorrer con un for como hemos visto antes y tienen una serie de funciones # para insertar, añadir, repetir, etcétera def crearConsecutiva(veces): lista=[] for i in range(veces): lista.append(i) return lista print(crearConsecutiva(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Ejercicios listas
# Definir el algoritmo # Los pasos que vamos a implementar para resolver el problema # La 'receta' # Divide y vencerás: un problema grande se compone de otros más pequeños # Lo primero es pensar ¿Cömo voy a resolver este problema? # Cread una función a la que le pasamos una lista de números y nos devuelva una lista # con el menor y el mayor # menorMayor([3,1,8,5])->[1,8] # Cread una función a la que le pasamos una lista de nombres y nos devuelve una lista # con todos los nombres en minúsculas # minusculas(["Ana","Pep","Iu"])->["ana","pep","iu"] # Cread una función a la que le pasamos una lista de cadenas y nos devuelve una lista # con las que tengan una longitud par # longitudPar(["aa","bbb","cccc","ddddd"])->["aa","cccc"]