Ejemplo función: palíndromo

# saber si una cadena es un palíndromo
# Una cadena es un palíndromo si se lee igual de principio a fin que viceversa
# Isaac no ronca asi
# esPalindromo(cadena)- True si es palíndromo y false en caso contrario


def esPalindromo(cadena):
    """
    Comprueba si una cadena es un palíndromo, se lee igual de derecha a izquierda que al revés

    Args:
     cadena: cadena a comprobar
    Returns:
        bool: True si es palíndromo
    """
    # poner la cadena en mayúsculas o en minúsculas
    cadena = cadena.lower()
    # quitar espacios
    cadena = cadena.replace(" ", "")
    """if (cadena==cadena[::-1]):
        return True
    else:
        return False"""
    return cadena == cadena[::-1]


print(esPalindromo("Isaac no ronca asi"))  # true
print(esPalindromo("Hola que tal"))  # false
print(esPalindromo("Dabale arroz a la zorra el abad"))  # true

Ejemplos de cadenas en python

Subcadenas: https://www.learnbyexample.org/python-string-slicing/

cad1 = "hola"
cad2 = "adios"
print(cad1 + " y " + cad2)
print(cad1, " y ", cad2)

cad3 = "ana" * 3
print(cad3)

print(len(cad3))

# subcadenas usamos la sintaxis de los corchetes

cad4 = "En un lugar de  la mancha. Camión"
print(cad4[4])  # me escribe la posición 4
print(cad4[4:8])  # me escribe la posición 4 a la posición 8 no incluída
print(cad4[4:-4])  # desde la posición 4 hasta la posición 4 empezando desde el final
print(cad4[4:-1])  # desde la posición 4 hasta la posición 1 empezando desde el final
print(cad4[-4:-1])  # desde la posición 4 empezando desde el final hasta la posición 1 empezando desde el final
print(cad4[-1])  # último carácter
print(cad4[-2])  # penúltimo carácter

for i in range(len(cad4)):
    print(cad4[0:i + 1])

# conversiones de mayúsculas/minúsculas
print(cad4.upper())  # lo pone en  mayúsculas
print(cad4.lower())  # lo pone en minúsculas
print(cad4.capitalize())  # la primera letra de cada frase en mayúsculas, resto en minúsculas
print(cad4.title())  # la primera letra de cada pelabra en mayúsculas, resto en minúsculas
print(cad4.swapcase())  # las mayúsculas pasan a minúsculas y viceversa
print(cad4.casefold())  # También a minúsculas

# reemplazar
cad5 = cad4.replace("a", "@")  # reemplaza todas las apariciones de a en la cadena por @
cad6 = cad4.replace("a", "@", 2)  # lo mismo pero solo las dos primeras
print(cad5)
print(cad6)

# eliminar espacios
cad6 = "    hola que tal   "
print("|" + cad6.strip() + "|")  # elimina espacios al principio y al final de la cadena
print("|" + cad6.lstrip() + "|")  # elimina espacios al principio  de la cadena
print("|" + cad6.rstrip() + "|")  # elimina espacios  al final de la cadena

# buscar subcadenas dentro de una cadena

print("mancha" in cad4)  # esto me devuelve true porque mancha es una subcadena de cad4
print("pepe" in cad4)  # esto me devuelve false porque pepe NO es una subcadena de cad4

pos = cad4.find("en")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
pos3 = cad4.lower().find("en")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
pos2 = cad4.find("un")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
print(pos)  # -1 porque la cadena 'en' no está, está 'En' que no es lo mismo
print(pos2)  # porque 'un' está en la posición 3
print(pos3)  # porque 'en' está en la posición 0 (al principio) si lo paso a minúsculas

pos4 = cad4.find("a")
while pos4 != -1:
    print(pos4)
    pos4 = cad4.find("a", pos4 + 1)  # todas las apariciones de la letra 'a' dentro de cad4

cad6="en casa en ocasiones entiendo mis enredos"
pos=cad6.find("en")
print(pos)
pos=cad6.find("en",1)
print(pos)
pos=cad6.find("en",9)
print(pos)

