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;
}

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