# 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)
Autor: Juan Pablo Fuentes
Formador de programación y bases de datos
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; }
Chuletas interactivas HTML CSS y JS
Ejercicios listas
# 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] #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 # 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"] # 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
Listas, una introducción
numero = 5 cadena = "hola que tal" numero += 9 cadena += " yo muy bien" alumno1 = "Ana" alumno2 = "Eva" alumno3 = "Pep" # Si tengo 20 alumnos no voy a tener 20 variables una para cada alumno # Se han inventado las listas: una variable en la que yo puedo introducir muchos elementos # como defino una lista: con corchetes [...] # cada elemento está separado por comas alumnos = ["Ana", "Eva", "Pep"] # lista de nombres notas = [5, 8, 6] # lista de notas print(alumnos) print(notas) # como accedo a los elementos de la lista: por su posición print(alumnos[0]) # Ana print(alumnos[1]) # Eva print(alumnos[2]) # Pep alumnos[2] = "Juan" # en la posición 2 cambio Pep por Juan print(alumnos) # recorrer la lista for alumno in alumnos: print(alumno) for i in range(len(alumnos)): print(i, alumnos[i]) listaMixta = [1, "Ana", True, 7.8] listaMixtaAnidada = [1, "Ana", True, 7.8, [1, 2, 3]] # valor y referencia precio=15 otroprecio=precio # copia por valor precio=20 # cuando cambio el valor de precio no cambia el de otroprecio print(precio, otroprecio) lista=[1,2,3,4] otralista=lista # copia por referencia otraMas=lista.copy() # copia por valor lista[1]=27 # cuando cambio el valor de lista SI CAMBIA el de otralista print(lista,otralista,otraMas) def cambiarLista(lista): for i in range(len(lista)): lista[i]+=2 cambiarLista(lista) print(lista,otralista) # añadir elementos al final lista.append(90) print(lista) # recupera y borra el elemento del final elemento=lista.pop() print(lista,elemento) # recupera y borra un elemento en cualquier posición elemento=lista.pop(0) print(lista,elemento) # insertar un elemento en cualquier posición lista.insert(2,666) print(lista) cuadrados=[] for i in range(11): cuadrados.append(i**2) print(cuadrados) print(cuadrados[-1]) # el mismo slicing que en cadenas print(cuadrados[2:4]) print(cuadrados[2:]) print(cuadrados[:4]) print(cuadrados[2:-2]) print(cuadrados[-7:-2]) print(cuadrados[0::2])
Ejemplos trabajo con archivos
# trabajar con archivos en python # Tengo que abrir un archivo: open # al abrirlo especifico el modo lectura (r) escritura (w) añadir(a) # hago operaciones de escritura o de lectura # cierro el archivo import random archivo=open("prueba.txt","w") for i in range(5): archivo.write("Hola que tal\n") archivo.close() # Es importante cerrar aunque si no cerramos no pasa nada archivo=open("prueba.txt","r") contenido=archivo.read() print(contenido) archivo.close() archivo=open("tiradas.txt","w") def tirada(): if random.randint(1,2)==1: return "cara" else: return "cruz" for i in range(10): archivo.write(tirada()+"\n") archivo.close() archivo=open("datos.csv","r") datos=archivo.read() for linea in datos.split("\n"): print("-->",linea) alumno=linea.split(";") print(alumno) archivo.close() # leer línea a línea archivo = open("datos.csv", "r") for linea in archivo: print("-->", linea.strip()) archivo.close() archivo = open("datos.csv", "r") linea = archivo.readline() while (linea): print("-->", linea.strip()) linea = archivo.readline() archivo.close()
el archivo datos.csv:
Ana;ana@ana.com
pepe;pepe@pepe.com
Eva;eva@eva.com
Solución ejercicio bootstrap
<!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 rel="stylesheet" href="./css/bootstrap.css"> <!-- Mis estilos van después del bootstrap --> <link rel="stylesheet" href="css/estilos.css"> </head> <body> <!-- Utilizamos el card de w3school ¡copiado!--> <div class="d-flex "> <div class="card" style="width:400px"> <div class="card-body"> <h4 id="user_name" class="card-title">Jane Doe</h4> <p id="user_info" class="card-text">Some example text some example text. Jane Doe is an architect and engineer</p> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#myModal"> Añadir tarea </button> <button class="btn btn-info " data-bs-toggle="collapse" data-bs-target="#demo">Ver tareas <span id="num_tareas" class="badge bg-danger">-</span></button> </div> <img id="user_image" class="card-img-bottom" src="../bootstrap4/img_avatar6.png" alt="Card image" style="width:100%"> </div> <div id="demo" class="collapse"> <!--Utilizo la tabla para que quede más o menos bonito--> <table class="table table-striped m-4"> <thead> <tr> <th>Tareas pendientes</th> <!-- Tengo el id para borrar todas las tareas--> <th> <button type="button" class="btn btn-danger" id="borrar_tareas"> Eliminar todas </button></th> </tr> </thead> <tbody id="lista_tareas"> </tbody> </table> </div> </div> <!-- Utilizamos el Modal de w3school ¡copiado1 --> <div class="modal fade" id="myModal"> <div class="modal-dialog modal-xl modal-dialog-centered"> <div class="modal-content"> <!-- Modal Header --> <div class="modal-header"> <h4 class="modal-title">Tarea nueva</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="tarea" class="form-control " type="text" placeholder="Introduzca la tarea"> </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="nueva_tarea">Añadir tarea</button> </div> </div> </div> </div> <!-- Aquí los scripts --> <script src="./js/bootstrap.bundle.js"></script> <script src="./js/script.js"></script> </body> </html>
// Todas las acciones las hago cuando se ha cargado la página window.onload = function () { // recojo todos los elementos con los que voy a trabajar let modal = document.getElementById("myModal"); let nueva_tarea = document.getElementById("nueva_tarea"); let tarea = document.getElementById("tarea"); let lista_tareas = document.getElementById("lista_tareas"); let num_tareas = document.getElementById("num_tareas"); let borrar_tareas = document.getElementById("borrar_tareas"); // Cuando pulsen borrar_tareas elimino todas las tareas // Cómo? Obtener tareas->Modificar tareas->guardar tareas->pintar tareas borrar_tareas.addEventListener("click", () => { // borrar tareas localStorage.setItem("tareas", "[]"); // pintar tareas pintaTareas(); }); // Cuando pulsen nueva_tarea añado la tarea a la lista nueva_tarea.addEventListener("click", () => { // obtener tareas let tareas = getTareas(); // modificar taras tareas.push(tarea.value); // guardar tareas setTareas(tareas); // Oculto el modal bootstrap.Modal.getInstance(modal).hide(); // pintar tareas pintaTareas(); }) // Obtengo los datos de la api fetch("https://randomuser.me/api") .then(response => response.json()) .then(resultado => { // Aqui 'resultado' tiene ya el json convertido a variable, la podemos usar console.log(resultado); // Llamo a una función con el usuario devuelto pintaUsuario(resultado.results[0]); }); // pinto las tareas al iniciar la página para que si refresco me pinte lo que hay pintaTareas(); function pintaTareas() { // Recupera las tareas let tareas = getTareas(); // Modifica el número del badge num_tareas.innerHTML = tareas.length; // Si no tengo tareas no muestro el botón if (tareas.length==0){ borrar_tareas.classList.add("d-none") }else{ borrar_tareas.classList.remove("d-none") } // Crea los elementos de la tabla de tareas, lo hago con map // A cada botón le pongo el indice de la tarea que quiero borrar // Cómo? con el segundo parámetro del map // lo guardo en un atributo especial del html que es el data- // En el dataset tendré un atributo idtarea que valdrá el índice de la tarea que quiero borrar lista_tareas.innerHTML = tareas.map((x, i) => "<tr><td>" + x + `</td><td><button data-idtarea="${i}" type="button" class="btn btn-danger btn-sm borrar_tarea"> Borrar </button></td></tr>`).join(""); // A cada botón le añado el evento de borrar for (let boton of document.getElementsByClassName("borrar_tarea")) { boton.addEventListener("click", function () { // Obtengo la tarea let tareas = getTareas(); // Modifico las tareas: yo en dataset.idtarea tengo el id de la tarea que quiero eliminar tareas = tareas.filter((x, i) => i != this.dataset.idtarea); // Guardo las tareas setTareas(tareas); // Pinto las tareas pintaTareas(); }) } } } function getTareas() { // Recupero las tareas del storage y las parseo del JSON let tareas = localStorage["tareas"] || "[]"; tareas = JSON.parse(tareas); return tareas; } function setTareas(tareas) { // Lo guardo en el localstorage localStorage["tareas"] = JSON.stringify(tareas); } function pintaUsuario(usuario) { // Ponemos los datos en el card let nombre = document.getElementById("user_name"); let email = document.getElementById("user_info"); let foto = document.getElementById("user_image"); // nombre.innerHTML = Object.values(usuario.name).join(" "); nombre.innerHTML = usuario.name.title + " " + usuario.name.first + " " + usuario.name.last; email.innerHTML = usuario.email; foto.src = usuario.picture.large; }
Ejercicios cadenas Python
# Vamos a crear una función cuantasPalabras a la que le pasamos una cadena y un caracte # Y nos dice cuantas palabras en esa cadena contienen ese caracter # cuantasPalabras("En un lugar de la mancha","e")->2 # cuantasPalabras("En un lugar de la mancha","n")->3 # cuantasPalabras("En un lugar de la mancha","j")->0 # Como veis da lo mismo mayúsculas que minúsculas def cuantasPalabras(cadena, letra): """Nos cuenta cuantas palabras tienen esa letra""" cadena = cadena.lower() letra = letra.lower() cont = 0 # recorrer las palabras for palabra in cadena.split(): # saber si una palabra tiene esa letra if letra in palabra: cont += 1 return cont print(cuantasPalabras("En un lugar de la mancha", "e")) # 2 print(cuantasPalabras("En un lugar de la mancha", "n")) # 3 print(cuantasPalabras("En un lugar de la mancha", "j")) # 0 print(cuantasPalabras("En un lugar de la mancha", "a")) # 3 # Vamos a crear una función mezclar a la que le pasamos una cadena y nos crea otra con # la primera parte las letras pares y la segunda las impares, con unos ejemplos lo vemos mejor: # mezclar("abcdefg")->"acegbdf" mezclar("12345678")->"13572468" def mezclarFor(cadena): """Nos crea una cadena con las letras pares primero y después las impares""" par = "" impar = "" for i in range(len(cadena)): if i % 2 == 0: par += cadena[i] else: impar += cadena[i] return par + impar def mezclar(cadena): """Nos crea una cadena con las letras pares primero y después las impares""" return cadena[0::2] + cadena[1::2] print(mezclar("abcdefg")) # acegbdf print(mezclar("12345678")) # 13572468 # Vamos a crear una funcion que nos devuelva True si hay dos letras iguales repetidas # repetidas("hola que tal")->False # repetidas("viva sevilla")->True (hay dos l) # repetidas("mi carro me lo robaron")->True (hay dos r) def repetidas(cadena): for i in range(len(cadena) - 1): if cadena[i] == cadena[i + 1]: return True return False print(repetidas("hola que tal")) # ->False print(repetidas("viva sevilla")) # ->True (hay dos l) print(repetidas("mi carro me lo robaron")) # ->True (hay dos r) def dobleLetra(frase): fraseLower = frase.lower() # pongo el lower para que me pueda identificar todos los caracteres iguales indice = 1 # variable de soporte para comparar cada letra en el for vs. la siguiente letra de fraseLower (la cadena en la que busco dobles seguidos) for letra in fraseLower: if indice < len(frase) and letra == fraseLower[indice]: return True else: indice += 1 return False print(dobleLetra("Hola que tal")) # debería devolver un false print(dobleLetra("Mi carro me lo robaron")) # debería devolver True