for i in range(len(cad4)):
    print(i,cad4[i])

# pasar de cadena a lista y viceversa
# split y join

lista=cad4.split() # me separa cada palabra y me la pone en una lista
print(lista)
print(len(lista)) # Número de palabras de la cadena
for palabra in lista:
    print(palabra) # Voy recorriendo cada palabra de la lista

print(cad6.count("en")) # todas las veces que aparece 'en' que puede ser dentro de una palabra
cont=0
for palabra in cad6.split():
    if palabra=="en":
        cont+=1
print(cont) # cuenta las veces que tenemos la palbra 'en'

cad7="1,2,3,4,5,6,7,8"
numeros=cad7.split(",")
print(numeros)
cad8="-".join(numeros)
print(cad8)

print(cad6[0:8:2]) # Voy de la posición 0 a la 8 de 2 en 2
print(cad6[8:0:-1]) # Voy de la posición 8 a la 0 de uno en uno pero al revés

print(cad6[:4]) # Va desde el principio hasta la posición 4
print(cad6[4:]) # Va desde  la posición 4 hasta el final
print(cad6[::-1]) # Invierte la cadena

invpalabras=""
for palabra in cad6.split():
    invpalabras+=palabra[::-1]+" "
print(invpalabras)

Ejemplo uso varias cosas de bootstrap con JS

 <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">4</span></button>

    <div id="demo" class="collapse">
        <ul id="lista_tareas"></ul>
    </div>
    <!-- The Modal -->
    <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>

                <!-- Modal body -->
                <div class="modal-body">
                    <input id="tarea" class="form-control " type="text" placeholder="Introduzca la tarea">
                </div>

                <!-- Modal footer -->
                <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>
    <script src="./js/bootstrap.bundle.js"></script>
    <script src="./js/script.js"></script>
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");
nueva_tarea.addEventListener("click",()=>{
    let tareas=localStorage["tareas"] || "[]"
    tareas=JSON.parse(tareas);
    tareas.push(tarea.value);
    localStorage["tareas"]=JSON.stringify(tareas)
    bootstrap.Modal.getInstance(modal).hide()
    num_tareas.innerHTML=tareas.length
    lista_tareas.innerHTML=tareas.map(x=>"<li>"+x+"</li>").join("")
})

Ejemplo barra bootstrap

html

 <div class="progress">
        <div id="barra" class="progress-bar progress-bar-striped progress-bar-animated" style="width:10%"></div>
    </div>

jd

let barra = document.getElementById("barra")
let cont = 10
setTimeout(incrementarBarra, 1000)
function incrementarBarra() {
    cont+=5
    barra.style.width = cont + "%"
    barra.innerHTML = cont + "%"
    if (cont < 100) {
        setTimeout(incrementarBarra, 1000)
    }
}

Solución examen

function repetir(cadena, numero) {
    if (cadena.length != 1) { return ""; }
    return cadena.repeat(numero);
}

console.log(repetir("a", 6))
console.log(repetir("aasdasd", 6))

function masLarga(cad1, cad2) {
    return cad1.length > cad2.length ? cad1 : cad2
}

console.log(masLarga("hola", "adios"))
console.log(masLarga("hola amigos", "adios"))

function eliminarPares(lista) {
    return lista.filter(cad => cad.length % 2 != 0)
}

console.log(eliminarPares(["aa", "bbb", "ccccc", "dddd"]))

function repetidas(cadena){
    for(i=1;i<cadena.length;i++){
        if (cadena.at(i)==cadena.at(i-1) && cadena.at(i)!=" "){
            return true;
        }
    }
    return false;
}

function repetidasForeach(cadena){
    let res=false
    cadena.split('').forEach((valor,i)=>{
        if (valor==cadena.at(i+1)){
            res= true;
            return
        }
    })
    return res;
}


console.log(repetidasForeach('La luvia  en madrid'))

Ejercicios argumentos variables

# vamos a crear una función a la que le pasamos una cantidad variable
# de números y nos dice cuantos pares hay
# contarPares(1,2,3)->1 contarPares(1,2,4,6)-> 3
# documentadla

