Categoría: Python

  • 1.1 – Primeros pasos con variables

    1.1 – Primeros pasos con variables

    Primeros pasos con variables

    Python es un lenguaje no tipado. Por tanto, no es necesario (ni posible) definir los tipos de datos utilizados al declarar variables.

    En general, en Python las variables se declaran en el momento en el que éstas van a usarse, por lo que la declaración va acompañada del valor que se asigna.

     # El siguiente es un ejemplo de declaración de una variable.
    a = 10
    print("'a' vale:")
    print(a)
    print("")
    
    a = "abcd"
    print("Ahora 'a' vale:")
    print(a)

    Tipos de datos básicos (primitivos):

    – int: Números enteros, positivos o negativos.
    Ejemplo:

    x = 10
    y = -5

    – float: Números decimales.
    Ejemplo:

    pi = 3.14159

    – complex: Números complejos (con parte real e imaginaria).
    Ejemplo:

    z = 2 + 3j

    – bool: Valores lógicos: True o False.
    Ejemplo:

    is_active = True

    – str: Cadenas de texto.
    Ejemplo:

    name = "Python"

    Tipos de datos compuestos (colecciones):

    – list: Lista ordenada, modificable y que puede contener elementos heterogéneos.
    Ejemplo:

    numbers = [1, 2, 3, 4]

    – tuple: Tupla ordenada, inmutable y que puede contener elementos heterogéneos.
    Ejemplo:

    coordinates = (10, 20)

    – dict: Diccionarios, que almacenan pares clave-valor.
    Ejemplo:

    person = {"name": "Alice", "age": 25}

    Función type()

    Sin embargo es importante conocer cuál es el tipo real de los datos que estamos utilizando. Es posible conocer el tipo de cualquier variable (y objeto en general) usando la función type()

    var_1 = 100
    type(var_1)

    Respuesta: int

    var_1 = "abcd"
    type(var_1)

    Respuesta: str

    Trabajando con números

    En Python existen los siguientes tipos numéricos:

    • – integer: 10
    • – float: 10.0
    • – complex: 10+10j

    Así es como se realizan operaciones matemáticas sencillas con Python:

    # Suma
    a = 10
    b = 5
    resultado = a + b
    print(resultado) # Imprime 15

    # Resta
    a = 10
    b = 5
    resultado = a - b
    print(resultado) # Imprime 5

    # Multiplicación
    a = 10
    b = 5
    resultado = a * b
    print(resultado) # Imprime 50

    # División
    a = 10
    b = 5
    resultado = a / b
    print(resultado) # Imprime 2.0

    # Potencia
    a = 10
    b = 2
    resultado = a ** b
    print(resultado) # Imprime 100

    # Módulo (resto de la división)
    a = 10
    b = 3
    resultado = a % b
    print(resultado) # Imprime 1

    Resumen de las operaciones aritmeticas

    En Python podemos realizar varios tipos de operaciones, a continuación podemos ver algunas de ellas.

        x + y:          sum of x and y
        x - y:          difference of x and y
        x * y:          product of x and y
        z / y:          quotient of x and y
        x // y:         (floored) quotient of x and y
        x % y:          remainder of x / y
        -x:             x negated
        +x:             x unchanged
        abs(x):         absolute value or magnitude of x
        int(x):         x converted to integer
        long(x):        x converted to long integer
        float(x):       x converted to floating point
        complex(re,im): a complex number with real part re, imaginary part im. im defaults to zero.
        c.conjugate():  conjugate of the complex number c. (Identity on real numbers)
        divmod(x, y):  _math.trunc(x) the pair (x // y, x % y)
        pow(x, y):      x to the power y
        x ** y:         x to the power y
    
    Adicionalmente, los tipos int y float admiten las siguientes operaciones:
    
        math.trunc(x):  x truncated to Integral
        round(x[, n]):  x rounded to n digits, rounding ties away from zero. If n is omitted, it defaults to 0.
        math.floor(x):  the greatest integral float <= x
        math.ceil(x):   the least integral float >= x
    

    Coversión de tipos

    Si en una expresión aritmética intervienen diferentes tipos de número, Python convierte automáticamente al tipo más general, según el siguiente esquema:


    **int -> float -> complex**

    También es posible convertir tipos de manera explícita mediante casts explícitos, con la siguiente forma: {nombe_tipo}(variable)

    # Trasformación a entero
    int(12.5)
    # Trasformación a valor en coma flotante
    float(12)

    Trabajando con textos

    Tipo string (cadenas de daracteres). Strings delimitados por comillas dobles.

    cadena_a = "Hola"
    cadena_b = "Mundo"
    # Uso del operador "+" para concatenar
    print(cadena_a + " " + cadena_b)

    También es posible escribir strings multi-línea fácilmente

    string_multi_1 = "Esto es un string escrito en \
    dos líneas. En este caso el string se interpreta como una sóla línea."
    print(string_multi_1)
    string_multi_2 = '''Triples comillas: esto es también es un string escrito
    en dos líneas. En este caso se conserva la separación en líneas original.'''
    print(string_multi_2)
    string_multi_3 = """Triples comillas: Esto es también es un string escrito
    en dos líneas. En este caso se conserva la separación en líneas original."""
    print(string_multi_3)

    El resultado seria:

    Esto es un string escrito en dos líneas. En este caso el string se interpreta como una sóla línea.
    Triples comillas: esto es también es un string escrito
    en dos líneas. En este caso se conserva la separación en líneas original.
    Triples comillas: Esto es también es un string escrito
    en dos líneas. En este caso se conserva la separación en líneas original.
            

    Algunos caracteres deben ser ‘escapados’ para poder incluirse en un string. Los más frecuentes son los siguientes:

       Character  Hexadecimal    Description
        \a	       0x07           Bell or alert
        \b	       0x08           Backspace
        \cx	                      Control-x
        \C-x	 	              Control-x
        \e	       0x1b	          Escape
        \f	       0x0c	          Formfeed
        \M-\C-x	 	              Meta-Control-x
        \n	       0x0a           Newline
        \nnn	 	              Octal notation, where n is in the range 0.7
        \r	       0x0d	          Carriage return
        \s	       0x20	          Space
        \t	       0x09	          Tab
        \v	       0x0b	          Vertical tab
        \x	 	                  Character x
        \xnn	 	              Hexadecimal notation, where n is in the range 0.9, a.f, or A.F
            

    Python es muy versatil a la hora de usar operadores, en el caso de los textos podemos aplicar lógica a la propia cadena String

        +         Concatenation - Adds values on either side of the operator
        *         Repetition - Creates new strings, concatenating multiple copies of the same string
        []        Slice - Gives the character from the given index
        [ : ]     Range Slice - Gives the characters from the given range
        in        Membership - Returns true if a character exists in the given string
        not in    Membership - Returns true if a character does not exist in the given string
        r/R       Raw String - Suppresses actual meaning of Escape characters. The syntax for raw strings is exactly     
                  the same as for normal strings with the exception of the raw string operator, the letter "r," which
                  precedes the quotation marks.
                  The "r" can be lowercase (r) or uppercase (R) and must be placed immediately preceding the first Ç
                  quote mark.
        f         Format - Performs String formatting
            

    Ejemplos:

      "HOLA " * 5
                    #->HOLA HOLA HOLA HOLA HOLA
               "J" not in "HOLA"
                    #-> True
               name = "Antonio"
                f"Mi nombre es {name}"
                    #-> Mi nombre es Antonio
    

    Lectura por Teclado con Python

    El comando input() en Python se utiliza para tomar entradas del usuario durante la ejecución de un programa. Permite pausar el programa y esperar a que el usuario ingrese texto, que luego se puede procesar o almacenar en una variable.

    input(prompt)

    prompt (opcional): Una cadena de texto que se muestra al usuario como mensaje. Es útil para indicar qué tipo de entrada se espera. Si no se proporciona, no se muestra ningún mensaje.

        valor = input()
    ------------------------
    Esto lo escribo yo mismo
    
    # Con esto puedo hacer el típico mensaje de introduce un valor:
    
    numero = input("Introduce un numero: ")
    
    # De esta manera al usuario le aparecerá el mensaje de Introduce un valor
    ------------------------
    Introduce un numero: 50
    ------------------------
    
    # Si quiero hacer algo con el resultado obtenido de lo anterior, debo pasarle la opción int a la variable de antes:
    
    numero = int(numero)
    
    # Debo poner la variable = int(variable) y ahora ya se puede sumar o hacer lo que quiera:
    
    numero + 50
    -------------------------
    100
    -------------------------
    
    # Si el usuario pone un número decimal, tenemos que poner float, en lugar de int:
    
    numero = input("Introduce un numero con decimales: ")
    
    # Aquí abajo indico que el usuario va a introducir un número con decimales:
    
    numero = float(numero)
    -------------------------
    Introduce un numero con decimales: 12.5
    -------------------------
    
    # Y ya puedo operar con él sin problemas
    
    numero + 10
    
    # Con float puedo introducir números tanto enteros como decimales.
    -------------------------
    22.5
    -------------------------
    
    # También puedo hacer todo lo anterior en una misma línea a la vez, esta vez con número entero:
    
    numero = float( input("Introduce un número decimal o entero: "))
    
    -------------------------
    Introduce un número decimal o entero: 20
    -------------------------
    
    numero + 40
    
    -------------------------
    60.0
    -------------------------
    
    # Y ahora lo mismo pero con número decimal:
    
    numero = float( input("Introduce un número decimal o entero: "))
    
    -------------------------
    Introduce un número decimal o entero: 10.5
    -------------------------
    
    numero + 40
    
    # Como vemos con lo anterior, tenemos la opción de usar números enteros y decimales
    
    -------------------------
    50.5
    -------------------------
    
    # También puedo hacer esto con nombres; y la variable Mario se me guarda en nombre
    
    nombre = input("Introduce tu nombre: ")
    
    -------------------------
    Introduce tu nombre: Mario
    -------------------------
    
    nombre = input("Introduce tu nombre ")
    apellido = input("Introduce tu apellido ")
    edad = int(input("Introduce tu edad ")) # Para número entero
    estatura = float(input("Introduce tu estatura ")) # Para número decimal
    
    -------------------------
    Introduce tu nombre Mario
    Introduce tu apellido Álvarez
    Introduce tu edad 26
    Introduce tu estatura 1.77
    -------------------------
       

    Ejercicios

    Ejercicio 1: Crea tres variables: una que guarde tu nombre, otra tu edad, y otra tu ciudad. Imprime los valores con un mensaje como:
    «Hola, mi nombre es [nombre], tengo [edad] años y vivo en [ciudad].»

    Ejercicio 2: Declara una variable con tu edad. Luego usa esta variable para calcular cuántos días, horas y minutos has vivido (aproximadamente).

        Ejemplo:
        Días: edad * 365
        Horas: días * 24
        Minutos: horas * 60

    Ejercicio 3: Escribe un programa que pida al usuario su nombre y su comida favorita. Luego imprime un mensaje como:
    «Hola [nombre], me alegra saber que te gusta [comida favorita].»

    Ejercicio 4: Declara una variable de cada tipo:

    • Un número entero (int), por ejemplo, 42.
    • Un número decimal (float), por ejemplo, 3.14.
    • Una cadena de texto (str), por ejemplo, «Hola».
    • Un valor booleano (bool), por ejemplo, True.
    • Imprime el valor y el tipo de cada variable con type().
  • 1.2 – Estructuras condicionales en Python

    1.2 – Estructuras condicionales en Python

    Un programa sin decisiones es como un robot que solo sabe caminar recto hasta chocar contra una pared. Las estructuras condicionales permiten que el programa observe, compare, evalúe… y elija. Son el mecanismo que controla el flujo de ejecución, es decir, el orden en que el programa ejecuta instrucciones.

    En términos simples:

    Si ocurre A → haz X
    Si no ocurre A → haz Y

    Ese pequeño esquema es el corazón de casi todo software: validaciones, menús, videojuegos, seguridad, IA, redes, sistemas operativos… todo decide constantemente.


    ¿Qué es una condición?

    Una condición es una expresión que solo puede ser:

    • True (verdadero)
    • False (falso)

    Ejemplos:

    5 > 3        # True
    10 == 2 # False
    "hola" == "hola" # True

    Python evalúa la condición, y dependiendo del resultado, ejecuta o no un bloque de código.


    1. Condicional simple (if)

    Ejecuta código solo si la condición es verdadera.

    if condición:
    bloque_de_codigo

    Ejemplo:

    edad = 18
    if edad >= 18:
        print("Eres mayor de edad.")

    Si la condición es falsa, no ocurre nada. El programa sigue.


    2. Condicional con alternativa (if – else)

    Aquí el programa tiene dos caminos posibles.

    if condición:
    bloque_si_verdadero
    else:
    bloque_si_falso

    Ejemplo:

    edad = 16
    if edad >= 18:
        print("Eres mayor de edad.")
    else:
        print("Eres menor de edad.")

    Solo uno de los bloques se ejecuta. Nunca ambos.


    3. Condicional múltiple (if – elif – else)

    Cuando el universo tiene más de dos posibilidades.

    if condición1:
    bloque1
    elif condición2:
    bloque2
    elif condición3:
    bloque3
    else:
    bloque_final

    Python evalúa en orden. En cuanto encuentra una condición verdadera, ejecuta su bloque y sale.

    Ejemplo:

    temperatura = 30
    if temperatura > 30:
        print("Hace mucho calor.")
    elif temperatura > 20:
        print("El clima es agradable.")
    else:
        print("Hace frío.")

    Aquí, aunque 30 > 20 también es cierto, no se evalúa porque ya se encontró una condición válida antes.


    4. Condicionales anidadas

    Una decisión dentro de otra decisión. Como una caja dentro de otra caja.

    edad = 20
    tiene_identificacion = True
    if edad >= 18:
        if tiene_identificacion:
            print("Puedes ingresar.")
        else:
            print("Necesitas identificación.")
    else:
        print("Eres menor de edad.")

    Cuidado: demasiada anidación convierte el código en un laberinto. Cuando un if parece una pirámide… algo se puede simplificar.


    Cómo piensa Python: valores «Truth» y «Falsey»

    No todo en Python es literalmente True o False. Algunos valores se consideran falsos automáticamente:

    Falsos:

    • False
    • 0
    • None
    • "" (cadena vacía)
    • [] (lista vacía)
    • {} (diccionario vacío)

    Ejemplo:

    nombre = ""
    if nombre:
        print("Hay nombre")
    else:
        print("Está vacío")

    Resultado → "Está vacío"

    Python interpreta vacío = falso. Esto es muy poderoso y muy peligroso si no se entiende.


    Operadores en condiciones

    Operadores de comparación

    Comparan valores.

    • == igual
    • != distinto
    • < menor
    • > mayor
    • <= menor o igual
    • >= mayor o igual
    if 10 >= 5:
    print("Sí")

    Operadores lógicos

    Permiten combinar condiciones.

    • and → ambas deben ser verdaderas
    • or → al menos una verdadera
    • not → invierte el resultado
    edad = 20
    tiene_id = True
    if edad >= 18 and tiene_id:
        print("Acceso permitido")

    Operadores de pertenencia

    Comprueban si algo está dentro de algo.

    • in
    • not in
    if "a" in "python":
    print("Contiene la letra a")

    ¿Por qué Python no tenía switch?

    Históricamente Python prefería simplicidad. if-elif-else cubría el caso. Pero… desde Python 3.10 existe:

    match-case (el “switch” moderno)

    opcion = 2match opcion:
    case 1:
    print("Opción 1")
    case 2:
    print("Opción 2")
    case 3:
    print("Opción 3")
    case _:
    print("Opción no válida")

    Más limpio cuando hay muchas opciones. Especialmente útil en menús, parsers, interpretes, juegos…


    Buenas prácticas

    1. Evita condiciones innecesarias
    # MAL
    if activo == True:# BIEN
    if activo:
    1. Evita anidar demasiado
    2. Usa nombres claros en variables
    3. Ordena condiciones de más específica a más general
    4. Piensa en todos los casos posibles (incluido el inesperado)

    Ejercicios

    Bloque 1 — Fundamentos del if

    Ejercicio 1
    Pide un número. Si es mayor que 10, muestra mensaje.

    Ejercicio 2
    Pide edad. Mayor o igual 18 → mayor de edad, si no → menor.

    Ejercicio 3
    Número positivo / negativo / cero.


    Bloque 2 — Comparaciones

    Ejercicio 4
    Comparar dos números.

    Ejercicio 5
    Número dentro de rango 1–100.


    Bloque 3 — Lógica y condiciones

    Ejercicio 6
    Detectar vocal.

    Ejercicio 7
    Número → día de la semana.


    Bloque 4 — Aplicación práctica

    Ejercicio 8
    Validar contraseña "secreto123".

    Ejercicio 9
    Clasificar temperatura:

    • ≥ 30 → calor
    • 10–29 → templado
    • < 10 → frío

    Ejercicio 10
    Precio > 1000 → aplicar 10% descuento.


    Bloque 5 — Nivel mental superior (nuevos)

    Ejercicio 11 — Login limitado
    Pide usuario y contraseña.
    Si usuario = "admin" y contraseña correcta → acceso.
    Si falla 3 veces → bloqueado.

    Ejercicio 12 — Número par, impar o múltiplo de 5

    Ejercicio 13 — Año bisiesto

    Regla:

    • divisible por 4
    • no divisible por 100
    • salvo que sea divisible por 400

    Ejercicio 14 — Simulador de menú

    Mostrar:

    1. Ver perfil
    2. Cambiar contraseña
    3. Salir

    Usar match o if.

    Ejercicio 15 — Detector de fuerza de contraseña

    • < 6 → débil
    • 6–10 → media
    • 10 + número → fuerte
  • 1.3  – Colecciones

    1.3 – Colecciones

    Las colecciones en Python son estructuras de datos diseñadas para almacenar grupos de información y manipularlos de forma eficiente. Son el equivalente a cajas especializadas: algunas mantienen el orden, otras eliminan duplicados, otras asocian claves con valores.

    Python ofrece cuatro colecciones fundamentales:

    • Listas (list) → secuencias ordenadas y modificables
    • Tuplas (tuple) → secuencias ordenadas e inmutables
    • Conjuntos (set) → colecciones sin duplicados
    • Diccionarios (dict) → pares clave-valor

    Elegir bien la colección correcta es una habilidad esencial. No es solo sintaxis: es pensamiento estructurado.


    Listas (list)

    Una lista es una colección ordenada y modificable que permite duplicados.

    • Mantienen el orden de inserción
    • Son mutables (se pueden modificar)
    • Permiten duplicados
    • Admiten cualquier tipo de dato

    Crear y usar listas

    mi_lista = [1, 2, 3, 4, 5]print(mi_lista[0])      # 1
    print(mi_lista[-1]) # 5

    Modificar elementos

    mi_lista[1] = 10
    print(mi_lista)

    Añadir elementos

    mi_lista.append(6)      # Añade al final
    mi_lista.insert(0, 99) # Inserta en posición

    Eliminar elementos

    mi_lista.remove(10)     # Elimina por valor
    mi_lista.pop() # Elimina último
    del mi_lista[0] # Elimina por índice

    Slicing (rebanado)

    numeros = [10,20,30,40,50]print(numeros[1:4])   # [20,30,40]
    print(numeros[:3]) # [10,20,30]
    print(numeros[::2]) # [10,30,50]

    List Comprehension (forma elegante)

    cuadrados = [x**2 for x in range(6)]
    print(cuadrados)

    Tuplas (tuple)

    Una tupla es una colección ordenada e inmutable. Una vez creada, no cambia.

    • Ordenadas
    • Inmutables
    • Permiten duplicados
    • Más eficientes y seguras que listas

    Uso típico: datos constantes

    coordenadas = (10.0, 20.0)
    print(coordenadas[0])

    Desempaquetado

    x, y = coordenadas
    print(x, y)

    Tupla de un solo elemento (detalle raro)

    t = (5,)   # sin coma NO es tupla

    Conjuntos (set)

    Un set es una colección sin orden y sin duplicados. Perfecta para matemáticas y limpieza de datos.

    • No ordenados
    • No permiten duplicados
    • Mutables
    • Muy rápidos en búsquedas

    Crear y usar sets

    s = {1,2,3,4}
    s.add(5)
    s.remove(2)

    Operaciones matemáticas

    a = {1,2,3}
    b = {2,3,4}print(a | b) # Unión
    print(a & b) # Intersección
    print(a - b) # Diferencia
    print(a ^ b) # Diferencia simétrica

    Eliminar duplicados manteniendo orden

    lista = [1,2,2,3,4,4,5]
    sin_dup = list(dict.fromkeys(lista))
    print(sin_dup)

    Diccionarios (dict)

    Un diccionario almacena pares clave → valor. Es como una base de datos en miniatura.

    • Acceso por clave
    • Mutables
    • Claves únicas
    • Muy rápidos

    Crear diccionario

    persona = {
    "nombre": "Juan",
    "edad": 25,
    "ciudad": "Madrid"
    }

    Acceder

    print(persona["nombre"])
    print(persona.get("edad"))

    Modificar / Añadir

    persona["edad"] = 26
    persona["profesion"] = "Ingeniero"

    Eliminar

    persona.pop("ciudad")
    del persona["edad"]

    Recorrer diccionario

    for clave, valor in persona.items():
    print(clave, valor)

    Operaciones comunes y trucos reales

    Copia

    a = [1,2,3]
    b = a.copy() # copia independiente

    Ordenar listas

    nums = [5,2,8,1]
    nums.sort()
    print(nums)ordenados = sorted(nums, reverse=True)

    Comprobar pertenencia

    if 3 in nums:
    print("Existe")

    Longitud

    len(nums)

    Comparación de colecciones

    ColecciónOrdenadaMutableDuplicadosUso típico
    ListaSecuencias generales
    TuplaNoDatos constantes
    SetNoNoEliminar duplicados
    DictSí*Claves únicasAsociación clave-valor

    *Desde Python 3.7 mantienen orden de inserción.


    Ejemplos guiados

    Acceder al tercer elemento

    numeros = [10,20,30,40,50]
    tercer = numeros[2]
    print(tercer)

    Último elemento de una tupla

    colores = ("rojo","verde","azul")
    print(colores[-1])

    Eliminar duplicados

    nums = [1,2,2,3,4,4,5]
    print(list(set(nums)))

    Añadir clave a diccionario

    persona = {"nombre":"Ana","edad":30}
    persona["ciudad"] = "Barcelona"
    print(persona)

    Ejercicios

    Listas

    1. Crea una lista del 1 al 5 y muestra primero y último.
    2. Cambia «pera» por «uva» en ["manzana","pera","naranja"].
    3. Añade tres números a [10,20,30].

    Tuplas

    1. Crea tupla con tres ciudades.
    2. Extrae el segundo valor de (100,200,300).
    3. Crea tupla vacía y explica cómo añadir valores.

    Sets

    1. Crea {1,2,3} y añade 4.
    2. Comprueba si 5 está en {1,2,3,4}.
    3. Intersección {1,2,3} y {2,3,4}.

    Diccionarios

    1. Crea diccionario con nombre, edad y ciudad.
    2. Cambia un valor.
    3. Elimina una clave.
  • 1.4 – ¿Qué es una lista?

    1.4 – ¿Qué es una lista?

    Una lista en Python es una estructura de datos ordenada, mutable y que permite duplicados.

    Ordenada significa que mantiene el orden en el que insertas los elementos.
    Mutable significa que puedes modificarla después de crearla.
    Permite duplicados significa que puede contener el mismo valor varias veces.

    Es la colección más utilizada en Python.


    Crear una lista

    mi_lista = [1, 2, 3, 4, 5]

    También se puede crear vacía:

    mi_lista = []

    O usando el constructor:

    mi_lista = list((1, 2, 3))

    Características fundamentales

    • Mantienen el orden de inserción
    • Permiten cualquier tipo de dato
    • Admiten tipos mezclados
    • Son dinámicas (crecen y decrecen en tiempo de ejecución)
    mezcla = [1, "hola", 3.14, True]

    Acceso a elementos

    Por índice

    mi_lista = [10, 20, 30, 40]
    print(mi_lista[0])   # 10
    print(mi_lista[-1])  # 40 (último elemento)

    Los índices negativos cuentan desde el final.


    Rebanado (Slicing)

    numeros = [10, 20, 30, 40, 50]
    print(numeros[1:4])   # [20, 30, 40]
    print(numeros[:3])    # [10, 20, 30]
    print(numeros[::2])   # [10, 30, 50]

    Formato general:

    lista[inicio:fin:paso]


    Métodos útiles para listas

    1. Agregar elementos

    append(x)

    Añade un elemento al final.

    mi_lista.append(6)

    insert(i, x)

    Inserta en una posición específica.

    mi_lista.insert(2, 99)

    extend(iterable)

    Añade varios elementos.

    mi_lista.extend([7, 8, 9])

    Diferencia clave:

    a = [1,2]
    a.append([3,4]) # [1,2,[3,4]]
    a.extend([3,4]) # [1,2,3,4]

    2. Eliminar elementos

    remove(x)

    Elimina el primer elemento con ese valor.

    mi_lista.remove(99)

    Si el valor no existe, produce error.


    pop(i)

    Elimina y devuelve el elemento.

    mi_lista.pop()     # elimina último
    mi_lista.pop(2) # elimina posición 2

    clear()

    Vacía la lista.

    mi_lista.clear()

    3. Búsqueda

    index(x)

    Devuelve el índice del primer valor encontrado.

    mi_lista.index(42)

    count(x)

    Cuenta repeticiones.

    mi_lista.count(42)

    4. Ordenar y revertir

    sort()

    Ordena la lista en el lugar.

    mi_lista.sort()
    mi_lista.sort(reverse=True)

    sorted()

    Devuelve nueva lista ordenada.

    nueva = sorted(mi_lista)

    reverse()

    Invierte el orden.

    mi_lista.reverse()

    Ordenar con criterio (key)

    palabras = ["python", "java", "c"]
    palabras.sort(key=len)
    print(palabras)

    Ordena por longitud.


    5. Copiar listas

    copy()

    copia = mi_lista.copy()

    O usando slicing:

    copia = mi_lista[:]

    ⚠ Error común:

    a = [1,2,3]
    b = a # NO es copia, es referencia

    Ambas variables apuntan al mismo objeto.


    Funciones útiles con listas

    len(mi_lista)
    sum(mi_lista)
    min(mi_lista)
    max(mi_lista)

    Convertir iterable en lista:

    list(range(5))

    List Comprehension (forma avanzada y elegante)

    Permite crear listas de manera compacta.

    cuadrados = [x**2 for x in range(6)]
    print(cuadrados)

    Con condición:

    pares = [x for x in range(10) if x % 2 == 0]

    Recorrer listas

    Forma clásica

    for elemento in mi_lista:
    print(elemento)

    Con índice

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

    Con enumerate (mejor práctica)

    for i, valor in enumerate(mi_lista):
    print(i, valor)

    Listas anidadas (matrices)

    matriz = [
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ]
    print(matriz[1][2])   # 6

    Ejemplo práctico completo

    mi_lista = [3, 1, 4, 1, 5, 9]mi_lista.append(2)
    mi_lista.sort()
    mi_lista.remove(1)print(mi_lista)

    Salida:

    [1, 2, 3, 4, 5, 9]


    Errores comunes

    • Intentar acceder a un índice inexistente
    • Confundir append con extend
    • Copiar listas con asignación directa
    • Modificar lista mientras se recorre

    Ejemplo problemático:

    for x in mi_lista:
    mi_lista.remove(x) # mala práctica

    Cuándo usar listas

    Usa listas cuando:

    • Necesites orden
    • Necesites permitir duplicados
    • Vayas a modificar frecuentemente los datos
    • Necesites indexación

    Métodos principales de las listas en Python

    MétodoQué haceEjemploResultado
    append(x)Añade un elemento al finallista.append(5)[1,2,3,5]
    insert(i, x)Inserta en posición específicalista.insert(1, 9)[1,9,2,3]
    extend(iterable)Añade varios elementoslista.extend([4,5])[1,2,3,4,5]
    remove(x)Elimina el primer valor encontradolista.remove(2)[1,3,4]
    pop()Elimina y devuelve el últimolista.pop()devuelve 4
    pop(i)Elimina por índicelista.pop(1)elimina posición 1
    clear()Vacía la listalista.clear()[]
    index(x)Devuelve índice del valorlista.index(3)2
    count(x)Cuenta repeticioneslista.count(2)1
    sort()Ordena la listalista.sort()[1,2,3]
    sort(reverse=True)Orden descendentelista.sort(reverse=True)[3,2,1]
    reverse()Invierte el ordenlista.reverse()[3,2,1]
    copy()Copia superficialnueva = lista.copy()nueva lista independiente

    Funciones útiles (no son métodos, pero se usan siempre)

    FunciónQué haceEjemplo
    len(lista)Tamaño de la listalen(lista)
    sum(lista)Suma elementossum(lista)
    min(lista)Valor mínimomin(lista)
    max(lista)Valor máximomax(lista)
    sorted(lista)Devuelve lista ordenadasorted(lista)
    list(iterable)Convierte iterable en listalist(range(5))

    Diferencia clave que suele confundir

    a = [1,2]
    a.append([3,4]) # [1,2,[3,4]]
    a.extend([3,4]) # [1,2,3,4]

    append mete un objeto, extend mete elementos.


    Ejercicios

    1. Crea una lista con los números del 1 al 10 y muestra solo los pares.
    2. Ordena una lista de palabras por su longitud.
    3. Elimina todos los duplicados manteniendo el orden.
    4. Crea una matriz 3×3 e imprime la diagonal principal.
    5. Genera una lista con los cubos de los números del 1 al 20 usando list comprehension.

  • 1.5 – ¿Qué es una tupla?

    1.5 – ¿Qué es una tupla?

    Las tuplas son criaturas curiosas del ecosistema Python. Parecen listas… pero no lo son. Son inmutables, compactas y muy seguras. Cuando algo en tu programa no debe cambiar jamás, una tupla es la cápsula criogénica perfecta.


    Una tupla (tuple) es una colección ordenada e inmutable de elementos.

    • Ordenada → mantiene el orden de inserción
    • Inmutable → no se puede modificar tras crearla
    • Permite duplicados
    • Puede contener distintos tipos

    La inmutabilidad las hace más rápidas, más seguras y más ligeras que las listas.


    Crear una tupla

    mi_tupla = (1, 2, 3, 4, 5)

    También se puede crear sin paréntesis:

    mi_tupla = 1, 2, 3, 4, 5

    Tupla vacía:

    vacia = ()

    Tuplas de un solo elemento

    Detalle clásico que rompe cerebros:

    tupla = (42,)   # Correcto
    no_tupla = (42) # Es un entero, NO una tupla

    La coma es obligatoria.


    Acceso a elementos

    Por índice

    t = (10, 20, 30, 40)
    print(t[0])    # 10
    print(t[-1])   # 40

    Slicing (rebanado)

    t = (10, 20, 30, 40, 50)
    print(t[1:4])   # (20, 30, 40)
    print(t[:3])    # (10, 20, 30)
    print(t[::2])   # (10, 30, 50)

    El slicing devuelve otra tupla.


    Métodos de las tuplas

    Las tuplas tienen pocos métodos porque no se pueden modificar.

    count(x)

    Cuenta cuántas veces aparece un valor.

    t = (1,2,3,2,2)
    print(t.count(2)) # 3

    index(x)

    Devuelve la posición del primer valor encontrado.

    t = (10,20,30,40)
    print(t.index(30)) # 2

    Si no existe → error.


    Funciones útiles con tuplas

    t = (10,20,30,40)
    len(t)   # tamaño
    min(t)   # mínimo
    max(t)   # máximo
    sum(t)   # suma (si numéricos)

    Concatenar y repetir tuplas

    Concatenar

    t1 = (1,2,3)
    t2 = (4,5,6)t3 = t1 + t2
    print(t3)

    Repetir

    t = (1,2,3)
    print(t * 2)

    Convertir entre lista y tupla

    Las tuplas no se pueden modificar, pero puedes convertirlas:

    t = (10,20,30)lista = list(t)
    lista.append(40)t = tuple(lista)
    print(t)

    Este es el truco clásico para “modificar” tuplas.


    Desempaquetado de tuplas

    Una de sus habilidades más elegantes.

    t = (10, 20, 30)a, b, c = t
    print(a, b, c)

    Desempaquetado extendido

    t = (1,2,3,4,5)a, *medio, b = t
    print(a) # 1
    print(medio) # [2,3,4]
    print(b) # 5

    Python convierte automáticamente el resto en lista.


    Verificar pertenencia

    t = (10,20,30)print(20 in t)   # True
    print(99 in t) # False

    Recorrer tuplas

    for valor in (1,2,3):
    print(valor)

    Con índice:

    t = (10,20,30)for i, v in enumerate(t):
    print(i, v)

    Por qué usar tuplas

    Usa tuplas cuando:

    • Los datos no deben cambiar
    • Quieres seguridad frente a modificaciones accidentales
    • Necesitas mejor rendimiento
    • Quieres usar datos como claves en diccionarios (las listas no pueden)

    Ejemplo real:

    coordenada = (40.4168, -3.7038)

    Diferencia clave: lista vs tupla

    CaracterísticaListaTupla
    MutableNo
    VelocidadMás lentaMás rápida
    MemoriaMásMenos
    MétodosMuchosPocos
    SeguridadBajaAlta

    Errores comunes

    Intentar modificar una tupla:

    t = (1,2,3)
    t[0] = 9 # TypeError

    Olvidar la coma en tupla de un elemento.


    Ejemplo práctico

    mi_tupla = (10, 20, 30, 40, 50)print(mi_tupla[1])
    print(mi_tupla.index(30))
    print(mi_tupla.count(20))lista = list(mi_tupla)
    lista.append(60)mi_tupla = tuple(lista)
    print(mi_tupla)

    Salida:

    (10, 20, 30, 40, 50, 60)

    Métodos principales de las tuplas en Python

    MétodoQué haceEjemploResultado
    count(x)Cuenta cuántas veces aparece un valor(1,2,2,3).count(2)2
    index(x)Devuelve el índice del primer valor encontrado(10,20,30).index(20)1

    Funciones útiles con tuplas

    (No son métodos propios de la tupla, pero se usan constantemente)

    FunciónQué haceEjemploResultado
    len(t)Número de elementoslen((1,2,3))3
    min(t)Valor mínimomin((5,2,9))2
    max(t)Valor máximomax((5,2,9))9
    sum(t)Suma de elementos numéricossum((1,2,3))6
    sorted(t)Devuelve lista ordenadasorted((3,1,2))[1,2,3]
    tuple(iterable)Convierte iterable a tuplatuple([1,2,3])(1,2,3)
    list(t)Convierte tupla a listalist((1,2,3))[1,2,3]

    Operaciones comunes con tuplas

    OperaciónQué haceEjemploResultado
    t1 + t2Concatenar tuplas(1,2) + (3,4)(1,2,3,4)
    t * nRepetir tupla(1,2) * 2(1,2,1,2)
    x in tVerificar pertenencia2 in (1,2,3)True
    x not in tVerificar ausencia9 in (1,2,3)False

    Recordatorio importante

    Las tuplas no tienen métodos para modificar datos porque son inmutables:

    • No append
    • No remove
    • No insert
    • No pop
    • No sort

    Si necesitas modificar → convierte a lista, modifica, y vuelve a tupla.


    Ejercicios

    1. Crea una tupla con 5 números y muestra el primero y último.
    2. Cuenta cuántas veces aparece un número repetido.
    3. Convierte una tupla a lista, añade un valor y vuelve a tupla.
    4. Usa desempaquetado para guardar los valores en variables.
    5. Crea una tupla de coordenadas y verifica si contiene cierto valor.
  • 1.6 – ¿Qué es un conjunto? (set)

    1.6 – ¿Qué es un conjunto? (set)

    Un set es una colección desordenada, mutable y sin elementos duplicados.

    • No mantiene orden
    • No permite duplicados
    • Es mutable
    • Permite operaciones matemáticas (unión, intersección, diferencia)
    • Muy eficiente en búsquedas

    Crear un conjunto

    mi_conjunto = {1, 2, 3, 4, 5}

    También usando el constructor:

    mi_conjunto = set([1, 2, 3, 4, 5])

    Conjunto vacío

    {} crea un diccionario, no un set.

    conjunto_vacio = set()

    Características importantes

    • No tienen índices
    • No permiten slicing
    • No mantienen orden
    • Solo aceptan elementos inmutables (no listas, no diccionarios)
    # Esto da error
    mi_set = {[1,2,3]}

    Métodos principales

    Agregar elementos

    s = {1,2,3}
    s.add(4)

    Eliminar elementos

    remove(x)

    Error si no existe.

    s.remove(2)

    discard(x)

    No error si no existe.

    s.discard(10)

    pop()

    Elimina elemento aleatorio.

    s.pop()

    clear()

    s.clear()

    Operaciones matemáticas de conjuntos

    Sean:

    a = {1,2,3}
    b = {3,4,5}

    Unión (elementos de ambos)

    a | b
    a.union(b)

    Resultado → {1,2,3,4,5}


    Intersección (elementos comunes)

    a & b
    a.intersection(b)

    Resultado → {3}


    Diferencia (elementos de A que no están en B)

    a - b
    a.difference(b)

    Resultado → {1,2}


    Diferencia simétrica (elementos que NO son comunes)

    a ^ b
    a.symmetric_difference(b)

    Resultado → {1,2,4,5}


    Relaciones entre conjuntos

    Subconjunto

    {1,2}.issubset({1,2,3})

    Superconjunto

    {1,2,3}.issuperset({1,2})

    Sin elementos en común

    {1,2}.isdisjoint({3,4})

    Comprobar pertenencia

    3 in {1,2,3}
    10 in {1,2,3}

    Esta operación es muy rápida (O(1)).


    Convertir entre estructuras

    Lista → Set (eliminar duplicados)

    lista = [1,2,2,3,4,4]
    sin_dup = set(lista)

    Set → Lista

    lista = list(sin_dup)

    Copiar conjuntos

    copia = mi_conjunto.copy()

    Recorrer conjuntos

    for elemento in {1,2,3}:
    print(elemento)

    El orden puede cambiar.


    Ejemplo práctico

    conjunto1 = {1,2,3,4}
    conjunto2 = {3,4,5,6}print(conjunto1 | conjunto2)
    print(conjunto1 & conjunto2)
    print(conjunto1 - conjunto2)
    print(conjunto1 ^ conjunto2)conjunto1.add(7)
    conjunto1.discard(2)print(conjunto1)

    Cuándo usar conjuntos

    Usa sets cuando:

    • Necesites eliminar duplicados
    • Quieras operaciones matemáticas
    • Necesites búsquedas rápidas
    • No importe el orden

    Errores comunes

    Intentar indexar un set:

    s = {1,2,3}
    print(s[0]) # Error

    Intentar meter listas o diccionarios dentro.


    Tabla de métodos principales

    MétodoQué haceEjemploResultado
    add(x)Añade elemento{1,2}.add(3){1,2,3}
    remove(x)Elimina (error si no existe){1,2}.remove(2){1}
    discard(x)Elimina sin error{1,2}.discard(5){1,2}
    pop()Elimina elemento aleatorio{1,2}.pop(){2} o {1}
    clear()Vacía el conjuntos.clear()set()
    union()Unióna.union(b){1,2,3,4,5}
    intersection()Interseccióna.intersection(b){3}
    difference()Diferenciaa.difference(b){1,2}
    symmetric_difference()Diferencia simétricaa.symmetric_difference(b){1,2,4,5}
    issubset()Subconjunto{1}.issubset({1,2})True
    issuperset()Superconjunto{1,2}.issuperset({1})True
    isdisjoint()Sin comunes{1}.isdisjoint({2})True
    copy()Copia superficials.copy()nuevo set

    Ejercicios

    1. Elimina duplicados de una lista usando set.
    2. Calcula intersección entre dos listas convertidas a set.
    3. Comprueba si un conjunto es subconjunto de otro.
    4. Crea dos sets y calcula diferencia simétrica.
    5. Cuenta elementos únicos en una lista grande.
  • 1.7 – ¿Qué es un diccionario?

    1.7 – ¿Qué es un diccionario?

    Un diccionario (dict) es una colección de pares clave → valor.

    • Las claves son únicas
    • Son mutables
    • Permiten acceso rápido por clave
    • Desde Python 3.7 mantienen el orden de inserción

    Un diccionario es como una base de datos en miniatura.


    Crear un diccionario

    mi_diccionario = {
    "nombre": "Juan",
    "edad": 25,
    "ciudad": "Madrid"
    }

    También se puede crear así:

    mi_diccionario = dict(nombre="Juan", edad=25)

    Diccionario vacío

    diccionario_vacio = {}

    Características importantes

    • Las claves deben ser inmutables (str, int, tuple…)
    • No pueden existir claves duplicadas
    • El acceso es muy rápido (O(1))

    Esto es inválido:

    mi_dic = {[1,2,3]: "error"}  # Las listas no pueden ser clave

    Acceso a elementos

    Acceso directo

    nombre = mi_diccionario["nombre"]

    Si la clave no existe → error.


    Usar get()

    profesion = mi_diccionario.get("profesion", "No especificada")

    Evita errores si la clave no existe.


    Modificar o agregar elementos

    mi_diccionario["edad"] = 26
    mi_diccionario["profesion"] = "Ingeniero"

    Si la clave existe → modifica.
    Si no existe → crea.


    Eliminar elementos

    pop()

    edad = mi_diccionario.pop("edad")

    del

    del mi_diccionario["ciudad"]

    popitem()

    Elimina el último elemento añadido.

    ultimo = mi_diccionario.popitem()

    clear()

    mi_diccionario.clear()

    Consultar claves, valores y pares

    claves = mi_diccionario.keys()
    valores = mi_diccionario.values()
    items = mi_diccionario.items()

    Devuelven objetos tipo “vista”.


    Verificar si una clave existe

    "nombre" in mi_diccionario

    Copiar diccionarios

    copia = mi_diccionario.copy()

    O:

    copia = dict(mi_diccionario)

    Mezclar diccionarios

    update()

    otro = {"pais": "España", "edad": 30}
    mi_diccionario.update(otro)

    Sobrescribe si la clave ya existe.


    Operador moderno (Python 3.9+)

    nuevo = mi_diccionario | otro

    Longitud

    len(mi_diccionario)

    Iterar sobre diccionarios

    Solo claves

    for clave in mi_diccionario:
    print(clave)

    Solo valores

    for valor in mi_diccionario.values():
    print(valor)

    Clave y valor

    for clave, valor in mi_diccionario.items():
    print(clave, valor)

    Diccionarios anidados

    usuario = {
    "nombre": "Ana",
    "direccion": {
    "ciudad": "Barcelona",
    "codigo_postal": 08001
    }
    }print(usuario["direccion"]["ciudad"])

    Comprensión de diccionarios

    cuadrados = {x: x**2 for x in range(5)}
    print(cuadrados)

    Ejemplo práctico completo

    mi_diccionario = {
    "nombre": "Ana",
    "edad": 28,
    "ciudad": "Barcelona"
    }print(mi_diccionario["nombre"])mi_diccionario["edad"] = 29
    mi_diccionario["profesion"] = "Diseñadora"mi_diccionario.pop("ciudad")for clave, valor in mi_diccionario.items():
    print(f"{clave}: {valor}")

    Tabla resumen de métodos principales

    MétodoQué haceEjemploResultado
    get()Obtiene valor sin errord.get("x")valor o None
    pop()Elimina y devuelve valord.pop("edad")29
    popitem()Elimina último pard.popitem()(«clave», valor)
    clear()Vacía diccionariod.clear(){}
    keys()Devuelve clavesd.keys()vista de claves
    values()Devuelve valoresd.values()vista de valores
    items()Devuelve paresd.items()vista de tuplas
    update()Mezcla diccionariosd.update(otro)dic actualizado
    copy()Copia superficiald.copy()nuevo dict

    Cuándo usar diccionarios

    Usa diccionarios cuando:

    • Necesites acceso rápido por clave
    • Quieras representar datos estructurados
    • Trabajes con JSON
    • Simules registros o entidades

    Errores comunes

    • Intentar acceder a clave inexistente sin usar get()
    • Usar listas como claves
    • Confundir claves con valores
  • 1.8 – Bucles

    1.8 – Bucles

    Un bucle es una estructura que repite un bloque de código.

    En Python, usamos bucles para:

    • recorrer colecciones (listas, tuplas, sets, diccionarios, strings)
    • repetir acciones varias veces
    • ejecutar código hasta que se cumpla una condición
    • buscar elementos
    • construir resultados (sumas, contadores, filtros, etc.)

    Los dos bucles principales en Python son:

    • for → cuando recorres una secuencia/iterable o sabes “cuántas vueltas”
    • while → cuando repites mientras una condición sea verdadera (número de vueltas “desconocido”)

    1) Bucle for

    for recorre un iterable (lista, tupla, cadena, rango, diccionario, etc.)

    Recorrer una lista

    for elemento in [1, 2, 3, 4]:
    print(elemento)

    Recorrer un rango

    for i in range(5):   # 0,1,2,3,4
    print(i)

    Recorrer una cadena

    palabra = "Python"
    for letra in palabra:
    print(letra)

    1.1) range()

    range() genera números sin crear una lista enorme en memoria.

    • range(fin) → 0 … fin-1
    • range(inicio, fin) → inicio … fin-1
    • range(inicio, fin, paso) → saltos controlados
    for i in range(1, 11):
    print(i) # 1..10
    for i in range(10, 0, -1):
    print(i) # 10..1

    1.2) Recorrer con índice: enumerate()

    Cuando necesitas índice + valor, enumerate() es la forma correcta.

    nombres = ["Ana", "Luis", "Carlos"]for indice, nombre in enumerate(nombres):
    print(indice, nombre)

    Empezar desde 1 (muy útil para menús):

    for i, nombre in enumerate(nombres, start=1):
    print(i, nombre)

    1.3) Recorrer varias listas a la vez: zip()

    nombres = ["Ana", "Luis", "Carlos"]
    edades = [20, 25, 30]for nombre, edad in zip(nombres, edades):
    print(nombre, edad)

    2) Bucle while

    while repite mientras la condición sea verdadera.

    Contador simple

    contador = 0
    while contador < 5:
    print(contador)
    contador += 1

    Se usa mucho en:

    • validación de entrada (pedir hasta que sea correcto)
    • menús
    • bucles “hasta encontrar algo”
    • juegos (adivina el número)
    • lectura de datos hasta fin

    3) Control del bucle: break, continue, pass

    break (romper el bucle)

    for n in range(10):
    if n == 5:
    break
    print(n)

    continue (saltar a la siguiente vuelta)

    for n in range(10):
    if n % 2 != 0:
    continue
    print(n) # solo pares

    pass (no hacer nada, placeholder)

    for n in range(3):
    pass # "todavía no he programado esto"

    4) El else en bucles (truco ninja de Python)

    Un bucle puede tener else.
    Se ejecuta solo si NO se ha hecho break.

    Buscar un elemento

    objetivo = 7for n in [1, 3, 5, 7, 9]:
    if n == objetivo:
    print("Encontrado")
    break
    else:
    print("No encontrado")

    5) Bucles anidados

    Un bucle dentro de otro. Se usa en:

    • tablas (filas/columnas)
    • matrices
    • combinaciones
    for i in range(3):
    for j in range(2):
    print(f"i={i}, j={j}")

    Tabla de multiplicar

    numero = 5
    for i in range(1, 11):
    print(f"{numero} x {i} = {numero*i}")

    6) Iteradores: iter() y next()

    Puedes recorrer manualmente un iterable con un iterador.

    frutas = ["manzana", "banana", "cereza"]
    it = iter(frutas)print(next(it)) # manzana
    print(next(it)) # banana
    print(next(it)) # cereza

    Si te pasas, lanza StopIteration.


    7) Operadores relacionados: in y not in

    frutas = ["manzana", "banana", "cereza"]
    if "pera" not in frutas:
        print("La pera no está en la lista")

    8) Errores comunes y buenas prácticas

    Error típico: bucle infinito con while

    Si no actualizas la condición:

    # cuidado: infinito
    # while True:
    # print("hola")

    Buena práctica: evitar recorrer con índices si no hace falta

    Mejor:

    for fruta in frutas:
    print(fruta)

    En vez de:

    for i in range(len(frutas)):
    print(frutas[i])

    9) Ejemplos guiados

    Sumar lista de números

    numeros = [1, 2, 3, 4, 5]
    suma = 0for n in numeros:
    suma += nprint(suma)

    Filtrar pares

    numeros = [10, 15, 20, 25, 30]
    pares = []for n in numeros:
    if n % 2 == 0:
    pares.append(n)print(pares)

    Recorrer diccionario

    productos = {"manzana": 1.5, "banana": 0.8, "leche": 2.3}for producto, precio in productos.items():
    print(producto, precio)

    10) Ejercicios

    Bloque 1: Iterar sobre listas

    1. Dada una lista de números, calcula la suma.

    numeros = [1, 2, 3, 4, 5]

    2. Dada una lista de nombres, imprime cada nombre en mayúsculas.
    nombres = [«ana», «luis», «carlos»]

    1. Crea una lista con solo los pares.

    numeros = [10, 15, 20, 25, 30]

    Bloque 2: Iterar sobre diccionarios

    1. Imprime producto y precio.
    productos = {«manzana»: 1.5, «banana»: 0.8, «leche»: 2.3}

    1. Suma total de precios.
    2. Lista de productos cuyo precio sea mayor que 1.0.

    Bloque 3: Iterar sobre cadenas

    1. Cuenta vocales en una cadena.

    cadena = «Python es genial»

    2. Invierte una cadena con un bucle.

    cadena = «Hola Mundo»

    3. Elimina espacios y genera una nueva.

    cadena = «Hola a todos»

    Bloque 4: Índices (`range` / `enumerate`)

    1. Imprime del 1 al 10 con `range`.

    2. Tabla del 5.
    numero = 5

    3. Con enumerate, imprime índice y valor.

    frutas = [«manzana», «banana», «pera»]

    Bloque 5: `while`

    1. Imprime del 1 al 10.

    2. Pide números hasta que introduzca 0 y suma todo.

    3. Factorial con while.
    numero = 5


    Bloque 6: bucle infinito con break

    1. Contraseña correcta hasta acertar.

    contrasena_correcta = «python123»

    2. Genera aleatorios 1-10 hasta que salga > 8.
    import random

    3. Adivina número 1-20 o escribe «salir».

  • 1.9 – Patrones mentales de los bucles

    1.9 – Patrones mentales de los bucles

    1. Patrón ACUMULADOR (sumar / combinar resultados)

    Se usa cuando quieres acumular un resultado progresivamente.

    Ejemplos típicos:

    • Sumar números
    • Calcular media
    • Concatenar texto
    • Multiplicar valores

    Ejemplo: suma de una lista

    numeros = [10, 20, 30, 40]
    suma = 0   # ← acumulador
    for n in numeros:
        suma += nprint(suma)

    Idea mental:

    resultado = valor_inicial
    repetir:
    resultado = resultado + algo

    2. Patrón CONTADOR (contar ocurrencias)

    Se usa cuando quieres contar cuántas veces ocurre algo.

    Ejemplos:

    • Contar pares
    • Contar vocales
    • Contar aprobados

    Ejemplo: contar pares

    numeros = [1,2,3,4,5,6]
    contador = 0
    for n in numeros:
        if n % 2 == 0:
            contador += 1print(contador)

    Idea mental:

    contador = 0
    si ocurre algo → contador++

    3. Patrón CENTINELA (parar cuando ocurre algo)

    Se usa cuando no sabes cuántas iteraciones habrá y paras cuando aparece una condición especial.

    Muy común con while.

    Ejemplos:

    • Leer hasta introducir 0
    • Leer hasta EOF
    • Menús interactivos
    • Contraseña correcta

    Ejemplo: sumar hasta que el usuario introduzca 0

    suma = 0
    while True:
        n = int(input("Número (0 para salir): "))
        if n == 0:
            break
        suma += nprint(suma)

    Idea mental:

    repetir hasta que aparezca señal_de_parada

    La señal = centinela.


    4. Patrón BÚSQUEDA (encontrar algo)

    Se usa cuando quieres localizar un elemento.

    Ejemplos:

    • Buscar número en lista
    • Buscar palabra en texto
    • Buscar usuario en base de datos

    Ejemplo: buscar un número

    numeros = [5, 8, 3, 9, 2]
    objetivo = 9
    encontrado = False
    for n in numeros:
        if n == objetivo:
            encontrado = True
            breakprint(encontrado)

    Idea mental:

    encontrado = False
    recorrer:
    si coincide → parar

    5. Patrón FILTRADO (seleccionar algunos)

    Se usa cuando quieres quedarte solo con elementos que cumplen condición.

    Ejemplos:

    • Solo pares
    • Solo mayores de edad
    • Solo palabras largas

    Ejemplo: filtrar pares

    numeros = [1,2,3,4,5,6]
    pares = []
    for n in numeros ():
        if n % 2 == 0:
            pares.append(n)print(pares)

    Idea mental:

    resultado = []
    si cumple condición → guardar

    6. Patrón CONSTRUCCIÓN (generar algo nuevo)

    Se usa cuando quieres crear una nueva estructura a partir de otra.

    Ejemplos:

    • Crear lista de cuadrados
    • Convertir texto a lista
    • Transformar datos

    Ejemplo: cuadrados

    numeros = [1,2,3,4]
    cuadrados = []for n in numeros:
    cuadrados.append(n**2)print(cuadrados)

    Versión avanzada (list comprehension):

    cuadrados = [n**2 for n in numeros]

    Idea mental:

    resultado = []
    por cada elemento:
        transformar
        guardar

    Resumen mental

    PatrónPregunta mental
    Acumulador¿Estoy combinando resultados?
    Contador¿Estoy contando ocurrencias?
    Centinela¿Debo parar cuando pase algo?
    Búsqueda¿Estoy intentando encontrar algo?
    Filtrado¿Solo quiero algunos elementos?
    Construcción¿Estoy creando una nueva colección?

    Ejercicio de pensamiento (muy potente)

    Para cada problema, identifica primero el patrón:

    1. Sumar precios de una lista → Acumulador
    2. Contar aprobados → Contador
    3. Pedir contraseña hasta acertar → Centinela
    4. Buscar usuario → Búsqueda
    5. Quedarse con números > 10 → Filtrado
    6. Crear lista de cuadrados → Construcción
  • 1.12 – Batería de ejercicios (Con soluciones)

    1.12 – Batería de ejercicios (Con soluciones)

    Este conjunto de ejercicios en Python está organizado por bloques temáticos, y cubre los fundamentos del lenguaje de forma progresiva. Se incluyen:

    Impresión y variables: primeros pasos con print(), declaración de variables, tipos básicos (enteros, float, booleanos, cadenas).

    Funciones: creación de funciones con parámetros y valores de retorno, uso de funciones para modularizar código.

    Condicionales: uso de ifelif y else para tomar decisiones en base a condiciones.

    Bucles: implementación de bucles for y while para repetición de instrucciones.

    Colecciones: manejo de listas, tuplas, conjuntos y diccionarios. Acceso, modificación y recorrido.

    Archivos: lectura y escritura de archivos de texto utilizando open(), y comprensión básica de flujos de datos.

    Entrada de datos: uso de input() para interactuar con el usuario.

    Estos ejercicios están diseñados para estudiantes que se están iniciando en la programación, y cada script representa un problema o concepto básico resuelto de manera clara y concisa.

    Variables

    Ejercicio 1: Crea tres variables: una que guarde tu nombre, otra tu edad, y otra tu ciudad. Imprime los valores con un mensaje como:
    «Hola, mi nombre es [nombre], tengo [edad] años y vivo en [ciudad].»

    Ejercicio 2: Declara una variable con tu edad. Luego usa esta variable para calcular cuántos días, horas y minutos has vivido (aproximadamente).

        Ejemplo:
        Días: edad * 365
        Horas: días * 24
        Minutos: horas * 60

    Ejercicio 3: Escribe un programa que pida al usuario su nombre y su comida favorita. Luego imprime un mensaje como:
    «Hola [nombre], me alegra saber que te gusta [comida favorita].»

    Ejercicio 4: Declara una variable de cada tipo:

    • Un número entero (int), por ejemplo, 42.
    • Un número decimal (float), por ejemplo, 3.14.
    • Una cadena de texto (str), por ejemplo, «Hola».
    • Un valor booleano (bool), por ejemplo, True.
    • Imprime el valor y el tipo de cada variable con type().

    Condicionales

    Bloque 1: Introducción al uso de if

    1. Ejercicio 1:
      Pide al usuario un número. Si el número es mayor que 10, imprime:
      "El número es mayor que 10."
      Si no, no hagas nada.
    2. Ejercicio 2:
      Pide al usuario su edad. Si tiene 18 años o más, imprime:
      "Eres mayor de edad."
      Si tiene menos de 18, imprime:
      "Eres menor de edad."
    3. Ejercicio 3:
      Declara una variable con un número cualquiera. Si el número es positivo, imprime:
      "El número es positivo."
      Si el número es negativo, imprime:
      "El número es negativo."
      Si el número es 0, imprime:
      "El número es cero."

    Bloque 2: Operadores Comparativos

    1. Ejercicio 4:
      Pide al usuario dos números. Usa condicionales para imprimir:
      • "El primer número es mayor que el segundo."
      • "El segundo número es mayor que el primero."
      • "Ambos números son iguales."
    2. Ejercicio 5:
      Pide al usuario un número. Si el número está entre 1 y 100 (inclusive), imprime:
      "El número está dentro del rango."
      Si no, imprime:
      "El número está fuera del rango."

    Bloque 3: Uso de Condiciones Anidadas

    1. Ejercicio 6:
      Pide al usuario una letra. Si la letra es una vocal (a, e, i, o, u), imprime:
      "Es una vocal."
      Si no, imprime:
      "No es una vocal."
    2. Ejercicio 7:
      Pide al usuario un número del 1 al 7 y muestra el día de la semana correspondiente:
      • 1: Lunes
      • 2: Martes
      • 7: Domingo
        Si el número no está entre 1 y 7, imprime:
        "Número fuera de rango."

    Bloque 4: Problemas de Aplicación

    1. Ejercicio 8:
      Pide al usuario una contraseña y verifica si es igual a "secreto123". Si es correcta, imprime:
      "Acceso concedido."
      Si no, imprime:
      "Contraseña incorrecta."
    2. Ejercicio 9:
      Pide al usuario una temperatura en grados Celsius. Si la temperatura es:
      • Mayor o igual a 30: imprime "Hace calor."
      • Entre 10 y 29: imprime "El clima es templado."
      • Menor a 10: imprime "Hace frío."
    3. Ejercicio 10:
      Pide al usuario el precio de un producto. Si el precio es mayor a 1000, aplica un descuento del 10% y muestra el precio final. Si no, muestra el precio sin descuento.

    Bucles


    Bloque 1: Iterar sobre listas

    1. Dada una lista de números, calcula la suma de todos los elementos.numeros = [1, 2, 3, 4, 5]
    2. Dada una lista de nombres, imprime cada nombre en mayúsculas.nombres = ["ana", "luis", "carlos"]
    3. Crea una nueva lista que contenga solo los números pares de una lista dada.numeros = [10, 15, 20, 25, 30]

    Bloque 2: Iterar sobre diccionarios

    1. Dado un diccionario de productos y precios, imprime cada producto junto con su precio.productos = {"manzana": 1.5, "banana": 0.8, "leche": 2.3}
    2. Encuentra la suma total de los precios de los productos.
    3. Crea una lista de productos cuyo precio sea mayor que un valor dado (por ejemplo, 1.0).

    Bloque 3: Iterar sobre cadenas

    1. Dada una cadena, cuenta cuántas vocales contiene.cadena = "Python es genial"
    2. Invierte una cadena usando un bucle.cadena = "Hola Mundo"
    3. Elimina los espacios de una cadena y genera una nueva sin ellos.cadena = "Hola a todos"

    Bloque 4: Iterar con índices (range y enumerate)

    1. Usa range para imprimir los números del 1 al 10.# Salida esperada: 1, 2, ..., 10
    2. Usa range para generar una tabla de multiplicar (por ejemplo, la tabla del 5).numero = 5
    3. Usa enumerate para imprimir el índice y el valor de cada elemento en una lista.frutas = ["manzana", "banana", "pera"]

    Bloque 5: Bucle controlado por condición while

    1. Imprime los números del 1 al 10 usando un bucle while.
    2. Solicita al usuario números hasta que introduzca un 0, luego calcula la suma de los números ingresados.
    3. Dado un número, encuentra su factorial usando un bucle while.numero = 5

    Bloque 6: Bucle infinito controlado con break

    1. Simula una contraseña: solicita al usuario que introduzca una contraseña correcta hasta que lo haga bien.contrasena_correcta = "python123"
    2. Genera números aleatorios entre 1 y 10 hasta que se genere un número mayor que 8.import random
    3. Crea un programa que permita al usuario adivinar un número secreto entre 1 y 20. Termina cuando el usuario lo adivine o escriba «salir».

    Funciones

    1. Ejercicio 1: Función de resta
      • Define una función llamada restar que acepte dos parámetros y devuelva su diferencia.
      • Prueba la función con diferentes valores.
    2. Ejercicio 2: Función de saludo personalizado
      • Define una función llamada saludo_personalizado que acepte dos parámetros: nombre y edad.
      • La función debe imprimir un mensaje como «Hola, [nombre]. Tienes [edad] años.»
      • Prueba la función con diferentes valores.
    3. Ejercicio 3: Función de multiplicación
      • Define una función llamada multiplicar que acepte dos parámetros y devuelva su producto.
      • Prueba la función con diferentes valores.
    4. Ejercicio 4: Función de número par o impar
      • Define una función llamada es_par que acepte un número y devuelva True si el número es par y False si es impar.
      • Prueba la función con diferentes valores.
    5. Ejercicio 5: Función con parámetros por defecto
      • Define una función llamada saludar_con_titulo que acepte dos parámetros: nombre y titulo, con un valor por defecto para titulo.
      • La función debe imprimir un mensaje como «Hola, [titulo] [nombre].»
      • Prueba la función con y sin el parámetro titulo.
    6. Ejercicio 6: Función con *args
      • Define una función llamada promedio que acepte una cantidad arbitraria de números y devuelva su promedio.
      • Prueba la función con diferentes cantidades de argumentos.
    7. Ejercicio 7: Función con **kwargs
      • Define una función llamada imprimir_detalles que acepte una cantidad arbitraria de parámetros con nombre y los imprima en formato clave-valor.
      • Prueba la función con diferentes conjuntos de parámetros.

    Trabajando con Archivos

    1. Lectura de contenido: Crea un programa que lea el contenido de un archivo llamado notas.txt y lo imprima en la consola.
    2. Contar líneas: Escribe un programa que cuente cuántas líneas tiene un archivo de texto llamado poema.txt.
    3. Buscar palabra: Diseña un programa que busque una palabra dada por el usuario dentro de un archivo llamado articulo.txt e indique cuántas veces aparece.
    4. Escritura de lista: Escribe un programa que tome una lista de nombres y los guarde en un archivo llamado nombres.txt, un nombre por línea.
    5. Copiar contenido: Implementa un programa que copie el contenido de un archivo llamado origen.txt a un archivo llamado destino.txt.

    Descarga solución de los ejercicios.

    En programamación un solución puede tener multiples soluciones, mas tratandose de un lenguaje tan dinámico como Python. En el siguieten archivo encotraras una de esas posibilidades, pero recuerda que no por eso tu planteamiento para resolverlo sería incorrecto.