# escribir una función recortarPalabras a la que le pasamos una lista de palabras # y una longitud y nos devuelve una lista con las palabras de esa lonitud o superior # recortarPalabras(["aa","bbb","cccc","dddddd"],4)->["cccc","dddddd"] # con comprensión de listas es muy fácil # escribir una función a la que le pasamos una lista de números y nos devuelve la mitad # de los números pares, los impares los ignora # mitadPares([1,2,5,8,10])->[1,4,5] # escribir una función a la que le pasamos dos listas y nos devuelve true si tienen # algún elemento en común y false en caso contrario # elementoComun([1,2,3],[4,5,6])->false # elementoComun([1,2,3],[4,5,6,3])->true # (es más fácil de lo que parece) # escribir una función a la que le pasamos una lista de números y nos devuelve una tupla # con la suma y la media de los números # estadistica([1,2,3])->(6,2)
Autor: Juan Pablo Fuentes
Formador de programación y bases de datos
Desempaquetar
tupla = (1, 2, 3) a, b, c = tupla # desempaquetando la tupla. A las variables se les asignan automáticamente los # valores de la tupla print(a, b, c) def extremos(*args): min = args[0] max = args[0] for n in args: if n < min: min = n if n > max: max = n return (min, max) # tupla = extremos(1, 5, 3, 7, 9, 0, -2) a, b = extremos(1, 5, 3, 7, 9, 0, -2) print(a, b) a, _, b = tupla # con el guión bajo ignoro elementos print(a, b) tupla=(1, 5, 3, 7, 9, 0, -2) a,*b,c=tupla # con el asterisco capturo un numero indeterminado de elementos print(a,b,c) a,*_,c=tupla # con el asterisco y guion bajo ignoro un numero indeterminado de elementos print(a,c)
Tuplas
# las tuplas son como las listas pero inmutables # se definen con paréntesis tupla = (1, 2, 3, 4, 5,6,7,8,9,10) print(tupla[0]) print(len(tupla)) for t in tupla: print(t) for i in range(len(tupla)): print (i,tupla[i]) # El mismo slicing que cadenas y listas print(tupla[2:4]) print(tupla[2:]) print(tupla[:4]) print(tupla[2:-2]) print(tupla[-7:-2]) print(tupla[0::2]) # El operador in que lo teníamos en las cadenas también lo tenemos en tuplas y listas if 8 in tupla: print("El 8 está en la tupla") # sumar tuplas otra=(1,2,3) suma=tupla+otra print(tupla,otra,suma) lista=list(suma) print(lista)
Ordenación de listas
# sumar listas para crear listas nuevas con los elementos de las listas sumados lista1 = [1, 2, 3] lista2 = [4, 5, 6] lista3 = lista1 + lista2 print(lista1, lista2, lista3) # añadir a una lista existente otra lista lista1.extend(lista2) print(lista1, lista2, lista3) lista4 = lista2 + lista1 print(lista4) lista4.sort() print(lista4) lista4.sort(reverse=True) print(lista4) alumnos = ["Ana", "Eva", "pep", "Iu", "juan", "Rosa", "Iu", "Iu"] alumnos.sort() print(alumnos) # usando key lo que le digo es que antes de ordenar aplique esa función alumnos.sort(key=str.lower) print(alumnos) def valorAbsoluto(numero): if numero<0: numero=-numero return numero valores=[1,-3,6,-2,-8,3,-4] valores.sort(key=valorAbsoluto) print(valores) def nombreCompleto(tratamiento,nombre,apellido): return tratamiento+" "+nombre+" "+apellido print(nombreCompleto("Sr.","Pepito","Pérez")) print(nombreCompleto(nombre="Ana",tratamiento="Excelentísima",apellido="Pi"))
Comprensión de listas en Python: ejemplos
# eliminar elementos nums = ["Ana", "Eva", "Pep", "Iu", "Juan", "Rosa", "Iu", "Iu"] print(nums) nums.pop(2) # elimino el que está en la posición 2 print(nums) nums.remove("Iu") # Busca 'Iu' y lo elimina print(nums) print(nums) for numero in nums: print(numero) # for x in lista es el núcleo de la comprensión de listas # la parte izquierda es la transformación del elemento nueva = ["@" + elemento for elemento in nums] print(nueva) notas = [1, 2, 3, 4, 5, 7, 8, 9] transformada = [nota * 2 for nota in notas] print(transformada) trans2 = [nota for nota in notas] print(trans2) trans3 = [7 for nota in notas] print(trans3) trans2 = [nota for nota in notas if nota % 2 == 0] print(trans2) nueva = [elemento for elemento in nums if len(elemento) > 3] print(nueva) precios = [10, 20, 15, 70, 32, 40] pvp = [precio * 1.21 for precio in precios if precio >= 20] print(pvp) edad = 16 # Operador ternario print("Mayor de edad" if edad >= 18 else "Menor de edad") aprobar = [5 if nota < 5 else nota for nota in notas] print(aprobar) def cuadrado(num): return num ** 2 cuad = [cuadrado(num) for num in notas] print(cuad)
Solución ejercicios listas y archivos
# crear una función generarRango a la que le pasamos un número y nos devuelve una lista # desde el 1 hasta ese número generarRango(5)_>[1,2,3,4,5] def generarRango(numero): rango = [] for i in range(numero): rango.append(i + 1) return rango print(generarRango(9)) # [1,2,3,4,5] # crear una función mediaAritmetica a la que le pasamos una lista de números y nos devuelve la media # mediaAritmetica([2,4,6])->4 def mediaAritmetica(lista): return sum(lista) / len(lista) print(mediaAritmetica([2, 4, 6])) # 4 # crear una función a la que le pasamos una letra y un número y nos genera una lista con esa letra # repetida una, dos y hasta n veces # generarCadenas("a",5)->["a","aa","aaa","aaaa","aaaaa"] def generarCadenas(letra, numero): lista = [] if len(letra) != 1: return lista for i in range(numero): lista.append(letra * (i + 1)) return lista print(generarCadenas("a", 5)) # ["a","aa","aaa","aaaa","aaaaa"] # Crear una función a la que le pasamos un nombre de archivo y un número y nos crea ese archivo # y nos escribe números de líneas hasta el número # crearArchivo("datos.txt",5) nos genera un archivo 'datos.txt' con 5 líneas numeradas del 1 al 5 def crearArchivo(nombre,rango): archivo=open(nombre,"w") for i in range(rango): archivo.write(str(i+1)+"\n") archivo.close() crearArchivo("datos.txt",5)
Bootstrap grid varios ejemplos
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <!-- Latest compiled JavaScript --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-sm-3 bg-primary text-white">25%</div> <div class="col-sm-6 bg-dark text-white"> <h1>hola</h1> </div> <div class="col-sm-3 bg-success text-white">25%</div> </div> <div class="row"> <div class="col-md bg-primary text-white"><img class="img-fluid " src="./img/foto.jpg" /></div> <div class="col-md bg-dark text-white"><img class="img-fluid " src="./img/foto.jpg" /></div> <div class="col-md bg-success text-white"><img class="img-fluid " src="./img/foto.jpg" /></div> </div> <div class="row"> <div class="col bg-primary text-white">25%</div> <div class="col bg-dark text-white"> <h1>hola</h1> </div> <div class="col bg-success text-white">25%</div> <div class="col bg-primary text-white">25%</div> <div class="col bg-success text-white">25%</div> </div> <div class="row"> <div class="col-sm-6 col-md-3 bg-primary text-white"> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<br> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </div> <div class="col-sm-6 col-md-3 bg-dark text-white"> Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. </div> <div class="col-sm-6 col-md-3 bg-success text-white"> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<br> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </div> <div class="col-sm-6 col-md-3 bg-warning text-white"> Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. </div> </div> <div class="row"> <div class="col">--</div> </div> <div class="row row-cols-1 row-cols-sm-2 row-cols-md-4"> <div class="col bg-primary text-white"> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<br> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </div> <div class="col bg-dark text-white"> Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. </div> <div class="col bg-success text-white"> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<br> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </div> <div class="col bg-warning text-white"> <div class="row"> <div class="col bg-primary text-white">25%</div> <div class="col bg-dark text-white"> <h1>hola</h1> </div> <div class="col bg-success text-white">25%</div> <div class="col bg-primary text-white">25%</div> <div class="col bg-success text-white">25%</div> </div> </div> </div> </div> </body> </html>
Solución alumnos definitiva
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Lista alumnos</title> <link rel="stylesheet" href="./css/bootstrap1.css"> </head> <body> <div class="container "> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalAlumno"> Añadir alumno </button> <!--Utilizo la tabla para que quede más o menos bonito--> <table class="table table-striped m-4"> <thead> <tr> <th>Alumno</th> <th>Nota</th> <!-- Tengo el id para borrar todas las tareas--> <th> <button type="button" class="btn btn-danger" id="borrar_alumnos"> Eliminar todos </button></th> </tr> </thead> <tbody id="lista_alumnos"> </tbody> </table> <!-- Utilizamos el Modal de w3school ¡copiado! --> <div class="modal fade" id="modalAlumno"> <div class="modal-dialog modal-xl modal-dialog-centered"> <div class="modal-content"> <!-- Modal Header --> <div class="modal-header"> <h4 class="modal-title">Nuevo alumno</h4> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <!-- El input tiene un id porque necesito el valor --> <div class="modal-body"> <input id="nombreAlumno" class="form-control " type="text" placeholder="Introduzca el nombre del alumno"> <input id="notaAlumno" class="form-control " type="number" placeholder="Introduzca la nota del alumno"> </div> <!-- El boton de nueva tarea tiene un id por la misma razón --> <div class="modal-footer"> <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-success" id="nuevo_alumno">Añadir alumno</button> </div> </div> </div> </div> </div> <script src="./js/bootstrap.bundle.js"></script> <script src="./js/alumnos.js"></script> </body> </html>
let estado = {} // Para guardar todos los componentes que me hacen falta window.onload = function () { // Guardo todos los accesos a los elementos html que necesito // Me olvido del html para el resto del código estado.nuevo = document.getElementById("nuevo_alumno"); estado.nuevo.addEventListener("click", nuevoAlumno); estado.borrar = document.getElementById("borrar_alumnos"); estado.borrar.addEventListener("click", borrarAlumnos); estado.tabla = document.getElementById("lista_alumnos"); estado.nombre = document.getElementById("nombreAlumno"); estado.nota = document.getElementById("notaAlumno"); estado.modal = document.getElementById("modalAlumno"); estado.alumnos = []; iniciar(); } function iniciar() { // Rcupero los datos del storage esto se hace solo una vez getStorageData(); pintarAlumnos(); } function nuevoAlumno() { // Recuperar los datos del modal let alumno = getDatosAlumno(); if (alumno.nota<0 || alumno.nota>10){ alert("Nota incorrecta") return } // Añadirlos al estado estado.alumnos.push(alumno); // Pintar los datos pintarAlumnos() ocultarModal() } function borrarAlumnos() { estado.alumnos = []; pintarAlumnos(); } function getDatosAlumno() { return { nombre: estado.nombre.value, nota: Number(estado.nota.value) } } function ocultarModal() { bootstrap.Modal.getInstance(estado.modal).hide(); } function borrarAlumno() { let idalumno=this.dataset.idalumno estado.alumnos=estado.alumnos.filter((x,i)=>i!=idalumno); pintarAlumnos(); } // Funciones de localStorage function getStorageData(){ let alumnos=localStorage.getItem("alumnos") || "[]"; alumnos=JSON.parse(alumnos); estado.alumnos=alumnos } function setStorageData(){ localStorage.setItem("alumnos",JSON.stringify(estado.alumnos)) } // Una capa intermedia entre la función pura y nuestro programa // Con el fin de que todo sea más escalable function pintarAlumnos() { setStorageData(); pintarDatos(estado.alumnos, estado.tabla) } function pintarDatos(alumnos, destino) { lista = ""; let suma=0; let i=0; for (let alumno of alumnos) { lista += `<tr><td>${alumno.nombre}</td><td class=${alumno.nota >= 5 ? "text-success " : "text-danger"}>${alumno.nota}</td><td> <button data-idalumno="${i}" type="button" class="btn btn-danger btn-sm borrar_alumno"> Borrar </button> </td></tr>`; i++ suma+=alumno.nota } let media=Math.round(suma*100/alumnos.length)/100 lista += alumnos.length>0?`<tr><td>Media</td><td class=${media >= 5 ? "text-success " : "text-danger"}>${media}</td></tr>`:""; destino.innerHTML = lista; for (let boton of document.getElementsByClassName("borrar_alumno")) { boton.addEventListener("click",borrarAlumno); } }
Solución ejercicio alumnos 1 versión
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Lista alumnos</title> <link rel="stylesheet" href="./css/bootstrap1.css"> </head> <body> <div class="container "> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalAlumno"> Añadir alumno </button> <!--Utilizo la tabla para que quede más o menos bonito--> <table class="table table-striped m-4"> <thead> <tr> <th>Alumno</th> <th>Nota</th> <!-- Tengo el id para borrar todas las tareas--> <th> <button type="button" class="btn btn-danger" id="borrar_alumnos"> Eliminar todos </button></th> </tr> </thead> <tbody id="lista_alumnos"> </tbody> </table> <!-- Utilizamos el Modal de w3school ¡copiado! --> <div class="modal fade" id="modalAlumno"> <div class="modal-dialog modal-xl modal-dialog-centered"> <div class="modal-content"> <!-- Modal Header --> <div class="modal-header"> <h4 class="modal-title">Nuevo alumno</h4> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <!-- El input tiene un id porque necesito el valor --> <div class="modal-body"> <input id="nombreAlumno" class="form-control " type="text" placeholder="Introduzca el nombre del alumno"> <input id="notaAlumno" class="form-control " type="number" placeholder="Introduzca la nota del alumno"> </div> <!-- El boton de nueva tarea tiene un id por la misma razón --> <div class="modal-footer"> <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-success" id="nuevo_alumno">Añadir alumno</button> </div> </div> </div> </div> </div> <script src="./js/bootstrap.bundle.js"></script> <script src="./js/alumnos.js"></script> </body> </html>
let estado = {} // Para guardar todos los componentes que me hacen falta window.onload = function () { // Guardo todos los accesos a los elementos html que necesito // Me olvido del html para el resto del código estado.nuevo = document.getElementById("nuevo_alumno"); estado.nuevo.addEventListener("click", nuevoAlumno); estado.borrar = document.getElementById("borrar_alumnos"); estado.borrar.addEventListener("click", borrarAlumnos); estado.tabla = document.getElementById("lista_alumnos"); estado.nombre = document.getElementById("nombreAlumno"); estado.nota = document.getElementById("notaAlumno"); estado.modal = document.getElementById("modalAlumno"); estado.alumnos = []; iniciar(); } function iniciar() { estado.alumnos = [{ nombre: "Ana", nota: 5 }, { nombre: "Eva", nota: 8 }, { nombre: "Pep", nota: 3 }]; pintarAlumnos() } function nuevoAlumno() { // Recuperar los datos let alumno = getDatosAlumno(); // Añadirlos al estado estado.alumnos.push(alumno); // Pintar los datos pintarAlumnos() ocultarModal() } function borrarAlumnos() { estado.alumnos = []; pintarAlumnos(); } function getDatosAlumno() { return { nombre: estado.nombre.value, nota: Number(estado.nota.value) } } function ocultarModal() { bootstrap.Modal.getInstance(estado.modal).hide(); } // Una capa intermedia entre la función pura y nuestro programa // Con el fin de que todo sea más escalable function pintarAlumnos() { pintarDatos(estado.alumnos, estado.tabla) } function pintarDatos(alumnos, destino) { lista = ""; let suma=0; for (let alumno of alumnos) { lista += `<tr><td>${alumno.nombre}</td><td class=${alumno.nota >= 5 ? "text-success " : "text-danger"}>${alumno.nota}</td></tr>`; suma+=alumno.nota } let media=Math.round(suma*100/alumnos.length)/100 lista += `<tr><td>Media</td><td class=${media >= 5 ? "text-success " : "text-danger"}>${media}</td></tr>`; destino.innerHTML = lista; }