# Vamos a crear una función a la que le pasemos una cantidad variable de números
# y nos diga la cantidad de aprobados (valor>=5)
# aprobados(3,6,7,5)->3  aprobados(7,1,2,9)->2
#documentadla

https://ellibrodepython.com/args-kwargs-python

Recursividad y funciones de orden superior

# función recursiva: una función que se llama a sí misma

# factorial de un número: 5!=5*4*3*2*1 multiplicación de todos los números hasta el 1
# factorial de un número: 5! = 5*4! multiplicación del número por el factorial de ese número -1
# Si yo quiero haccer una función recursiva:
# identificar el caso base: Siempre hay un final donde devolvemos un valor y no otra llamada
# if numero<2 devuelvo 1
# poner nuestra función como una llama a ella misma
# numero*factorial(numero-1)
# En esta llamada de alguna manera nos acercamos al caso base

def factorialRecursivo(numero):
    if numero < 2:
        return 1
    else:
        return numero * factorialRecursivo(numero - 1)

print(factorialRecursivo(5)) # 120

# funciones de orden superior
# utilizar funciones como parámetros

# yo tengo una función procesar que tiene dos parámetros
# una función y un número
def procesar(funcion, numero):
    return funcion(numero)

def cuadrado(numero):
    return numero**2
def doble(numero):
    return numero*2

print(procesar(cuadrado,3)) # cuadrado es un parámetro
print(procesar(doble,3)) # doble es un parámetro

Más cosas de funciones

# valores predeterminador

# valores por defecto
def saludo(nombre="sin nombre"):
    return "Hola "+nombre

print(saludo("Juan"))
print(saludo())

def pvp(precio,iva=.21):
    return precio*(1+iva)

print(pvp(100,.21))
print(pvp(100))
print(pvp(100,.04))

# parámetros arbitrarios

def suma(a,b):
    return a+b

print(suma(8,5))

# al poner *args en args se guarda una lista con todos los parámetros que le pasemos
def sumaVariable(*args):
    suma=0
    for valor in args:
        suma+=valor
    return suma

print(sumaVariable(1,2,3))
print(sumaVariable(1,2,3,4,5,6,7))
print(sumaVariable())

# crear una función mayorNumero a la que le pasemos un número variable de argumentos
# y nos devuelva el mayor de todos ellos

def mayorNumero(*args):
    mayor=args[0]
    # recorriendo la lista
    for valor in args:
        # y si el elemento que estoy mirando es mayor que el que tengo me quedo con el
        if valor>mayor:
            mayor=valor
    return mayor

print(mayorNumero(1,6,4,3)) #6
print(mayorNumero(-1,-6,-4,-3)) #-1
print(mayorNumero(1,6,4,30,100,20,1000,59,1)) #1000




Soluciones ejercicios

# Quiero una función menor a la que le pasamos dos números y nos devuelve el más pequeño
# menor(1,8)-> 1 menor(10,2)->2  menor(8,8)->8

def menor1version(num1, num2):
    # si el numero 1 es menor que el numero 2 devuelvo el numero 1
    if num1 < num2:
        return num1
    # si el numero 2 es menor que el numero 1 devuelvo el numero 2
    if num2 < num1:
        return num2
    # si son iguales da igual cual devolvamos porque son iguales
    return num1


# refactorizar: mejorar el código
def menor(num1, num2):
    if num1 < num2:
        return num1
    else:
        return num2


print(menor(1, 8))  # 1
print(menor(10, 2))  # 2
print(menor(8, 8))  # 8


# Quiero una función a la que le paso una cadena y un numero y nos devuelve la cadena
# repetida tantas veces como el número
# repetirCadena("Ana",3)->"AnaAnaAna"  repetirCadena("qw",5)->"qwqwqwqwqw"

def repetirCadena(cadena, numero):
    res = ""
    for i in range(numero):
        res += cadena
    return res

print(repetirCadena("Ana", 3))  # "AnaAnaAna"
print(repetirCadena("qw", 5))  # "qwqwqwqwqw"