Programación con Python: Listas

Las listas en Python son una estructura de datos muy versátil que permite almacenar y manipular colecciones de elementos. Son secuencias ordenadas y modificables, y pueden contener elementos de diferentes tipos. A continuación mostraremos las principales operaciones que podemos realizar con listas en Python, e incluiremos explicaciones y ejemplos prácticos.

Creación de listas

Podemos crear listas en Python encerrando los elementos entre corchetes []:

# Lista vacía
lista_vacia = []

# Lista de números enteros
numeros_enteros = [1, 2, 3, 4, 5]

# Lista de números flotantes
numeros_flotantes = [1.5, 2.25, 3.75]

# Lista de cadenas de texto
nombres = ["Ana", "Carlos", "María"]

# Lista con elementos de diferentes tipos
mixta = [10, "Python", True, 3.14]

Acceso a elementos

Podemos acceder a los elementos de una lista utilizando índices, teniendo en cuenta que el primer elemento tiene un índice de 0, y el último de -1:

numeros = [10, 20, 30, 40, 50]

primer_elemento = numeros[0]   # 10
segundo_elemento = numeros[1]  # 20
ultimo_elemento = numeros[-1]  # 50 (índice negativo para acceder al último elemento)

Modificación de elementos

Podemos modificar los elementos de una lista asignando nuevos valores a través de sus índices:

nombres = ["Ana", "Carlos", "María"]

nombres[1] = "Juan"  # Modificar el segundo elemento de la lista

print(nombres)  # ["Ana", "Juan", "María"]

Operaciones con listas

Longitud de la lista

Podemos obtener la longitud de una lista utilizando la función len():

numeros = [1, 2, 3, 4, 5]
longitud = len(numeros)  # 5

Concatenación de listas

Podemos concatenar dos o más listas utilizando el operador +:

lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
concatenada = lista1 + lista2  # [1, 2, 3, 4, 5, 6]

Repetición de listas

Podemos repetir una lista utilizando el operador *:

lista = [1, 2, 3]
repetida = lista * 3  # [1, 2, 3, 1, 2, 3, 1, 2, 3]

Añadir elementos a una lista

Podemos añadir elementos a una lista utilizando los métodos append() e insert():

frutas = ["manzana", "plátano"]

# Método append(): añade un elemento al final de la lista
frutas.append("naranja")  # ["manzana", "plátano", "naranja"]

# Método insert(): inserta un elemento en una posición específica de la lista
frutas.insert(1, "pera")  # ["manzana", "pera", "plátano", "naranja"]

Eliminar elementos de una lista

Podemos eliminar elementos de una lista utilizando los métodos remove() y pop(), y también mediante una sentencia del:

nombres = ["Ana", "Carlos", "María"]

# Método remove(): elimina el primer elemento que coincida con el valor proporcionado
nombres.remove("Carlos")  # ["Ana", "María"]

# Método pop(): elimina el elemento en la posición dada (o el último si no se proporciona índice)
nombres.pop(0)  # ["María"]

# Sentencia del: elimina el elemento en la posición dada (o toda la lista si no se proporciona índice)
del nombres[0]  # []

Búsqueda en listas

Podemos buscar elementos en una lista utilizando el operador in:

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

existe_3 = 3 in numeros  # True
existe_6 = 6 in numeros  # False

Comprobar si una lista está vacía

Podemos comprobar si una lista está vacía simplemente usando el valor booleano de la lista. En Python, una lista vacía se evalúa como False, mientras que una lista con elementos se evalúa como True:

lista_vacia = []
lista_no_vacia = [1, 2, 3]

if not lista_vacia:
    print("Esta lista está vacía.")

if lista_no_vacia:
    print("Esta lista contiene elementos.")

Comprobar si un elemento existe en una lista

Podemos utilizar el operador in para comprobar si un elemento está presente en una lista:

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

if 3 in numeros:
    print("El número 3 está en la lista.")

Comparación de listas

Podemos comparar listas para verificar si son iguales o diferentes:

lista1 = [1, 2, 3]
lista2 = [1, 2, 3]
lista3 = [4, 5, 6]

print(lista1 == lista2)  # True (misma estructura y elementos)
print(lista1 == lista3)  # False (elementos diferentes)

Troceado de listas (slicing)

Podemos obtener sublistas (slices) de una lista utilizando la sintaxis [inicio:fin] teniendo en cuenta que el índice de inicio sí está incluido, pero el de fin no:

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(numeros[2:6])  # [3, 4, 5, 6]
print(numeros[2:])   # [3, 4, 5, 6, 7, 8, 9, 10]
print(numeros[:-2])  # [1, 2, 3, 4, 5, 6, 7, 8]

También disponemos de funcionalidades más avanzadas, como el paso o la asignación de valores con la sintaxis [inicio:fin:paso]:

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Obtener una sublista con paso negativo (se recorre en orden inverso)
sub_lista_inversa = numeros[::-1]  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# Obtener una sublista con paso positivo (obtener los números pares)
pares = numeros[1::2]  # [2, 4, 6, 8, 10]

# Modificar valores usando slicing
numeros[1:4] = [20, 30, 40]  # [1, 20, 30, 40, 5, 6, 7, 8, 9, 10]

# Eliminar elementos usando slicing (reemplazar con una lista vacía)
numeros[1:4] = []  # [1, 5, 6, 7, 8, 9, 10]

Listas anidadas

En Python podemos tener listas dentro de listas, lo que se conoce como listas anidadas:

lista_anidada = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(lista_anidada[1][2])  # 6 (tercer elemento de la segunda lista)

Copia de listas

Debemos tener en cuenta que al asignar una lista a otra variable, ambas variables apuntan a la misma lista en memoria. Si modificamos una de ellas, la otra también cambiará. Para crear una copia independiente de una lista, podemos utilizar el método copy() o la notación de slicing:

original = [1, 2, 3]

# Copia utilizando copy()
copia1 = original.copy()

# Copia utilizando slicing
copia2 = original[:]

# Modificar la copia independiente
copia1[0] = 100

print(original)  # [1, 2, 3]
print(copia1)    # [100, 2, 3]
print(copia2)    # [1, 2, 3]

Como se puede observar en el ejemplo, la modificación de copia1 no afecta a la lista original, ya que son listas diferentes en memoria. Sin embargo, debemos tener en cuenta que si la lista contiene objetos mutables (como listas anidadas o diccionarios), las copias independientes todavía pueden compartir referencias a esos objetos internos. Por lo tanto, si modificamos un objeto mutable dentro de una lista copiada, ese cambio se reflejará en ambas listas.

Listas y bucles

Las listas son especialmente útiles cuando se combinan con bucles para procesar múltiples elementos de manera eficiente.

Bucle «for» con listas

Este bucle for recorre la lista numeros y muestra cada elemento en la consola:

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

for numero in numeros:
    print(numero)

Bucle «for» con índices y enumeración

A veces resulta útil acceder tanto al índice como al elemento en cada iteración. Podemos usar la función enumerate() para obtener ambos:

frutas = ["manzana", "plátano", "naranja"]

for indice, fruta in enumerate(frutas):
    print(f"Índice: {indice}, Fruta: {fruta}")

Bucle «while» con listas

El bucle while se puede usar para recorrer una lista hasta que se cumpla una condición:

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

while indice < len(numeros):
    print(numeros[indice])
    indice += 1

Comprensión de listas

Las comprensiones de listas nos proporcionan una forma muy concisa y legible para crear listas basadas en una expresión y un bucle for:

# Crear una lista de cuadrados de los números del 1 al 5
cuadrados = [numero ** 2 for numero in range(1, 6)]  # [1, 4, 9, 16, 25]

# Crear una lista solo con números pares del 1 al 10
pares = [numero for numero in range(1, 11) if numero % 2 == 0]  # [2, 4, 6, 8, 10]

También podemos utilizar comprensión avanzada para realizar tareas más complejas:

# Obtener todos los números impares mayores que 10 en una lista
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
impares_mayores_que_10 = [numero for numero in numeros if numero > 10 and numero % 2 != 0]

# Crear una matriz de ceros de 3x3 utilizando comprensión de listas anidadas
matriz_ceros = [[0 for _ in range(3)] for _ in range(3)]

Funciones y métodos útiles para listas

Python proporciona diversas funciones y métodos que pueden resultar muy útiles para trabajar con listas:

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

# Ordenar la lista de forma ascendente
numeros.sort()  # [1, 2, 3, 4, 5]

# Ordenar la lista de forma descendente
numeros.sort(reverse=True)  # [5, 4, 3, 2, 1]

# Obtener el índice de la primera aparición de un elemento
indice = numeros.index(4)  # 1

# Contar el número de veces que aparece un elemento en la lista
apariciones = numeros.count(3)  # 1

# Obtener una copia ordenada de la lista sin modificar la original
lista_ordenada = sorted(numeros)  # [1, 2, 3, 4, 5]

# Limpiar la lista (eliminar todos los elementos)
numeros.clear()  # []

Función map()

La función map() se puede utilizar para aplicar una función a todos los elementos de una lista y devolver una nueva lista con los resultados:

def cuadrado(numero):
    return numero ** 2

numeros = [1, 2, 3, 4, 5]
cuadrados = list(map(cuadrado, numeros))  # [1, 4, 9, 16, 25]

También podemos utilizar comprensión de listas para lograr el mismo resultado de manera más concisa:

numeros = [1, 2, 3, 4, 5]
cuadrados = [numero ** 2 for numero in numeros]  # [1, 4, 9, 16, 25]

Función filter()

La función filter() se puede utilizar para filtrar elementos de una lista según una condición dada:

def es_par(numero):
    return numero % 2 == 0

numeros = [1, 2, 3, 4, 5, 6]
pares = list(filter(es_par, numeros))  # [2, 4, 6]

Nuevamente, podemos utilizar comprensión de listas para lograr el mismo resultado:

numeros = [1, 2, 3, 4, 5, 6]
pares = [numero for numero in numeros if numero % 2 == 0]  # [2, 4, 6]

Función sum()

La función sum() nos permite sumar todos los elementos de una lista numérica:

numeros = [1, 2, 3, 4, 5]
total = sum(numeros)  # 15

Función join()

La función join() nos permite unir elementos de una lista para formar una cadena de texto:

nombres = ["Ana", "Carlos", "María"]
cadena_unida = ", ".join(nombres)  # "Ana, Carlos, María"

Función zip()

La función zip() combina elementos de dos o más listas en tuplas:

nombres = ["Ana", "Carlos", "María"]
edades = [25, 30, 28]

combinado = list(zip(nombres, edades))
# [('Ana', 25), ('Carlos', 30), ('María', 28)]

Función sorted()

La función sorted() nos permite obtener una nueva lista ordenada a partir de una lista dada sin modificar la original:

numeros = [3, 1, 5, 2, 4]
numeros_ordenados = sorted(numeros)  # [1, 2, 3, 4, 5]

Función reversed()

La función reversed() nos permite obtener una nueva lista con sus elementos en orden inverso sin modificar la original:

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

for numero in reversed(numeros):
    print(numero) # [5, 4, 3, 2, 1]

for numero in numeros:
    print(numero) # [1, 2, 3, 4, 5]

Función enumerate()

La función enumerate() nos permite obtener tanto el índice como el elemento durante la iteración:

frutas = ["manzana", "plátano", "naranja"]

for indice, fruta in enumerate(frutas):
    print(f"Índice: {indice}, Fruta: {fruta}")

Método count()

El método count() nos permite contar cuántas veces aparece un elemento específico en una lista:

numeros = [1, 2, 2, 3, 4, 2]
contador = numeros.count(2)  # 3 (el número 2 aparece 3 veces en la lista)

Método index()

El método index() nos permite encontrar el índice de la primera aparición de un elemento en una lista:

numeros = [10, 20, 30, 40, 50]
indice = numeros.index(30)  # 2 (el número 30 está en el índice 2 de la lista)

Método clear()

El método clear() se utiliza para eliminar todos los elementos de una lista, dejándola vacía:

numeros = [1, 2, 3, 4, 5]
numeros.clear()  # []

Listas como pilas y colas

Podemos usar una lista para implementar una pila (LIFO) o una cola (FIFO):

# Implementación de una pila usando una lista
pila = []
pila.append(1)         # [1]
pila.append(2)         # [1, 2]
elemento = pila.pop()  # elemento = 2, pila = [1]

# Implementación de una cola usando una lista (menos eficiente)
cola = []
cola.append(1)          # [1]
cola.append(2)          # [1, 2]
elemento = cola.pop(0)  # elemento = 1, cola = [2]

Listas y mutabilidad

Las listas son mutables, lo que significa que podemos modificar sus elementos sin crear una nueva lista. Por ejemplo, podemos agregar, eliminar o actualizar elementos en una lista sin tener que crear una copia:

numeros = [1, 2, 3]
numeros[0] = 10  # [10, 2, 3]

numeros.append(4)  # Agregar un elemento al final: [10, 2, 3, 4]
numeros.insert(1, 5)  # Insertar un elemento en una posición: [10, 5, 2, 3, 4]

numeros.remove(2)  # Eliminar el elemento 2: [10, 5, 3, 4]
numeros.pop()  # Eliminar el último elemento: [10, 5, 3]

del numeros[1]  # Eliminar un elemento por índice: [10, 3]

numeros.extend([6, 7, 8])  # Extender la lista con otra: [10, 3, 6, 7, 8]

Como se observa en el ejemplo, podemos modificar los elementos de una lista directamente y realizar varias operaciones para agregar o eliminar elementos según sea necesario.

Clonación de listas

Si queremos crear una copia independiente de una lista, debemos asegurarnos de no hacer una asignación directa, ya que ambas variables apuntarían a la misma lista en memoria. Podemos utilizar el método copy() o la notación de slicing para clonar una lista:

original = [1, 2, 3]

# Clonar usando copy()
copia1 = original.copy()

# Clonar usando slicing
copia2 = original[:]

Ahora, las tres listas son independientes y cualquier modificación en una lista no afectará a las otras.

Conversiones de datos básicos a listas

A continuación veremos cómo realizar conversiones de diferentes tipos de datos básicos (cadenas y enteros por ejemplo) a listas en Python. En general, podremos convertir cualquier secuencia o estructura iterable en una lista utilizando la función list().

Conversión de cadenas de texto a lista

Podemos convertir una cadena de texto en una lista utilizando el método split(). Este método separa la cadena en subcadenas usando un delimitador específico y devuelve una lista con las subcadenas:

cadena = "Hola,esto,es,una,cadena"
lista = cadena.split(",")  # ['Hola', 'esto', 'es', 'una', 'cadena']

El delimitador que hemos utilizado en el ejemplo es la coma (,), pero podemos usar cualquier carácter como delimitador:

otra_cadena = "Esto-es-una-cadena-con-guiones"
otra_lista = otra_cadena.split("-")  # ['Esto', 'es', 'una', 'cadena', 'con', 'guiones']

Si no especificamos un delimitador en split(), se utilizará el espacio en blanco como delimitador por defecto:

texto = "Hola esto es una cadena"
palabras = texto.split()  # ['Hola', 'esto', 'es', 'una', 'cadena']

Conversión de caracteres de una cadena a lista

Si tenemos una cadena de texto y queremos utilizar cada carácter para formar una lista, podemos hacerlo utilizando la función list() o también con una comprensión de listas. En el siguiente ejemplo, iteramos por cada carácter en la cadena y creamos una lista con cada carácter como elemento:

cadena = "Hola"
lista1 = list(cadena)  # ['H', 'o', 'l', 'a']
lista2 = [caracter for caracter in cadena]  # ['H', 'o', 'l', 'a']

Conversión de valores numéricos a lista

Si queremos convertir un valor numérico en una lista, podemos hacerlo utilizando la función list() pasando el valor como un argumento iterable. En el siguiente ejemplo convertimos el número en una cadena de texto utilizando str(), y luego utilizamos list() para formar una lista con todos los dígitos:

numero = 12345
lista = list(str(numero))  # ['1', '2', '3', '4', '5']

Conversión de rangos a lista

Los rangos en Python también se pueden convertir a listas utilizando la función list(). Por ejemplo, podemos crear un rango del 1 al 5 y luego convertirlo en una lista:

rango = range(1, 6)
lista = list(rango)  # [1, 2, 3, 4, 5]

Listas, funciones y conjuntos

A continuación enumeramos algunas ventajas adicionales asociadas al uso de funciones y otros tipos de estructuras de datos que veremos de forma detallada en otras unidades. Hemos creído conveniente exponerlas ahora para ser conscientes del gran potencial que presentan las listas de Python.

Listas como argumentos de funciones

Las listas se pueden utilizar como argumentos de funciones, lo que nos proporciona la funcionalidad necesaria para pasar múltiples elementos a una función agrupándolos en una sola variable. Además, esto nos permitirá por ejemplo realizar cambios en los elementos de la lista dentro de la función:

def duplicar_elementos(lista):
    for i in range(len(lista)):
        lista[i] *= 2

numeros = [1, 2, 3, 4, 5]
duplicar_elementos(numeros)

print(numeros)  # [2, 4, 6, 8, 10]

Listas y funciones lambda

Las funciones lambda son funciones anónimas que se pueden usar en combinación con las funciones map(), filter(), y otras:

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

# Elevar al cuadrado cada número usando una función lambda con map()
cuadrados = list(map(lambda x: x ** 2, numeros))  # [1, 4, 9, 16, 25]

# Filtrar solo los números pares usando una función lambda con filter()
pares = list(filter(lambda x: x % 2 == 0, numeros))  # [2, 4]

Listas y operaciones con conjuntos

Podemos realizar operaciones de conjuntos (unión, intersección, diferencia) con listas utilizando el tipo de dato set:

lista1 = [1, 2, 3]
lista2 = [3, 4, 5]

# Unión de listas
union = list(set(lista1) | set(lista2))  # [1, 2, 3, 4, 5]

# Intersección de listas
interseccion = list(set(lista1) & set(lista2))  # [3]

# Diferencia entre listas (elementos que están en lista1 pero no en lista2)
diferencia = list(set(lista1) - set(lista2))  # [1, 2]

Debemos matizar que el tipo de dato set no mantiene el orden original de los elementos, por lo que al convertirlo de vuelta a una lista, el orden puede variar.

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Bucles

Los bucles son estructuras de control que nos permiten repetir un bloque de código varias veces o recorrer elementos en una secuencia. En Python disponemos del bucle for y el bucle while. A continuación mostraremos cómo utilizarlos con ejemplos para comprender mejor su funcionamiento.

Bucle «for»

El bucle for se utiliza para iterar sobre secuencias de datos tales como cadenas, listas, tuplas, o diccionarios (estos tres últimos tipos de datos se explican con más detalle en otra unidad).

En el siguiente ejemplo, el bucle for recorre la cadena mensaje y muestra en la consola cada uno de sus caracteres:

# Ejemplo con una cadena
mensaje = "Hola, Python!"
for caracter in mensaje:
    print(caracter)

En el siguiente ejemplo empleamos un bucle for para recorrer la lista frutas y mostrar cada uno de sus elementos:

# Ejemplo con una lista
frutas = ["manzana", "plátano", "naranja"]
for fruta in frutas:
    print(fruta)

A continuación mostramos un bucle for que recorre cada par clave-valor del diccionario estudiantes y muestra el nombre y la edad de cada estudiante:

# Ejemplo con un diccionario
estudiantes = {"Juan": 18, "María": 20, "Carlos": 22}
for nombre, edad in estudiantes.items():
    print(nombre, "tiene", edad, "años.")

Bucle «while»

El bucle while se utiliza para repetir un bloque de código mientras una condición sea verdadera. En el siguiente ejemplo, el bucle while muestra el valor del contador mientras sea menor o igual a 5:

contador = 1
while contador <= 5:
    print("Contador:", contador)
    contador += 1

Sentencias de control en bucles

Dentro de los bucles podemos utilizar las sentencias break, continue y else para controlar el flujo de ejecución.

break

Permite salir del bucle de manera prematura si se cumple una condición. En el siguiente ejemplo, el bucle for imprimirá los números del 1 al 4 y luego se detendrá cuando llegue a 5:

for numero in range(1, 11):
    if numero == 5:
        break
    print(numero)

continue

Permite saltar a la siguiente iteración del bucle si se cumple una condición. En el siguiente ejemplo, el bucle for imprimirá solo los números impares del 1 al 10, saltando los números pares:

for numero in range(1, 11):
    if numero % 2 == 0:
        continue
    print(numero)

else

Se ejecuta cuando el bucle se completa sin encontrar una sentencia break. Por ejemplo, el siguiente bucle for imprimirá los números del 1 al 5 y luego el programa mostrará «Fin del bucle»:

for numero in range(1, 6):
    print(numero)
else:
    print("Fin del bucle")

Bucles anidados

Podemos incluir bucles dentro de bucles, lo que se conoce como bucles anidados. También podemos utilizar break y continue para controlar el flujo de ejecución dentro de ellos. Por ejemplo, los siguientes bucles for anidados imprimirán todos los pares (i, j) del 1 al 3, excepto cuando i sea igual a 2 y j sea igual a 2. En este último caso, el break provocará la salida del bucle interno, continuando con la siguiente iteración del bucle externo:

for i in range(1, 4):
    for j in range(1, 4):
        if i == 2 and j == 2:
            break
        print(i, j)

Bucles infinitos

Es importante tener cuidado con los bucles infinitos, ya que pueden llegar a ejecutar el código que contengan de forma indefinida si no incluimos correctamente una condición que los detenga. Pueden provocar que el programa se bloquee o entre en un estado no deseado. Por ejemplo, el siguiente bucle while se ejecutará de forma indefinida, imprimiendo «Este es un bucle infinito» una y otra vez:

# Bucle infinito con while
while True:
    print("Este es un bucle infinito")

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Condicionales

Los condicionales son una parte fundamental de la programación que nos permite controlar el flujo de ejecución de un programa. En Python se utilizan principalmente tres tipos de condicionales: if, elif (opcional) y else. A continuación mostraremos cómo utilizarlos con ejemplos para comprender mejor su funcionamiento.

Condicionales «if»

El condicional if se utiliza para ejecutar un bloque de código solo si una condición es verdadera. En el siguiente ejemplo, si la variable edad es mayor o igual a 18, se imprimirá «Eres mayor de edad.»:

edad = 18

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

Condicionales «if» y «else»

El condicional else se utiliza para ejecutar un bloque de código cuando la condición del if es falsa. En el siguiente ejemplo, si la variable edad es mayor o igual a 18, se imprimirá «Eres mayor de edad.», y en caso contrario, se imprimirá «Eres menor de edad.»:

edad = 15

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

Condicionales «if», «elif» y «else»

El condicional elif (abreviatura de «else if») se utiliza para evaluar múltiples condiciones. Se verifica solo si la condición del if anterior es falsa. En el siguiente ejemplo, el programa evalúa la variable calificacion y muestra diferentes mensajes dependiendo del rango en el que se encuentre:

calificacion = 85

if calificacion >= 90:
    print("Tienes una A.")
elif calificacion >= 80:
    print("Tienes una B.")
elif calificacion >= 70:
    print("Tienes una C.")
else:
    print("Tienes una calificación inferior a C.")

Uso de operadores lógicos en condicionales

Podemos combinar múltiples condiciones utilizando los operadores lógicos and (y), or (o) y not (no). En el siguiente ejemplo se evalúa tanto la temperatura como si es un día soleado o no, utilizando el operador and. Si ambas condiciones son verdaderas, se imprimirá «Hace calor y es un día soleado.» Si al menos una de las condiciones es verdadera (usando el operador or), se imprimirá «Hace calor o es un día soleado.» De lo contrario, se imprimirá «No hace calor y no es un día soleado.»:

temperatura = 25
dia_soleado = True

if temperatura > 30 and dia_soleado:
    print("Hace calor y es un día soleado.")
elif temperatura > 30 or dia_soleado:
    print("Hace calor o es un día soleado.")
else:
    print("No hace calor y no es un día soleado.")

Condicionales anidados

Se pueden anidar condicionales dentro de otros condicionales para manejar situaciones más complejas. En el siguiente ejemplo, se verifica primero si la persona es mayor o igual a 18 años. Si es así, se verifica si tiene carnet de conducir para determinar si puede conducir o no:

edad = 25
carnet_conducir = True

if edad >= 18:
    if carnet_conducir:
        print("Puedes conducir.")
    else:
        print("Eres mayor de edad, pero no puedes conducir.")
else:
    print("Eres menor de edad.")

Sentencia match-case

Antes de Python 3.10, las comparaciones múltiples se realizaban utilizando la estructura if-elif-else, lo que podía llevar a una sintaxis un tanto repetitiva y menos legible en ciertos casos. El nuevo match case resuelve este problema ya que permite realizar comparaciones más elegantes y fáciles de leer.

Sintaxis básica

La sintaxis del match case se asemeja a una declaración switch en otros lenguajes de programación. Su forma básica es la siguiente:

match valor:
    case patron1:
        # código a ejecutar si el valor coincide con patron1
    case patron2:
        # código a ejecutar si el valor coincide con patron2
    ...
    case patronN:
        # código a ejecutar si el valor coincide con patronN
    case _:
        # código a ejecutar si no se cumple ninguno de los patrones anteriores

Un ejemplo muy sencillo

En su forma más sencilla, el match case permite comprobar coincidencias con valores específicos de cualquier tipo (números, cadenas, etc). Por ejemplo, utilizando el código del siguiente ejemplo podemos determinar el estado civil de una persona basándonos en el valor de la variable codigo:

match codigo:
    case "S":
        print("Soltero/a")
    case "C":
        print("Casado/a")
    case "D":
        print("Divorciado/a")
    case "V":
        print("Viudo/a")
    case _:
        print("Código inválido")

Equivalencia entre «if-elif-else» y «match-case»

Supongamos que queremos determinar el día de la semana correspondiente a un número del 1 al 7, donde 1 representa el lunes y 7 representa el domingo.

Usando if-elif-else:

if numero == 1:
    print("Lunes")
elif numero == 2:
    print("Martes")
elif numero == 3:
    print("Miércoles")
elif numero == 4:
    print("Jueves")
elif numero == 5:
    print("Viernes")
elif numero == 6:
    print("Sábado")
elif numero == 7:
    print("Domingo")
else:
    print("Número inválido")

Usando match case:

match numero:
    case 1:
        print("Lunes")
    case 2:
        print("Martes")
    case 3:
        print("Miércoles")
    case 4:
        print("Jueves")
    case 5:
        print("Viernes")
    case 6:
        print("Sábado")
    case 7:
        print("Domingo")
    case _:
        print("Número inválido")

Como se puede apreciar, el uso del match case reduce significativamente la cantidad de consultas que se realizan para comprobar el valor de la variable numero y hace que el código resultante sea más fácil de leer.

Combinación de patrones

El match case también permite combinar múltiples patrones utilizando la sintaxis case patron1 | patron2 | ...:. En el siguiente ejemplo agrupamos diversos valores de una nota numérica con el propósito de mostrar el texto descriptivo de la calificación que se haya obtenido:

match nota:
    case 0 | 1 | 2 | 3 | 4:
        print("Suspendido")
    case 5 | 6:
        print("Aprobado")
    case 7 | 8:
        print("Notable")
    case 9 | 10:
        print("Sobresaliente")
    case _:
        print("Nota no válida")

Además Python nos permite comprobar coincidencias con datos de cualquier tipo (cadenas, listas, tuplas, diccionarios, etc). Vamos a ver un ejemplo en el que tenemos una lista de alimentos representados por cadenas de texto. Utilizamos el match case para clasificar cada alimento en diferentes categorías: «Frutas», «Verduras», «Proteínas» o «Carbohidratos». Si el alimento no coincide con ninguna de estas categorías, lo clasificamos como «Desconocido». De esta forma, el match case nos permitirá clasificar rápidamente cada alimento en su respectiva categoría sin tener que escribir múltiples sentencias if-elif-else, y por lo tanto obtenemos un código más simple y fácil de entender:

match alimento:
    case "manzana" | "pera" | "plátano" | "uva":
        print("Frutas")
    case "zanahoria" | "tomate" | "espinaca" | "lechuga":
        print("Verduras")
    case "pollo" | "pescado" | "res" | "cerdo":
        print("Proteínas")
    case "arroz" | "pasta" | "pan" | "patata":
        print("Carbohidratos")
    case _:
        print("Desconocido")

Consideraciones adicionales

Es importante tener en cuenta que el match case es una característica introducida en Python 3.10, por lo que si estamos utilizando una versión anterior, esta funcionalidad no estará disponible. Además, es recomendable utilizar el match case sólo cuando el código resulte más legible o apropiado para el problema en cuestión. En muchos casos, la estructura if-elif-else tradicional puede ser resultar más adecuada por motivos de compatibilidad o en caso de que podamos resolver nuestro problema utilizando expresiones booleanas sencillas.

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Conversiones entre datos básicos

En Python se pueden convertir datos de un tipo a otro utilizando funciones integradas o métodos específicos para cada tipo de dato. Estas conversiones son útiles cuando necesitamos operar con diferentes tipos de datos o cuando queremos mostrar información en un formato específico. A continuación detallaremos las conversiones más comunes en Python, y proporcionaremos ejemplos prácticos para cada caso.

Conversión a enteros (int)

Podemos convertir datos a enteros utilizando la función int():

# Convertir un número decimal a entero
decimal = 5.75
entero = int(decimal)  # 5 (se descarta la parte decimal)

# Convertir una cadena numérica a entero
cadena_numero = "123"
entero_desde_cadena = int(cadena_numero)  # 123

Conversión a flotantes (float)

Podemos convertir datos a números flotantes utilizando la función float():

# Convertir un entero a número flotante
entero = 10
flotante_desde_entero = float(entero)  # 10.0

# Convertir una cadena numérica a número flotante
cadena_numero = "3.14"
flotante_desde_cadena = float(cadena_numero)  # 3.14

Conversión a cadenas (str)

Podemos convertir datos a cadenas utilizando la función str():

# Convertir un número entero a cadena
entero = 42
cadena_desde_entero = str(entero)  # "42"

# Convertir un número flotante a cadena
flotante = 3.14
cadena_desde_flotante = str(flotante)  # "3.14"

Conversión a booleanos (bool)

Podemos convertir datos a booleanos utilizando la función bool(). En general, los siguientes valores se evaluarán como False en Python, y todo lo demás se evaluará como True:

  • Cualquier número que sea 0 (entero o flotante).
  • Cadenas vacías.
  • Listas, tuplas, diccionarios o conjuntos vacíos.
  • El valor especial None.
# Convertir un número entero a booleano
entero = 10
booleano_desde_entero = bool(entero)  # True

# Convertir un número flotante a booleano
flotante = 0.0
booleano_desde_flotante = bool(flotante)  # False

# Convertir una cadena a booleano
cadena_vacia = ""
booleano_desde_cadena = bool(cadena_vacia)  # False

# Convertir una lista vacía a booleano
lista_vacia = []
booleano_desde_lista = bool(lista_vacia)  # False

# Convertir un valor None a booleano
valor_nulo = None
booleano_desde_nulo = bool(valor_nulo)  # False

Conversión a otras bases o representaciones

En Python también podemos convertir datos a representaciones en formato binario, octal o hexadecimal utilizando las funciones bin(), oct() y hex():

numero = 42

# Convertir a binario
binario = bin(numero)  # '0b101010'

# Convertir a octal
octal = oct(numero)    # '0o52'

# Convertir a hexadecimal
hexadecimal = hex(numero)  # '0x2a'

Es importante tener en cuenta que no todos los tipos de datos se pueden convertir a todas las representaciones. Por ejemplo, no podemos convertir una cadena a binario directamente.

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Cadenas de texto

Las cadenas de texto (también conocidas como strings) son secuencias de caracteres encerradas entre comillas simples o comillas dobles, y nos permiten almacenar y manipular texto en los programas. En Python, las cadenas son objetos inmutables, lo que significa que no se pueden modificar una vez creadas, pero podemos crear nuevas cadenas a partir de ellas con diferentes manipulaciones. Vamos a detallar a continuación la sintaxis básica relacionada con las cadenas, e incluiremos ejemplos prácticos.

Creación de cadenas

Podemos crear una cadena asignando un valor entre comillas (simples o dobles) a una variable:

mensaje = "Hola, Python!"
nombre = 'María'
direccion = "Calle San José, 123"

También podemos utilizar triples comillas (simples o dobles) para crear cadenas de varias líneas:

parrafo = """Este es un ejemplo
de una cadena con varias líneas.
Puedes usar triples comillas para ello."""

Operaciones con cadenas

Longitud de una cadena

Podemos obtener la longitud de una cadena utilizando la función len():

mensaje = "Hola, Python!"
longitud = len(mensaje)  # 13 (incluyendo espacios y signos de puntuación)

Concatenación

Podemos unir cadenas utilizando el operador +:

saludo = "Hola, "
nombre = "María"
mensaje_completo = saludo + nombre  # "Hola, María"

Repetición

Podemos repetir una cadena utilizando el operador *:

cadena = "abc"
repetida = cadena * 3  # "abcabcabc"

Indexación y segmentación

Las cadenas son secuencias de caracteres, lo que significa que podemos acceder a caracteres individuales utilizando índices y también podemos segmentar la cadena para obtener subcadenas:

texto = "Python es genial"

primer_caracter = texto[0]  # "P" (el primer carácter tiene índice 0)
ultimo_caracter = texto[-1]  # "l" (el último carácter tiene índice -1)

segmento = texto[7:9]  # "es" (segmento desde el índice 7 hasta el índice 8, no incluye el índice 9)

# También puedes omitir el índice de inicio o de fin para segmentar desde el principio o hasta el final, respectivamente.
inicio_omitiendo = texto[:6]  # "Python"
fin_omitiendo = texto[10:]   # "genial"

Búsqueda en cadenas

Podemos buscar subcadenas dentro de una cadena utilizando los métodos find() e index():

texto = "Python es un lenguaje de programación"
posicion_find = texto.find("lenguaje")  # 13 (posición de la primera ocurrencia)
posicion_index = texto.index("lenguaje")  # 13 (posición de la primera ocurrencia)

# Si la subcadena no se encuentra, find() devuelve -1, mientras que index() genera una excepción ValueError.
posicion_find_no_encontrada = texto.find("Java")  # -1
posicion_index_no_encontrada = texto.index("Java")  # ValueError: substring not found

Reemplazo y formato

Podemos reemplazar subcadenas en una cadena utilizando el método replace():

mensaje = "Hola, NAME!"
nuevo_mensaje = mensaje.replace("NAME", "María")  # "Hola, María!"

También podemos utilizar el método format() para que la cadena incluya los valores de diferentes variables:

nombre = "Juan"
edad = 30
saludo = "Hola, mi nombre es {} y tengo {} años.".format(nombre, edad)
# "Hola, mi nombre es Juan y tengo 30 años."

Caracteres especiales

Python admite varios caracteres especiales que se pueden incluir en las cadenas, como por ejemplo:

  • \n: Nueva línea.
  • \t: Tabulación.
  • \': Comilla simple.
  • \": Comilla doble.
  • \\: Barra invertida.
mensaje_multilinea = "Hola,\nPython!"
print(mensaje_multilinea)
# Salida:
# Hola,
# Python!

mensaje_tabs = "Hola,\tPython!"
print(mensaje_tabs)
# Salida: Hola,    Python!

mensaje_comillas = "Ella dijo: \"Hola, Python!\""
print(mensaje_comillas)
# Salida: Ella dijo: "Hola, Python!"

Métodos útiles para cadenas

Python incluye varios métodos para trabajar con cadenas. Algunos de los más útiles son:

texto = "Python es un lenguaje de programación"

# Convertir a mayúsculas y minúsculas
texto_mayusculas = texto.upper()  # "PYTHON ES UN LENGUAJE DE PROGRAMACIÓN"
texto_minusculas = texto.lower()  # "python es un lenguaje de programación"

# Capitalizar la primera letra de la cadena
texto_capitalizado = texto.capitalize()  # "Python es un lenguaje de programación"

# Contar ocurrencias de una subcadena
ocurrencias = texto.count("a")  # 3 (número de veces que aparece "a" en la cadena)

# Verificar si una cadena comienza o termina con una subcadena
comienza_con = texto.startswith("Python")  # True
termina_con = texto.endswith("programación")  # True

# Separar una cadena en una lista de subcadenas por un carácter específico
palabras = texto.split(" ")  # ['Python', 'es', 'un', 'lenguaje', 'de', 'programación']

# Eliminar espacios en blanco al principio y al final de la cadena
texto_limpio = "   Hola, Python!   "
texto_sin_espacios = texto_limpio.strip()  # "Hola, Python!"

F-strings

Las f-strings (o cadenas formateadas) nos proporcionan una forma muy legible para construir cadenas en Python (están disponibles a partir de la versión 3.6). Las f-strings nos permiten incorporar expresiones dentro de las cadenas, lo que facilita la inclusión de variables y otros valores en ellas sin tener que utilizar métodos de formato o concatenación. Para usar f-strings, simplemente debemos colocar una «f» o «F» antes del inicio de la cadena y luego añadimos las expresiones utilizando llaves {} dentro de la cadena:

nombre = "Juan"
edad = 30

# Usando f-string para formatear la cadena
mensaje = f"Hola, mi nombre es {nombre} y tengo {edad} años."
print(mensaje)
# Salida: "Hola, mi nombre es Juan y tengo 30 años."

Las expresiones dentro de las llaves serán evaluadas y su valor se incluirá en la cadena final. Se puede incluir cualquier tipo de expresión válida dentro de las llaves, como operaciones matemáticas, llamadas a funciones, y más:

a = 10
b = 5

# Operaciones matemáticas dentro de una f-string
resultado = f"La suma de {a} y {b} es {a + b}, y el producto es {a * b}."
print(resultado)
# Salida: "La suma de 10 y 5 es 15, y el producto es 50."

También se puede aplicar formato a las expresiones dentro de las llaves. Por ejemplo, podemos especificar la cantidad de decimales para un número flotante o el ancho para un número entero:

precio = 9.99

# Formato de número flotante dentro de una f-string
mensaje_precio = f"El precio es: ${precio:.2f}"
print(mensaje_precio)
# Salida: "El precio es: $9.99"

cantidad = 100

# Formato de número entero dentro de una f-string
mensaje_cantidad = f"La cantidad es: {cantidad:05d}"
print(mensaje_cantidad)
# Salida: "La cantidad es: 00100"

En el ejemplo anterior, :.2f indica que queremos mostrar el número flotante con dos decimales, mientras que :05d indica que queremos que el número entero tenga un ancho de 5 dígitos, rellenando con ceros a la izquierda si es necesario.

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Operadores

Los operadores en Python son símbolos especiales que se emplean para realizar diferentes acciones y cálculos utilizando variables y valores. Estas operaciones pueden ser matemáticas, de comparación, lógicas, de asignación, etc. Los operadores son fundamentales en la programación, ya que nos permiten realizar cálculos, tomar decisiones y manipular datos de manera eficiente.

Operadores Aritméticos

Los operadores aritméticos se utilizan para realizar operaciones matemáticas en números. Aquí están los principales operadores aritméticos en Python:

  • Suma (+): Suma dos valores.
  • Resta (-): Resta el segundo valor del primero.
  • Multiplicación (*): Multiplica dos valores.
  • División (/): Divide el primer valor por el segundo. Siempre devuelve un flotante.
  • División entera (//): Divide el primer valor por el segundo y redondea el resultado hacia abajo al entero más cercano.
  • Módulo (%): Devuelve el resto de la división entera entre el primer valor y el segundo.
  • Potencia (**): Eleva el primer valor a la potencia del segundo.
a = 10
b = 3

suma = a + b          # 13
resta = a - b         # 7
producto = a * b      # 30
division = a / b      # 3.3333333333333335
division_entera = a // b  # 3
resto = a % b         # 1
potencia = a ** b     # 1000

Operadores de Comparación

Los operadores de comparación se utilizan para comparar dos valores y devuelven un valor booleano (True o False). Aquí están los principales operadores de comparación en Python:

  • Igual que (==): Comprueba si los valores son iguales.
  • Diferente que (!=): Comprueba si los valores son diferentes.
  • Mayor que (>): Comprueba si el primer valor es mayor que el segundo.
  • Menor que (<): Comprueba si el primer valor es menor que el segundo.
  • Mayor o igual que (>=): Comprueba si el primer valor es mayor o igual que el segundo.
  • Menor o igual que (<=): Comprueba si el primer valor es menor o igual que el segundo.
x = 10
y = 5

igual_que = x == y               # False
diferente_que = x != y           # True
mayor_que = x > y                # True
menor_que = x < y                # False
mayor_o_igual_que = x >= y       # True
menor_o_igual_que = x <= y       # False

Operadores Lógicos

Los operadores lógicos se utilizan para combinar expresiones booleanas y devuelven un valor booleano. Aquí están los principales operadores lógicos en Python:

  • and (y): Devuelve True si ambas expresiones son verdaderas.
  • or (o): Devuelve True si al menos una de las expresiones es verdadera.
  • not (no): Devuelve el valor opuesto de la expresión.
a = True
b = False

resultado_and = a and b         # False
resultado_or = a or b           # True
resultado_not_a = not a         # False
resultado_not_b = not b         # True

Operadores de Pertenencia

Los operadores de pertenencia se utilizan para comprobar si un valor está presente en una secuencia, como una lista, tupla o cadena.

  • in: Devuelve True si el valor está presente en la secuencia.
  • not in: Devuelve True si el valor no está presente en la secuencia.
mi_lista = [1, 2, 3, 4, 5]

esta_en_lista = 3 in mi_lista         # True
no_esta_en_lista = 6 not in mi_lista  # True

mi_cadena = "Hola, Python!"

esta_en_cadena = "Python" in mi_cadena          # True
no_esta_en_cadena = "Java" not in mi_cadena     # True

Operadores de Identidad

Los operadores de identidad se utilizan para comparar si dos variables se refieren al mismo objeto en memoria.

  • is: Devuelve True si ambas variables apuntan al mismo objeto.
  • is not: Devuelve True si ambas variables no apuntan al mismo objeto.
a = [1, 2, 3]
b = a  # b apunta a la misma lista en memoria que a

es_mismo_objeto = a is b         # True

c = [1, 2, 3]

es_distinto_objeto = a is not c  # True

Operadores de Asignación

Los operadores de asignación se utilizan para asignar valores a variables.

  • = : Asignación básica.
  • += : Asignación con suma.
  • -= : Asignación con resta.
  • *= : Asignación con multiplicación.
  • /= : Asignación con división.
a = 10

a = 5   # Ahora a tiene el valor de 5
a += 2  # Ahora a tiene el valor de 7
a -= 3  # Ahora a tiene el valor de 4
a *= 2  # Ahora a tiene el valor de 8
a /= 4  # Ahora a tiene el valor de 2.0

Operador Ternario

El operador ternario nos permite escribir una expresión condicional de una forma muy concisa:

edad = 18

es_mayor_edad = True if edad >= 18 else False

En este caso, es_mayor_edad será True si la edad es mayor o igual a 18, y False en caso contrario.

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

Programación con Python: Variables

Las variables en Python son etiquetas o nombres que se utilizan para almacenar datos en la memoria del ordenador. Son fundamentales en la programación, ya que nos permiten guardar y manipular información de manera dinámica. A continuación explicaremos cómo declarar variables, los tipos de datos que pueden almacenar y proporcionaremos diversos ejemplos.

Declaración de variables

En Python no necesitas especificar el tipo de datos al declarar una variable, ya que es un lenguaje de tipado dinámico. Simplemente asignas un valor a un nombre de variable y Python determinará automáticamente el tipo de datos.

Para declarar una variable, se utiliza el símbolo = y luego se asigna el valor deseado:

# Declaración de variables
edad = 30
nombre = "Juan"
promedio = 9.5
es_estudiante = True

Tipos de datos básicos en Python

Números

  • int: Números enteros (por ejemplo, 10, -5, 0).
  • float: Números decimales (por ejemplo, 3.14, -2.5).
# Números
edad = 25
altura = 1.75

Texto

  • str: Cadenas de caracteres (por ejemplo, «Hola», ‘Python’).
# Texto
nombre = "María"
mensaje = '¡Hola, Python!'

Booleanos

  • bool: Puede ser True o False.
# Booleanos
es_estudiante = True
aprobo_examen = False

Operaciones con variables

Las variables se pueden utilizar en operaciones matemáticas y en la manipulación de datos:

# Operaciones con variables numéricas
a = 10
b = 5
suma = a + b
resta = a - b
producto = a * b
division = a / b
modulo = a % b
potencia = a ** b

# Operaciones con variables de texto (concatenación)
nombre = "Ana"
apellido = "Gómez"
nombre_completo = nombre + " " + apellido

# Operaciones con variables booleanas
es_dia_soleado = True
es_dia_frio = False
dia_ideal = es_dia_soleado and not es_dia_frio

Cambio del valor de una variable

Puedes cambiar el valor de una variable simplemente asignándole un nuevo valor:

edad = 30
print(edad)  # Salida: 30

edad = 40
print(edad)  # Salida: 40

Convenciones para nombrar variables

  • Los nombres de las variables deben ser descriptivos y estar en minúsculas.
  • Si un nombre de variable tiene varias palabras, se recomienda usar guiones bajos entre las palabras (snake_case).
  • Evita usar nombres reservados por Python, como if, else, for, while, etc.

Ejemplos:

# Ejemplo de nombres de variables apropiados
nombre_completo = "Juan Pérez"
numero_telefono = "1234567890"
total_puntos = 100

# Evitar nombres de variables no descriptivos
a = "Hola"
b = 50
x = True

Test

Evalúa tus conocimientos mediante este test que incluye preguntas relacionadas con esta unidad.

HTML. Unidad 8. Vídeo y audio.

Presentación

Infografía

Diapositivas y vídeo

A través de esta presentación, estas diapositivas, y este vídeo, te familiarizarás con los contenidos clave de esta unidad.

Introducción

Ahora que estamos cómodos añadiendo imágenes simples a una página web, el siguiente paso será empezar a agregar reproductores de audio y video a tu documento HTML. En este artículo veremos cómo hacerlo con los elementos  <video> y <audio>; luego terminaremos viendo como agregar subtítulos a nuestros videos.

Vídeo y audio en Internet

Los desarrolladores web han querido usar audio y video en la web por mucho tiempo, desde comienzos del 2000 cuando empezamos a tener un ancho de banda suficientemente rápido para soportar cualquier tipo de video (los archivos de video son mucho más grandes que texto o imágenes). En los inicios, las tecnologías web nativas como HTML no tenían el soporte para incrustar audio y video en la Web, tecnologías privadas (o basadas en plugins) como Flash (y después, Silverlight) se convirtieron populares para manipular este tipo de contenido. Este tipo de tecnología funcionó bien, pero tenía ciertos problemas, incluídos el no trabajar bien con las características de HTML/CSS, problemas de seguridad y problemas de accesibilidad.

Una solución nativa podría resolver mucho de esto si es implementado correctamente. Afortunadamente, unos pocos años después la especificación HTML5 tenía tales características agregadas, con los elementos <video> y <audio>, y algo nuevo JavaScript APIs para controlar estos. No veremos Javascript aquí — solo los fundamentos básicos que se pueden lograr con HTML.

No te enseñaremos como crear archivos de audio y video — eso requiere un conocimiento completamente diferente. Por el contrario, te proporcionamos archivos de audio y video de muestra con códigos de ejemplo disponibles en «https://fernandoruizrico.com/test-audio-and-video/» para que tu mismo experimentes, en caso de que no puedas conseguirlos por ti mismo.

El elemento <video>

El elemento <video> nos permite incrustar video fácilmente. De la misma manera que para el elemento <img>, el atributo src (source) contiene una ruta al video que deseas incrustar. Funciona de la misma manera. Los usuarios deben ser capaces de controlar la reproducción de video y audio (esto es especialmente crítico en personas que padecen  epilepsia). Se debe utilizar el atributo controls para incluir la interfaz de control del browser, o construir la nuestra utilizando la JavaScript API apropiada. Como mínimo la interfaz debe incluir una manera de empezar y terminar la reproducción, y ajustar el volumen. Un ejemplo muy simple podría ser el siguiente:

<video src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm" controls></video>

Podemos insertar un párrafo dentro de la etiqueta  <video> (denominado contenido de reserva) — y será mostrado si el navegador desde el que se está accediendo a la página no soporta el elemento <video>, permitiéndonos proveer un «fallback» para navegadores más antiguos. Se puede elegir cualquier contenido para dicho párrafo; en nuestro caso proporcionamos un enlace directo al archivo de vídeo, para que el usuario pueda al menos acceder de alguna manera, independientemente del navegador que esté usando.

<video src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm" controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

Atributos «width» y «height»

Podemos controlar el tamaño del vídeo con estos atributos o con CSS (esta es la opción más recomendable). En ambos casos, los vídeos mantienen su relación anchura – altura nativa. Si la relación de aspecto no se mantiene con los tamaños establecidos, el vídeo crecerá para rellenar el espacio horizontalmente y el el espacio sin rellenar sólo recibirá un color de fondo sólido de forma predeterminada. Por ejemplo, para establecer la anchura del vídeo a 720px y mantener la relación de aspecto, podemos utilizar un código similar al siguiente:

<video width="720"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" 
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

Ejercicio propuesto: Película de animación «Caminandes»

Crea una página web con el ejemplo anterior y copia el código tres veces para mostrar el mismo vídeo tres veces en total. Cambia el ancho para establecer un valor diferente para cada vídeo (1080, 720 y 480) y cambia también el atributo src para que corresponda con el de cada vídeo. Finalmente, verifica los resultados en tu navegador (actualiza la página web para asegurarte de que el navegador esté mostrando los últimos cambios en tu código). No olvides incluir todas las etiquetas HTML básicas necesarias y validar su código.

Vídeos:

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_480p.mp4

<video width="1080"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm" 
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

<video width="720"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" 
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

...

El atributo «poster»

Puedes especificar una URL para mostrar una imagen (atributo poster) hasta que el usuario reproduzca el vídeo. Si este atributo no se especifica, no se muestra nada hasta que el primer fotograma esté disponible, momento en el cual se mostrará esa imagen como póster.

<video width="1080"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm" 
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg"
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

Ejercicio propuesto: Película de animación «Caminandes»

Modifica el código del ejercicio anterior, donde tienes el mismo vídeo con tres tamaños diferentes. Ahora tiene que usar el atributo poster para configurar tres imágenes diferentes (puede encontrar debajo los enlaces a los carteles, que están disponibles en https://fernandoruizrico.com/test-audio-and-video/, o puedes usar otras imágenes que te gusten). Cuando termines, verifica los resultados en tu navegador (actualiza tu página web para asegurarte de que el navegador esté mostrando los últimos cambios en tu código). No olvides incluir todas las etiquetas HTML básicas necesarias y validar tu código.

Posters:

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/mine.png

https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/share.png

<video width="1080"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm" 
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg"
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

<video width="720"
       src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" 
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/mine.png"
       controls>
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

...

Compatibilidad con los navegadores

Normalmente se utilizan algunos códecs para comprimir vídeo y audio para conseguir que los archivos sean más manejables, ya que el audio y el vídeo sin procesar son excesivamente grandes. Cada navegador web admite una variedad de códecs, que se utilizan para convertir el audio y el vídeo comprimidos en datos binarios y viceversa. Cada códec ofrece sus propias características positivas y negativas que afectan a las decisiones sobre cuál utilizar. Para maximizar la probabilidad de que tu sitio web o aplicación funcione en el navegador de un usuario, es posible que debas proporcionar cada archivo multimedia en varios formatos. Si tu página web y el navegador del usuario no comparten un formato en común, los ficheros de audio o vídeo simplemente no se reproducirán.

Debemos tener en cuenta un aspecto adicional respecto a este tema: los navegadores móviles pueden admitir formatos adicionales no admitidos por sus equivalentes de escritorio, al igual que es posible que no admitan los mismos formatos que la versión de escritorio. Además de eso, tanto los navegadores de escritorio como los móviles pueden estar diseñados para gestionar la reproducción de medios (ya sea para todos los formatos o solo para tipos específicos que no pueden gestionar internamente). Esto significa que la compatibilidad con los ficheros depende en parte del software que haya instalado el usuario.

Entonces, ¿cómo gestionamos la compatibilidad de formatos? Echa un vistazo al código actualizado del ejemplo:

<video width="1080"
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/mine.png"
       controls>
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm"
    type="video/webm">
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.mp4"
    type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

Aquí hemos quitado el atributo src del elemento <video> y en su lugar incluimos elementos separados <source> que apuntan a sus propias fuentes. En este caso el navegador irá a los elementos <source> y reproducirá el primero de los elementos que soporte. En primer lugar intentará reproducir el vídeo utilizando el formato WebM, y si no lo reconoce como válido, entonces intentará reproducir el formato MP4. Incluir fuentes WebM y MP4 debería bastar para reproducir el video en la mayoría de los navegadores actuales. Pero en cualquier caso, si el navegador no soporta ninguno de los formatos especificados, también hemos incluido el mensaje de aviso con el enlace correspondiente.

Cada elemento  <source>  también tiene un atributo type . Es opcional, pero se recomienda que se incluyan, ya que contienen MIME types (en-US) de los archivos de vídeo y los navegadores pueden leerlos y omitir inmediatamente los vídeos que no soporten. Si no están incluidos, los navegadores cargarán e intentarán reproducir cada archivo hasta que encuentren uno que funcione, lo que llevará aún más tiempo y un consumo de recursos innecesario.

En este artículo sobre soporte de formatos multimedia puedes encontrar algunos de los MIME types (en-US) más comunes.

Ejercicio propuesto: Película de animación «CaminandeS»

Tienes que modificar el código del ejercicio anterior donde tienes tres vídeos que muestran la película animada «Caminandes», cada uno con un tamaño diferente y un póster diferente. Debes insertar ahora un par de elementos fuente para que los tres vídeos contengan enlaces para los códecs webm y mp4 (puedes encontrar los enlaces en el ejemplo que tienes a continuación y también en https://fernandoruizrico.com/test-audio-and -video/). Verifica los resultados en tu navegador y no olvides añadir todas las etiquetas HTML necesarias y validar tu código.

Fíjate que el ancho del vídeo se puede ajustar a través del atributo «width», y también vamos a utilizar el atributo «poster» para establecer la imagen que se mostrará antes de que se reproduzca cada vídeo:
<video width="1080"
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/mine.png"
       controls>
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.webm"
    type="video/webm">
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_1080p.mp4"
    type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p> 
</video>

<video width="720"
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/share.png"
       controls>
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm"
    type="video/webm">
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.mp4"
    type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

...

Ejercicio propuesto: Película de animación «Sintel»

Crea una nueva página web con el siguiente código para mostrar la película animada «Sintel». Después de eso, duplica el código un par de veces para mostrar tres vídeos en total. Cambia el tamaño de los videos a 1080, 720 y 480 y configura los elementos <source> en consecuencia (elimina también el antiguo atributo src, de modo que obtengas un código similar al que se muestra en el siguiente ejemplo). Finalmente, cambia la imagen del póster para que cada vídeo muestre una imagen diferente cuando se acabe de cargar la página. Puedes encontrar los enlaces a los vídeos y carteles en https://fernandoruizrico.com/test-audio-and-video/, y también aquí:

Vídeos (1080 px):

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-1080p.mp4

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-1080p.ogv

Vídeos (720 px):

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-720p.mp4

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-720p.ogv

Vídeos (480 px):

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-480p.mp4

https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-480p.ogv

Pósters:

https://fernandoruizrico.com/examples/test-media/video/sintel/stills/poster.jpg

https://fernandoruizrico.com/examples/test-media/video/sintel/stills/scales.png

https://fernandoruizrico.com/examples/test-media/video/sintel/stills/dragon.png

<video 
  width="1080" controls
  poster="https://fernandoruizrico.com/examples/test-media/video/sintel/stills/scales.png">
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-1080p.mp4"
    type="video/mp4">
  <source
    src="https://fernandoruizrico.com/examples/test-media/video/sintel/trailer/sintel_trailer-1080p.ogv"
    type="video/ogg">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

...

Otras funcionalidades del elemento <video>

Hay varias características adicionales que puedes incluir en un vídeo HTML5. Echa un vistazo al ejemplo que aparece a continuación:

<video controls width="720"
       autoplay loop muted preload="auto" 
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" type="video/webm">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.mp4" type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

El atributo «autoplay»

Este atributo booleano le indica al navegador que el audio o el vídeo deben empezar a reproducirse de inmediato, mientras se carga el resto de la página. Conviene puntualizar que se desaconseja utilizar la reproducción automática ya que los usuarios pueden encontrarlo un poco molesto. Puedes consultar este enlace (autoplay guide) para obtener información adicional sobre cómo usar este atributo de manera adecuada.

El atributo «loop»

Si lo activamos, el vídeo (o audio) comenzará a reproducirse de nuevo cada vez que se acabe. Esta funcionalidad también puede resultar molesta en ocasiones, por lo que se recomienda utilizarlo solo si es realmente necesario.

El atributo «muted»

Este atributo booleano indica la configuración predeterminada del audio contenido en el vídeo. Si está activado, el audio se silenciará inicialmente. Su valor predeterminado es falso, lo que significa que el audio se reproducirá cuando se reproduzca el vídeo.

El atributo «preload»

El objetivo de este atributo enumerado es proporcionar una sugerencia al navegador sobre qué cree el desarrollador que resultará en una mejor experiencia para el usuario . Puede tener uno de los siguientes valores:

  • «none»: sugiere bien que el desarrollador cree que el usuario no tendrá que consultar el vídeo, o que el servidor desea minimizar su tráfico; es decir, esta sugerencia indica que el vídeo no se debe almacenar en caché.
  • «metadata»: sugiere que aunque el autor piensa que el usuario no tendrá que consultar este vídeo, es razonable capturar los metadatos (p. ej. longitud).
  • «auto»: sugiere que el usuario necesita tener prioridad; es decir, esta sugerencia indica que, si es necesario, se puede descargar el vídeo completo, incluso aunque el usuario no vaya a usarlo.
  • la cadena vacía: que es un sinónimo del valor «auto».

Si no está configurado, su valor predeterminado está definido por el navegador (es decir, cada navegador puede elegir su propio valor predeterminado), aunque la especificación aconseje que se establezca a «metadata».

Ejercicio propuesto: atributos adicionales

Siguiendo los ejemplos anteriores, crea una nueva página web con tres vídeos cualquiera y establece diferentes valores de los siguientes atributos: «loop», «muted» y «preload». También puedes probar el atributo de reproducción automática, aunque debes tener en cuenta que algunos navegadores pueden tener esta función desactivada. Finalmente verifica los resultados en tu navegador y valida el código.

<video controls width="720"
       loop muted
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" type="video/webm">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.mp4" type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

<video controls width="720"
       loop preload="metadata"
       poster="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/stills/poster.jpg">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.webm" type="video/webm">
  <source src="https://fernandoruizrico.com/examples/test-media/video/caminandes-llamigos/caminandes_llamigos_720p.mp4" type="video/mp4">
  <p>Tu navegador no soporta vídeo en formato HTML5. Haz click <a href="https://fernandoruizrico.com/test-audio-and-video/">aquí</a> para poder visualizarlo.</p>
</video>

...

Ejercicio propuesto: Tus 10 vídeos preferidos

Crea una página web para mostrar los diez vídeos que más te gusten. Debes establecer al menos los atributos de «width» y «poster» y también el elemento de <source> para asegurarte de que todos se muestren de la manera correcta, como en los ejemplos anteriores.

Puedes encontrar vídeos de ejemplo en los siguientes enlaces: https://senkorasic.com/testmedia/, https://archive.org/details/BigBuckBunny_124, https://archive.org/download/ElephantsDream/, https://tools.woolyss.com/html5-audio-video-tester/, https://test-videos.co.uk/, http://losplayer.com/?page_id=1880, https://dafftube.org/video-links/, https://github.com/mediaelement/mediaelement-files, http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5, https://sample-videos.com/, http://samples.mplayerhq.hu/, https://www.clipcanvas.com/a/video-clip-formats-and-codec-samples, https://peach.blender.org/download/, https://download.blender.org/peach/bigbuckbunny_movies/, https://orange.blender.org/download/, https://github.com/mdn/learning-area/tree/master/html/multimedia-and-embedding/video-and-audio-content, etc.

El elemento <audio>

The HTML <audio> element is used to embed sound content in documents. It may contain one or more audio sources, represented using the src attribute or the <source> element: the browser will choose the most suitable one. It works just like the <video> element, with a few small differences as outlined below. A typical example might look like so:

<figure>
    <figcaption>Trance 2. Instrumental Background Music.</figcaption>
    <audio
        controls
        src="https://fernandoruizrico.com/examples/test-media/audio/Twisterium-Trance2.wav">
        <p>Your browser doesn't support HTML5 audio. Click <a href="https://fernandoruizrico.com/test-audio-and-video/">here</a>  para poder visualizarlo.</p>
    </audio>
</figure>

<figure>
    <figcaption>Space battle. Space Fantasy Spot Effect.</figcaption>
    <audio
        controls
        src="http://bbcsfx.acropolis.org.uk/assets/07042219.wav">
        <p>Your browser doesn't support HTML5 audio. Click <a href="http://bbcsfx.acropolis.org.uk">here</a> instead.</p>
    </audio>
</figure>

The above example shows simple usage of the <audio> element. In a similar manner to the <img> and <video> elements, we include a path to the media we want to embed inside the src attribute. We can include other attributes to specify information such as whether we want it to loop, whether we want to show the browser’s default audio controls, etc.

As with the <video> tag, the content inside the opening and closing <audio></audio> tags is shown as a fallback in browsers that don’t support the element.

This takes up less space than a video player, as there is no visual component — you just need to display controls to play the audio. Other differences from HTML video are as follows:

  • The <audio> element doesn’t support the width/height attributes — again, there is no visual component, so there is nothing to assign a width or height to.
  • It also doesn’t support the poster attribute — again, no visual component.

Ejercicio propuesto: ejemplos de audio

Following the previous example, create a web page to insert at least ten figures containing audio samples. Update the caption of each figure to show a brief description of each audio file, and check the results in your browser. Do not forget to add all necessary HTML basic tags and validate your code.

You can find thousands of audio samples at: http://bbcsfx.acropolis.org.uk/

El elemento <iframe>

By now you should really be getting the hang of embedding things into your web pages, including images, video and audio. At this point we will like to take somewhat of a sideways step, looking at an element that allow you to embed a wide variety of content types into your webpages: the <iframe> element.

Incrustar un vídeo de YouTube

In this section we are going to jump straight into an active learning example to immediately give you a real idea of just what embedding technologies are useful for. The online world is very familiar with Youtube, but many people don’t know about some of the sharing facilities it has available. Let’s look at how Youtube allows us to embed a video in any page we like using an <iframe>:

  1. First, go to Youtube and find a video you like.
  2. Below the video, you’ll find a Share button — select this to display the sharing options.
  3. Select the Embed button and you’ll be given some <iframe> code — copy this.
<figure>
    <figcaption>Nyan Cat [original].</figcaption>
    <iframe width="560" height="315" src="https://www.youtube.com/embed/QH2-TGUlwu4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>

Ejercicio propuesto: Tus 10 vídeos de YouTube preferidos

Following the previous example, create a web page to insert at least ten figures containing videos from Youtube. Update the caption of each figure to show a brief description of each video, and check the results in your browser. Do not forget to add all necessary HTML basic tags and validate your code.

Incrustar un mapa de Google Maps

You will also find quite interesting embedding a Google Map. Let’s see how to do this with an example:

  1. Go to Google Maps and find a map you like.
  2. Click on the «Hamburger Menu» (three horizontal lines) in the top left of the user interface.
  3. Select the Share or embed map option.
  4. Select the Embed map option, which will give you some <iframe> code — copy this.
<figure>
    <figcaption>IES San Vicente.</figcaption>
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3126.6024620057733!2d-0.5317505844743932!3d38.4044398796498!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd6233fea3991575%3A0xf28fcef8c48c1513!2sIES%20San%20Vicente!5e0!3m2!1ses!2ses!4v1601811180214!5m2!1ses!2ses" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
</figure>

Ejercicio propuesto: Tus 10 ubicaciones preferidas

Following the previous example, create a web page to insert at least ten figures containing locations from Google Maps. Update the caption of each figure to show a brief description of each location, and check the results in your browser. Do not forget to add all necessary HTML basic tags and validate your code.

Test

Comprueba tus conocimientos con este test sobre audio y vídeo y otros conceptos relacionados con esta unidad.

HTML. Unidad 6. Tablas.

Presentación

Infografía

Diapositivas y vídeo

A través de esta presentación, estas diapositivas, y este vídeo, te familiarizarás con los contenidos clave de esta unidad.

Introducción

Esta unidad te ayudará a comenzar con las tablas HTML. Vamos a exponer conceptos básicos como filas y celdas, encabezados, celdas que abarcan múltiples columnas y filas, y la forma de agrupar todas las celdas de una columna para aplicarles estilo en el futuro (utilizando CSS).

¿Qué es una tabla?

Una tabla es un conjunto estructurado de datos distribuidos en filas y columnas (datos tabulados). Una tabla permite buscar con rapidez y facilidad valores entre diferentes tipos de datos que indiquen algún tipo de conexión. Por ejemplo, una persona y su edad, o un horario, o información sobre diversos países, como se muestra en este ejemplo:

Países Capitales Población Idioma
USA Washington, D.C. 309 millones Inglés
Suecia Estocolmo 9 millones Sueco

Las tablas se utilizan con mucha frecuencia en la sociedad desde hace años, como lo demuestra este documento censal de los EUA de 1800:

Por lo tanto, no es de extrañar que los creadores de HTML proporcionen un medio con el que estructurar y presentar datos en tablas en la web.

¿Cómo crear una tabla?

Veamos un ejemplo práctico y construyamos una tabla simple.

1. Hola, soy tu primera celda. 2. Soy tu segunda celda. 3. Soy tu tercera celda. 4. Soy tu cuarta celda.
5. Segunda fila, primera celda. 6. Segunda fila, segunda celda. 7. Segunda fila, tercera celda. 8. Segunda fila, cuarta celda.

Construyamos la tabla paso a paso:

  1. El contenido de cada tabla está delimitado por las etiquetas <table> ... </table>:
<table>
    1. Hola, soy tu primera celda.
    2. Soy tu segunda celda.
    3. Soy tu tercera celda.
    4. Soy tu cuarta celda.
    5. Segunda fila, primera celda.
    6. Segunda fila, segunda celda.
    7. Segunda fila, tercera celda.
    8. Segunda fila, cuarta celda.
</table>
  1. El contenedor más pequeño dentro de una tabla es la celda, que se crea utilizando el elemento <td> (‘td’ significa ‘table data’). Pondremos el contenido de cada celda entre estas etiquetas:
<table>
    <td>1. Hola, soy tu primera celda.</td>
    <td>2. Soy tu segunda celda.</td>
    <td>3. Soy tu tercera celda.</td>
    <td>4. Soy tu cuarta celda.</td>
    <td>5. Segunda fila, primera celda.</td>
    <td>6. Segunda fila, segunda celda.</td>
    <td>7. Segunda fila, tercera celda.</td>
    <td>8. Segunda fila, cuarta celda.</td>
</table>
  1. Como se puede observar, las celdas no se colocan unas debajo de las otras, sino que se distribuyen automáticamente en la misma fila. Cada elemento <td> crea una celda individual, que se va colocando al final de la fila, haciendo que cada celda que añadamos incremente el tamaño de la fila. Para conseguir que la fila pare de crecer y las siguientes celdas se coloquen en una segunda fila, debemos usar el elemento <tr> (‘tr’ significa ‘table row’). Vamos a hacer esto ahora (encerraremos cada fila en un elemento <tr>, y dentro tendremos los elementos <td> con los contenidos individuales de cada celda):
<table>
    <!-- Primera fila -->
    <tr>
        <td>1. Hola, soy tu primera celda.</td>
        <td>2. Soy tu segunda celda.</td>
        <td>3. Soy tu tercera celda.</td>
        <td>4. Soy tu cuarta celda.</td>
    </tr>

    <!-- Segunda fila -->
    <tr>
        <td>5. Segunda fila, primera celda.</td>
        <td>6. Segunda fila, segunda celda.</td>
        <td>7. Segunda fila, tercera celda.</td>
        <td>8. Segunda fila, cuarta celda.</td>
    </tr>
</table>

Importante: Bordes de la tabla

Por defecto, el navegador no mostrará los bordes de las tablas. Para conseguir que se muestren los bordes, usaremos un poco de código CSS. De momento insertaremos el siguiente código en la sección <head> de cada fichero html que creemos (aprenderemos el significado de este código en otra unidad):

<head>
    ...
    <style>
        table {
            border-collapse: collapse;
        }
        table, th, td {
            border: 1px solid black;
        }
    </style>
</head>
<body>
    ...
</body>

Ejercicio propuesto: Tablas simples

Crea una nueva página web, copia y pega un par de veces la tabla del ejemplo anterior y cambia el contenido para obtener el siguiente resultado:

Importante: no olvides utilizar el código CSS del encabezado del documento para mostrar los bordes de la tabla.
uno dos tres cuatro
cinco seis siete ocho
uno dos tres
cuatro cinco seis
siete ocho nueve

Tablas con imágenes

Puedes insertar cualquier contenido dentro de las celdas de una tabla. Por ejemplo, imágenes:

<table>
    <tr>
        <td><img src="https://picsum.photos/id/10/300/200" /></td>
        <td><img src="https://picsum.photos/id/1000/200/200" /></td>
    </tr>
    <tr>
        <td><img src="https://picsum.photos/id/1003/200/200" /></td>
        <td><img src="https://picsum.photos/id/1011/300/200" /></td>
    </tr>
</table>

Ejercicio propuesto: Imágenes de prueba

Crea una tabla de dos columnas y al menos diez filas, e inserta varias imágenes, como se muestra en el ejemplo anterior (con bordes). Copia la misma tabla en un archivo nuevo y añade el código CSS necesario para observar el resultados ahora sin bordes.

Puedes usar por ejemplo imágenes que aparecen en «https://picsum.photos/images» . Sólo necesitas escoger una imagen y utilizar el «id» y el «size» correspondiente. Por ejemplo, «https://picsum.photos/id/1/200/200» es la imagen #1 (width=200px and height=200px). O «https://picsum.photos/id/103/300/200» es la imagen #103 (width=300px and height=200px).

Añadiendo encabezados con elementos <th>

Ahora prestemos atención a los encabezados de las tablas. Son celdas especiales que van al comienzo de una fila o columna y definen el tipo de datos que contiene esa fila o columna. Para ilustrar por qué son útiles, primero echemos un vistazo a la siguiente tabla:

Table without headers
Dog name Breed Age Eating Habits
Knocky Jack Russell 12 Eats everyone’s leftovers
Poppy Poodle 9 Nibbles at food
Buddy Streetdog 10 Hearty eater
Bailey Cocker Spaniel 5 Will eat till he explodes

Como podemos observar, aunque se puede distinguir perfectamente el contenido de la tabla, no resulta tan fácil hacer referencias cruzadas. Si los encabezados de columna y fila destacaran de alguna manera, podríamos interpretar más fácilmente el contenido de las celdas.

Para reconocer los encabezados de la tabla como encabezados, tanto visual como semánticamente, puedes usar el elemento <th> (‘th’ significa ‘table header’, encabezado de tabla). Funciona exactamente igual que un <td>, excepto que denota un encabezado, no una celda normal. Si cambiamos todos los elementos <td> de la tabla por elementos <th>, los datos que contienen se verán resaltados por defecto de alguna forma. Por ejemplo:

Tabla con encabezados
Nombre del perro Raza Edad Hábitos alimenticios
Knocky Jack Russell 12 Se come las sobras de todos
Poppy Caniche 9 Mordisquea la comida
Buddy Perro callejero 10 De buen comer
Bailey Cocker Spaniel 5 Comerá hasta explotar

En el futuro cambiaremos los estilos de los elementos <td> y <th> utilizando CSS. Por ahora, concentrémonos en el código HTML:

<table>
  <tr>
    <th>Nombre del perro</th>
    <th>Raza</th>
    <th>Edad</th>
    <th>Hábitos alimenticios</th>
  </tr>
  <tr>
    <th>Knocky</th>
    <td>Jack Russell</td>
    <td>12</td>
    <td>Se come las sobras de todos</td>
  </tr>
  <tr>
    <th>Poppy</th>
    <td>Caniche</td>
    <td>9</td>
    <td>Mordisquea la comida</td>
  </tr>
  <tr>
    <th>Buddy</th>
    <td>Perro callejero</td>
    <td>10</td>
    <td>De buen comer</td>
  </tr>
  <tr>
    <th>Bailey</th>
    <td>Cocker Spaniel</td>
    <td>5</td>
    <td>Comerá hasta explotar</td>
  </tr>
</table>

Ejercicio propuesto: Paseador de perros

Crea una página web con una tabla similar a la del ejemplo anterior, para guardar la información de todos los clientes de un paseador de perros. Primero debe agregar tres columnas adicionales (para mantener el nombre de los propietarios, sus números de teléfono y las fotos de los perros). Después de eso, debes insertar varias filas para mostrar los datos de al menos diez perros.

En este caso puedes utilizar otro sitio web para obtener imágenes de prueba sobre perros: «https://placedog.net/images«. Accede a esta URL y sigue las instrucciones que aparecen en la parte superior de la página para insertar cada imagen. Por ejemplo:
Nombre del perro Dueño Teléfono Raza Edad Hábitos alimenticios Foto
Knocky Fernando Ruiz 111222333 Jack Russell 12 Se come las sobras de todos
Poppy John Doe 222333444 Caniche 9 Mordisquea la comida
Buddy Peter Stark 333444555 Perro callejero 10 De buen comer
Bailey Steve Doe 666777888 Cocker Spaniel 5 Comerá hasta explotar

Añadir un título a tu tabla con <caption>

Puedes dar un título a tu tabla colocándolo dentro de un elemento <caption> y anidándolo dentro del elemento <table>. Debes ponerlo justo debajo de la etiqueta de apertura <table>:

<table>
  <caption>Dinosaurios en el período Jurásico</caption>

  ...
</table>

Como puedes deducir a partir del breve ejemplo anterior, el título debe contener una descripción del contenido de la tabla. Esto es útil para todos los lectores que deseen descubrir de un vistazo si la tabla les resulta útil mientras ojean la página, pero es útil especialmente para usuarios ciegos. En lugar de que un lector de pantalla lea el contenido de muchas celdas solo para averiguar de qué trata la tabla, el lector puede contar con el título para luego decidir si leer la tabla con mayor detalle.

Ejercicio propuesto: Tabla sencilla con título y encabezados

Crea una página web con una tabla similar a la siguiente e inserta algunas filas adicionales (al menos diez).

Utiliza un elemento <caption> para poner el texto «Tabla simple con encabezados», y utiliza el elemento <th> para los encabezados «Nombre» and «Apellidos» headers.
Tabla simple con encabezados
Nombre Apellidos
John Doe
Fernando Ruiz

Ejercicio propuesto: Lista de países

Crea una tabla con cinco columnas y al menos diez filas, e inserta los datos relacionados con varios países. Puedes enumerar, por ejemplo, los nombres de los países, sus capitales, su población, el idioma y varias imágenes, como hicimos en el ejemplo al principio de la unidad, pero añadiendo una nueva columna para mostrar una imagen. Tienes que usar encabezados de tabla (<th>) y un título (<caption>). Tu tabla se debería parecer a la que se muestra a continuación.

Puedes usar de nuevo la web «https://picsum.photos/images» para coger diversas imágenes que puedan resultar representativas de cada país.
Países que me gustan
Países Capitales Población Idioma Imágenes
EE. UU. Washington D. C. 309 millones Inglés
Suecia Estocolmo 9 millones Sueco

Ampliar las filas y las columnas

Para proporcionar control adicional sobre cómo las celdas se ajustan o se expanden sobre las columnas, podemos usar el atributo colspan en los elementos <th> y <td>. Este atributo nos permitirá especificar cuántas columnas debe ocupar una celda (el valor por defecto es 1). De forma similar, podemos utilizar el atributo rowspan para especificar sobre cuántas filas se extiende una determinada celda.

El siguiente ejemplo muestra una tabla muy sencilla que enumera los nombres de las personas junto con información diversa sobre la membresía en un club. Hay solo cuatro filas (incluida una fila de encabezado), cada una con cuatro columnas (incluida una columna de encabezado):

Nombre ID Miembro desde Saldo
Margaret Nguyen 427311 0.00
Edvard Galinski 533175 37.00
Hoshi Nakamura 601942 15.00
<table>
  <tr>
    <th>Nombre</th>
    <th>ID</th>
    <th>Miembro desde</th>
    <th>Saldo</th>
  </tr>
  <tr>
    <td>Margaret Nguyen</td>
    <td>427311</td>
    <td><time datetime="2010-06-03">3 de junio de 2010</time></td>
    <td>0.00</td>
  </tr>
  <tr>
    <td>Edvard Galinski</td>
    <td>533175</td>
    <td><time datetime="2011-01-13">13 de enero de 2011</time></td>
    <td>37.00</td>
  </tr>
  <tr>
    <td>Hoshi Nakamura</td>
    <td>601942</td>
    <td><time datetime="2012-07-23">23 de julio de 2012</time></td>
    <td>15.00</td>
  </tr>
</table>

Añadamos ahora otra columna que muestre la fecha en que finalizó la membresía de un usuario, junto con un encabezado sobre las fechas de «afiliación» y «cancelada» llamada «Fechas de membresía». Esto implica agregar intervalos de filas y columnas a la tabla, de modo que las celdas de encabezado puedan terminar en los lugares correctos. Veamos primero cómo quedaría la tabla:

Nombre ID Fechas de membresía Saldo
Alta Baja
Margaret Nguyen 427311 n/a 0.00
Edvard Galinski 533175 37.00
Hoshi Nakamura 601942 n/a 15.00

Observa que el área de encabezado aquí ocupa en realidad dos filas, una con los encabezados «Nombre», «ID», «Fechas de membresía» y «Saldo», y la otra con los encabezados «Afiliación» y «Cancelado», que son los subtítulos que aparecen debajo de «Fechas de membresía». Esto se logra mediante:

  • Poniendo los encabezados de la primera fila («Name», «ID», y «Balance») en una celda que se expanda a la fila siguiente, utilizando el atributo rowspan, de forma que tengan una altura de dos filas.
  • Poniendo el encabezado «Membership Dates» de la primera fila en una celda que se expanda a la siguiente columna usando el atributo colspan attribute, que provocará que el encabezado tenga una anchura de dos columnas.
  • Creando una segunda fila de elementos <th> que contenga los encabezados «Joined» y «Canceled». Como las otras celdas ya están ocupadas por sus equivalentes en la primera fila, y se expanden a la segunda, las nuevas celdas se deberían colocar correctamente debajo del encabezado «Membership Dates».

El código HTML es similar al del ejemplo anterior, excepto que debemos añadir una nueva columna en cada fila, y también tenemos que cambiar el encabezado, para que quede de la siguiente forma:

<table>
  <tr>
    <th rowspan="2">Nombre</th>
    <th rowspan="2">ID</th>
    <th colspan="2">Fechas de membresía</th>
    <th rowspan="2">Saldo</th>
  </tr>
  <tr>
    <th>Alta</th>
    <th>Baja</th>
  </tr>
  <tr>
    <th>Margaret Nguyen</th>
    <td>427311</td>
    <td><time datetime="2010-06-03">3 de junio de 2010</time></td>
    <td>n/a</td>
    <td>0.00</td>
  </tr>
  <tr>
    <th>Edvard Galinski</th>
    <td>533175</td>
    <td><time datetime="2011-01-13">13 de enero de 2011</time></td>
    <td><time datetime="2017-04-08">8 de abril de 2017</time></td>
    <td>37.00</td>
  </tr>
  <tr>
    <th>Hoshi Nakamura</th>
    <td>601942</td>
    <td><time datetime="2012-07-23">23 de julio de 2012</time></td>
    <td>n/a</td>
    <td>15.00</td>
  </tr>
</table>

Las diferencias que importan aquí (relativas a la expansión de filas y columnas) se encuentran en las primeras líneas del código del ejemplo anterior. Simplemente utilizamos rowspan para conseguir que los encabezados «Name», «ID», y «Balance» ocupen dos filas en vez de una, y usamos colspan para conseguir que el encabezado «Membership Dates» se extienda a lo largo de dos columnas.

Ejercicio propuesto: Tu horario

Crea una página web para mostrar tu horario del instituto. Deberías crear una tabla similar a la que se muestra a continuación.

Se deben utilizar elementos <th> para los encabezados, y el atributo colspan para los recreos. También puedes usar el elemento <strong> para resaltar el nombre de la asignatura de cada celda.
Lunes Martes Miércoles Jueves Viernes
07:55h Seguridad Informática
Peter Williams
Seguridad Informática
Peter Williams
Seguridad Informática
Peter Williams
08:50h Servicios de Red
Samuel Holland
Seguridad Informática
Peter Williams
Servicios de Red
Samuel Holland
Seguridad Informática
Peter Williams
09:45h Sistemas Operativos de Red
Lucy Scott
Servicios de Red
Samuel Holland
Aplicaciones Web
Fernando Ruiz
Servicios de Red
Samuel Holland
Servicios de Red
Samuel Holland
10:40h D E S C A N S O
11:00h Sistemas Operativos de Red
Lucy Scott
Sistemas Operativos de Red
Lucy Scott
Empresa e Iniciativa Emprendedora
Rick Harris
Aplicaciones Web
Fernando Ruiz
Servicios de Red
Samuel Holland
11:55h Empresa e Iniciativa Emprendedora
Rick Harris
Sistemas Operativos de Red
Lucy Scott
Sistemas Operativos de Red
Lucy Scott
Aplicaciones Web
Fernando Ruiz
Aplicaciones Web
Fernando Ruiz
12:50h D E S C A N S O
13:10h Servicios de Red
Samuel Holland
Empresa e Iniciativa Emprendedora
Rick Harris
Sistemas Operativos de Red
Lucy Scott
Sistemas Operativos de Red
Lucy Scott
Aplicaciones Web
Fernando Ruiz
14:05h Servicios de Red
Samuel Holland
Aplicaciones Web
Fernando Ruiz
Sistemas Operativos de Red
Lucy Scott

Estructurar la tabla con <thead>, <tbody> and <tfoot>

A medida que la estructura de las tablas se vuelve más compleja, es útil darles una estructura más definida. Una forma clara de hacerlo es con <thead><tfoot> y <tbody>, que te permiten marcar un encabezado, un pie de página y una sección del cuerpo de la tabla.

El encabezado de la tabla
Primera celda del cuerpo de la tabla Segunda celda del cuerpo de la tabla
<table>
    <thead>
        <tr>
            <th colspan="2">El encabezado de la tabla</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Primera celda del cuerpo de la tabla</td>
            <td>Segunda celda del cuerpo de la tabla</td>
        </tr>
    </tbody>
</table>

Estos elementos no mejoran las características de accesibilidad de la tabla para los usuarios de lectores de pantalla ni su aspecto visual en sí. Sin embargo, son muy útiles para la aplicación de estilo y la compaginación, porque actúan como soportes útiles para añadir CSS a tu tabla. Como ejemplos interesantes, en el caso de una tabla extensa, puedes hacer que el encabezado y el pie de página se repitan en cada página impresa, y también que el cuerpo de la tabla se muestre en una sola página y desplazarte por los contenidos arriba y abajo con la barra de desplazamiento.

Para utilizar todos estos elementos solo debes tener en cuenta las siguientes consideraciones:

  • El elemento <thead> debe delimitar el encabezado de la tabla; esta suele ser la primera fila, que contiene los encabezados de las columnas, pero no siempre es así. Si utilizas los elementos <col>/<colgroup>, el encabezado de la tabla debe estar justo debajo.
  • El elemento <tfoot> delimita la parte de la tabla correspondiente al pie de página; esta podría ser una fila final con elementos en las filas anteriores. Puedes incluir el pie de página de la tabla justo en la parte inferior de la tabla, donde esperarías que esté, o justo debajo del encabezado (y el navegador lo mostrará aun así en la parte inferior de la tabla).
  • El elemento <tbody> delimita las otras partes del contenido de la tabla que no están en el encabezado o en el pie de página de la tabla. Aparecerá debajo del encabezado de la tabla o, a veces, en el pie de página, según cómo hayas decidido estructurarlo.

Los elementos <thead> +<tbody>

Añadamos por ejemplo los elementos <thead> y <tbody> a la tabla de los miembros del club:

Nombre ID Fechas de membresía Saldo
Alta Baja
Margaret Nguyen 427311 n/a 0.00
Edvard Galinski 533175 37.00
Hoshi Nakamura 601942 n/a 15.00
<table>
  <thead>
    <tr>
      <th rowspan="2">Nombre</th>
      <th rowspan="2">ID</th>
      <th colspan="2">Fechas de membresía</th>
      <th rowspan="2">Saldo</th>
    </tr>
    <tr>
      <th>Alta</th>
      <th>Baja</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Margaret Nguyen</th>
      <td>427311</td>
      <td><time datetime="2010-06-03">3 de junio de 2010</time></td>
      <td>n/a</td>
      <td>0.00</td>
    </tr>
    <tr>
      <th scope="row">Edvard Galinski</th>
      <td>533175</td>
      <td><time datetime="2011-01-13">13 de enero de 2011</time></td>
      <td><time datetime="2017-04-08">8 de abril de 2017</time></td>
      <td>37.00</td>
    </tr>
    <tr>
      <th scope="row">Hoshi Nakamura</th>
      <td>601942</td>
      <td><time datetime="2012-07-23">23 de julio de 2012</time></td>
      <td>n/a</td>
      <td>15.00</td>
    </tr>
  </tbody>
</table>

Ejercicio propuesto: Miembros de un club

Crea una página web para mostrar una lista con los miembros de un club, tal como lo hemos hecho en el ejemplo anterior. Puede usar el mismo código fuente que se explicó anteriormente, pero debes añadir un par de columnas: una para escribir la dirección de correo electrónico de cada miembro y la otra para mostrar sus fotos. También debes añadir varias filas a la tabla para que contenga al menos diez miembros del club (puede usar nombres, fechas y saldos aleatorios).

Los elementos <thead> +<tbody> +<tfoot>

Ahora vamos a ver todos estos nuevos elementos en acción con otra tabla, donde usaremos todas las secciones posibles (<thead>, <tbody> y <tfoot>). Echa un vistazo al siguiente ejemplo:

Cómo decidí gastar mi dinero
Compra Lugar Fecha Valoración Coste (€)
TOTAL 118
Corte de pelo Peluquería 12/20 Buena idea 30
Lasaña Restaurante 12/20 Arrepentido 18
Zapatos Zapatería 13/20 Muy arrepentido 65
Pasta de dientes Supermercado 13/20 Bien 5

Debemos poner las filas de los encabezados dentro del elemento <thead>, la fila de la suma dentro de un elemento <tfoot>, y el resto del contenido dentro de un elemento <tbody>. Verás que añadiendo el elemento <tfoot> provoca que la fila de la suma se coloque al final de la tabla. Y para acabar, añadiremos el atributo colspan para conseguir que la celda de la suma se expanda por las cuatro primeras columnas. De esta forma, el número aparece debajo de la columna de costes.

<figure>
    <table>
        <caption>Cómo decidí gastar mi dinero</caption>
        <thead>
            <tr>
                <th>Compra</th>
                <th>Lugar</th>
                <th>Fecha</th>
                <th>Valoración</th>
                <th>Coste (€)</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td colspan="4">TOTAL</td>
                <td>118</td>
            </tr>
        </tfoot>
        <tbody>
            <tr>
                <td>Corte de pelo</td>
                <td>Peluquería</td>
                <td>12/20</td>
                <td>Buena idea</td>
                <td>30</td>
            </tr>
            <tr>
                <td>Lasaña</td>
                <td>Restaurante</td>
                <td>12/20</td>
                <td>Arrepentido</td>
                <td>18</td>
            </tr>
            <tr>
                <td>Zapatos</td>
                <td>Zapatería</td>
                <td>13/20</td>
                <td>Muy arrepentido</td>
                <td>65</td>
            </tr>
            <tr>
                <td>Pasta de dientes</td>
                <td>Supermercado</td>
                <td>13/20</td>
                <td>Bien</td>
                <td>5</td>
            </tr>
        </tbody>
    </table>
</figure>

Ejercicio propuesto: Cómo gastar tu dinero

Crea una página web para especificar cómo gastarías tu dinero. Puedes usar el mismo código fuente que en el ejemplo anterior, pero debes realizar los siguientes cambios: agrega varias filas con cualquier cosa que te gustaría hacer (al menos diez filas), y finalmente en la columna «Ubicación» debes usar imágenes en lugar de texto.

Puedes acceder de nuevo a la página web «https://picsum.photos/images» para obtener imágenes de tus sitios preferidos.

Ejercicio propuesto: Títulos

Añade títulos a las tablas que has creado anteriormente y que aún no tienen ningún título. No olvides volver a validar tu código.

Ejercicio propuesto: Estructura de tabla

Añade secciones de encabezado, pie y cuerpo a todas las tablas que hayas creado en ejercicios anteriores y aún no tengan esas secciones. No olvides volver a validar tu código.

Test

Comprueba tus conocimientos con este test sobre tablas y otros conceptos relacionados con esta unidad.

HTML. Unidad 10. Formularios avanzados.

Presentación

Infografía

Diapositivas y vídeo

A través de esta presentación, estas diapositivas, y este vídeo, te familiarizarás con los contenidos clave de esta unidad.

Introducción

Esta unidad profundiza en la creación de formularios HTML avanzados, priorizando una estructura semántica correcta mediante el uso de elementos como <fieldset> y <legend> para agrupar controles y mejorar tanto la usabilidad como la accesibilidad para tecnologías de asistencia. A través de ejemplos prácticos, como un formulario de pago, se enseña a organizar la información en secciones lógicas utilizando etiquetas estándar de bloque y atributos específicos para validar datos. Además, el contenido abarca la interacción real con motores de búsqueda (como Google o Bing) mediante la manipulación del atributo action y el uso de campos ocultos (input type="hidden") y menús desplegables para enviar parámetros complejos por la URL, permitiendo funcionalidades como la búsqueda específica de imágenes o el filtrado de resultados por tamaño, color y licencia.

Cómo estructurar un formulario HTML

Una vez examinados los conceptos básicos, vamos a ver más en detalle los elementos que se utilizan para proporcionar estructura y significado a las diferentes partes de un formulario. La flexibilidad que presentan los formularios los convierte en una de las estructuras más complejas y completas en HTML, puesto que puedes crear cualquier tipo de formulario básico a partir de los elementos y atributos destinados a esta función. El uso de una estructura correcta al crear un formulario HTML te ayudará a garantizar que el formulario presente las características de usabilidad y accesibilidad adecuadas.

El elemento <form>

Tal como explicamos en la unidad anterior, el elemento <form> se utiliza para definir un formulario y los atributos que determinan su comportamiento. Cada vez que desees crear un formulario HTML, debes empezar utilizando este elemento y anidando todo el contenido dentro de él.

Es posible usar controles de formulario fuera de un elemento <form>. Si lo haces, por defecto ese control no tendrá nada que ver con ningún formulario específico, a menos que lo asocies a algún formulario con el atributo form. Esto se introdujo para permitir vincular explícitamente un control a un formulario, incluso si no está dentro de él.

A continuación vamos a exponer los elementos que se pueden utilizar en un formulario.

Los elementos <fieldset> y <legend>

El elemento <fieldset> es una forma cómoda de crear grupos de controles de formulario (también denominados widgets) que comparten el mismo propósito, con fines semánticos y de aplicación de estilo. Puedes etiquetar un elemento <fieldset> incluyendo un elemento  <legend>  justo debajo de la etiqueta de apertura <fieldset>. El contenido textual del elemento <legend> describe formalmente el propósito del elemento <fieldset> que está incluido dentro.

Para lograr la máxima usabilidad/accesibilidad, se recomienda rodear cada lista de ítems relacionados con un <fieldset>, acompañado con un título dentro de un elemento <legend> que proporcione una descripción general de la lista. Cada uno de los ítems de esa lista estará compuesto a su vez por pares individual de elementos <label>/<input>. Por ejemplo, si utilizamos varios botones de radio o casillas de verificación para elegir una o varias opciones relativas a un dato específico, habitualmente colocaremos un <label> inmediatamente después cada opción, e indicaremos el propósito del grupo de botones de radio o casillas de verificación mediante el elemento <legend>.

Muchas tecnologías de asistencia utilizarán el elemento <legend> como si fuera una parte de la etiqueta de cada control dentro del elemento <fieldset> correspondiente. Por ejemplo, algunos lectores de pantalla como Jaws y NVDA leerán el contenido de la leyenda antes de decir la etiqueta de cada control.

Aquí tenemos un pequeño ejemplo:

<form>
  <fieldset>
    <legend>Tamaño del zumo de frutas</legend>
    <p>
      <label><input type="radio" name="size" value="small">Pequeño</label>
    </p>
    <p>
      <label><input type="radio" name="size" value="medium">Mediano</label>
    </p>
    <p>
      <label><input type="radio" name="size" value="large">Grande</label>
    </p>
  </fieldset>
</form>
Tamaño del zumo de frutas

El caso de uso que se muestra en este ejemplo es uno de los más habituales. Cada vez que tengamos un conjunto de botones de opción o casillas de verificación, deberíamos anidarlos dentro de un elemento <fieldset>. De esta forma, al leer el formulario anterior, un lector de pantalla dirá «Tamaño del zumo de fruta: pequeño» para el primer control de formulario, «Tamaño del zumo de fruta: mediano» para el segundo y «Tamaño del zumo de fruta: grande» para el tercero.

El elemento <fieldset> también se puede usar en muchos otros casos, simplemente con el propósito de dividir un formulario en diferentes secciones. Idealmente, si un formulario se alarga mucho, podremos mejorar su usabilidad colocando las diferentes opciones que estén relacionadas dentro de secciones independientes.

Ejercicio propuesto: Bebida y hamburguesa

Utilizando el código del ejemplo anterior, crea una página web para elegir el tamaño tanto de una bebida como de una hamburguesa, ambas opciones dentro de un <fieldset> diferente con el <legend> correspondiente. Además, como se hizo antes, el usuario debería poder elegir entre tres tamaños diferentes: pequeño, mediano y grande:

Bebida

Hamburguesa

Un formulario con secciones

Es importante recordar que el marcado de un formulario se realiza utilizando HTML. Esto significa que podemos utilizar cualquiera de las etiquetas habituales para organizar cada una de las opciones y conseguir que el formulario sea más legible. Por ejemplo, como podemos ver en los ejemplos anteriores, es una práctica común anidar cada etiqueta y su widget dentro de elementos <p>. También se recomienda el uso de listas para estructurar múltiples casillas de verificación o botones de radio.

Además del elemento <fieldset>, también es una práctica común usar títulos HTML (por ejemplo, <h1>, <h2>) y seccionamiento (por ejemplo, <section>) para estructurar formularios complejos. Depende de cada desarrollador encontrar un estilo de codificación que permita obtener formularios accesibles y con una alta usabilidad. Cada sección que agrupe cierta funcionalidad debe estar contenida en un elemento <section> separado, con elementos <fieldset> para agrupar por ejemplo botones de radio que nos permitan seleccionar un valor específico para una determinada opción.

Pongamos estas ideas en práctica y construyamos un formulario un poco más complejo: un formulario de pago. Este formulario contendrá más tipos de controles que el ejemplo anterior. Sigue las instrucciones que se muestran a continuación y fíjate en los elementos que estamos usando para estructurar el formulario.

  1. Primero, crearemos el formulario añadiendo el elemento externo <form>:
<form>
    ...
</form>
  1. Dentro de las etiquetas <form>, añadiremos un encabezado y un párrafo para indicar a los usuarios cuáles serán los campos obligatorios:
<form>
  <h1>Formulario de Pago</h1>
  <p>Los campos obligatorios se han marcado con <strong>*</strong>.</p>
  ...
</form>
  1. También añadiremos un simple <button> de tipo submit, en la parte inferior, para enviar los datos del formulario:
<form>
  <h1>Formulario de Pago</h1>
  <p>Los campos obligatorios se han marcado con <strong>*</strong>.</p>
  ...
  <p><button type="submit">Validar el pago</button></p>
</form>
  1. Luego añadiremos una sección más grande de código en el formulario, debajo de nuestra entrada anterior. Aquí verás que estamos encerrando los campos de información de contacto dentro de un elemento <section> distinto. Además, tenemos un conjunto de tres botones de radio, cada uno de los cuales colocamos en una nueva línea. También tenemos dos <input> de texto estándar y sus elementos <label> asociados, cada uno contenido dentro de un <p>, y un input de contraseña para introducir una clave:
<form>
  <h1>Formulario de Pago</h1>
  <p>Los campos obligatorios se han marcado con <strong>*</strong>.</p>
  <section><fieldset>
    <legend><h2>Información de contacto</h2></legend>
    <fieldset>
      <legend>Tratamiento</legend>
      <label><input type="radio" name="title" value="sr">Sr/Sra</label><br>
      <label><input type="radio" name="title" value="dr">Dr/Dra</label><br>
      <label><input type="radio" name="title" value="otro">Otro</label> <br>
    </fieldset>
    <p><label>Nombre: <input type="text" name="name" required> *</label></p>
    <p><label>Correo electrónico: <input type="email" name="email" required> *</label></p>
    <p><label>Contraseña: <input type="password" name="password" required> *</label></p>
  </fieldset></section>
  ...
  <p><button type="submit">Validar el pago</button></p>
</form>
  1. El segundo elemento <section> de nuestro formulario contiene la información de pago. Tenemos tres controles distintos junto con sus etiquetas, cada uno contenido dentro de un <p>. El primero es un menú desplegable (<select>) para seleccionar el tipo de tarjeta de crédito. El segundo es un elemento <input> de tipo tel, para introducir un número de tarjeta de crédito. Aunque podríamos haber usado el tipo número, no queremos la interfaz de usuario del spinner del número. El último es un elemento <input> de tipo fecha, para introducir la fecha de vencimiento de la tarjeta. Este campo aparecerá con un widget de selector de fecha en navegadores compatibles y se revertirá a una entrada de texto normal en navegadores no compatibles.
<form>
  <h1>Formulario de Pago</h1>
  <p>Los campos obligatorios se han marcado con <strong>*</strong>.</p>

  <section><fieldset>
    <legend><h2>Información de contacto</h2></legend>
    <fieldset>
      <legend>Tratamiento</legend>
      <label><input type="radio" name="title" value="sr">Sr/Sra</label><br>
      <label><input type="radio" name="title" value="dr">Dr/Dra</label><br>
      <label><input type="radio" name="title" value="otro">Otro</label> <br>
    </fieldset>
    <p><label>Nombre: <input type="text" name="name" required /> *</label></p>
    <p><label>Correo electrónico: <input type="email" name="email" required> *</label></p>
    <p><label>Contraseña: <input type="password" name="password" required> *</label></p>
  </fieldset></section>

  <section><fieldset>
    <legend><h2>Información de pago</h2></legend>
    <p><label>Tipo de tarjeta:
      <select name="card_type">
        <option value="visa">Visa</option>
        <option value="mc">Mastercard</option>
        <option value="amex">American Express</option>
      </select>
    </label></p>
    <p><label>Número de tarjeta: <input type="tel" name="card_number" required> *
    </label></p>
    <p><label>Fecha de vencimiento: <input type="date" name="expiration" required> *
    </label></p>
  </fieldset></section>

  <p><button type="submit">Validar el pago</button></p>
</form>

Ejercicio propuesto: Formulario de pago

Utilizando el código del ejemplo anterior, crea un formulario de pago más sofisticado. Dentro de la sección «Información de contacto», debes añadir un grupo de botones de opción para que el usuario pueda seleccionar su estado (ya sea «Estudiante», «Profesor» u «Otro») y un nuevo campo de texto para introducir el número de teléfono. Y dentro de la sección «Información de pago» tienes que añadir una nueva casilla de selección para que el usuario pueda elegir el tipo de pago preferido (ya sea «Tarjeta de crédito» o «Paypal») y un nuevo campo de correo electrónico para introducir la cuenta Paypal:

FORMULARIO DE PAGO (Los campos obligatorios se han marcado con *)

Información de contacto
Profesión


Tratamiento






Información de pago






Un ejemplo real: formularios de buscadores

Buscando texto

Ahora vamos a crear un formulario muy sencillo que proporcionará todos los datos necesarios (un texto simple) para realizar búsquedas en algunos de los buscadores más conocidos:

<form action="https://google.com/search" method="GET">
  <label>Google: <input type="text" name="q" required /></label>
  <button type="submit">Buscar</button>
</form>
...
<form action="https://duckduckgo.com/" method="GET">
  <label>DuckDuckGo: <input type="text" name="q" required /></label>
  <button type="submit">Buscar</button>
</form>
...
<form action="https://bing.com/search" method="GET">
  <label>Bing: <input type="text" name="q" required /></label>
  <button type="submit">Buscar</button>
</form>

Habrás notado que cuando presionas el botón de enviar, la consulta (parámetro q) se incluye en la URL, y de esta manera el motor de búsqueda sabrá qué buscar. Por ejemplo, si estamos buscando la palabra «perros» en Google, la URL resultante al enviar el formulario será esta: https://www.google.es/search?q=dog.

Ejercicio propuesto: Búsqueda de texto

Usando el ejemplo del formulario anterior para buscar información en Google, DuckDuckGo y Bing, desarrolla una página web similar a la de abajo para buscar información en varios motores de búsqueda (al menos cinco).

La única diferencia de un formulario a otro es el valor del atributo action (“https://google.com/search”, “https://duckduckgo.com/”, “https://bing.com/search”, “https://www.ecosia.org/search”, “https://search.givewater.com/serp”, etc.). Esta dirección se puede adivinar echando un vistazo a la URL cuando estás utilizando cada motor de búsqueda en particular.

BÚSQUEDA DE TEXTO

Buscando imágenes

Ahora cambiaremos un poco el código para que los resultados proporcionados por los motores de búsqueda sean imágenes en lugar de texto. En algunos casos solo necesitamos cambiar el atributo action, pero a veces tenemos que agregar algunos campos adicionales:

<form action="https://google.com/search" method="GET">
  <label>Google: <input type="text" name="q" required></label>
  <input type="hidden" name="tbm" value="isch">
  <button type="submit">Buscar</button>
</form>
...
<form action="https://duckduckgo.com/" method="GET">
  <label>DuckDuckGo: <input type="text" name="q" required></label>
  <input type="hidden" name="iax" value="images">
  <input type="hidden" name="ia" value="images">
  <button type="submit">Buscar</button>
</form>
...
<form action="https://search.givewater.com/serp" method="GET">
  <label>giveWater: <input type="text" name="q" required></label>
  <input type="hidden" name="qc" value="images">
  <button type="submit">Buscar</button>
</form>

Podrás apreciar que cuando presionas el botón de enviar, esos campos ocultos (que no son introducidos por el usuario) se incluyen automáticamente en la URL para que el motor de búsqueda sepa que tiene que mostrar imágenes en lugar de texto. De esta manera, en este ejemplo estamos pasando dos parámetros: q (la cadena de búsqueda) y tbm (para buscar imágenes). Por ejemplo, si estamos buscando imágenes sobre perros en Google, la URL resultante al enviar el formulario será esta: https://www.google.es/search?q=dog&tbm=isch.

Ejercicio propuesto: Búsqueda de imágenes

Usando el código del ejercicio anterior, desarrolla una nueva página web para buscar imágenes en varios motores de búsqueda (al menos cinco).

Para buscar imágenes usando Bing y Ecosia, solo tienes que usar el valor correcto para el atributo action (“https://bing.com/images/search”, “https://www.ecosia.org/images”). Solo tienes que usar los campos ocultos para Google (tbm), DuckDuckGo (iax, ia) y giveWater (qc), como se hizo en el ejemplo anterior. Tanto las direcciones como los campos ocultos se pueden adivinar echando un vistazo a la URL cuando estás utilizando cada motor de búsqueda en particular.

BÚSQUEDA DE IMÁGENES

Eligiendo entre búsqueda de texto e imágenes

Ahora centrémonos en el motor de búsqueda de Google y avancemos un paso más para añadir una casilla de verificación que le dé al usuario la opción de elegir entre buscar texto o imágenes:

<form action="https://google.com/search">
  <label>Google: <input type="text" name="q" required /></label>
  <label>Buscar imágenes <input type="checkbox" name="tbm" value="isch" /></label>
  <button>Buscar</button>
</form>

Ejercicio propuesto: Texto o imágenes

Desarrolla una página web para buscar texto o imágenes en los motores de búsqueda de Google y giveWater. Debes proporcionar al usuario una casilla de verificación para que pueda cambiar fácilmente de un tipo a otro:

BÚSQUEDA DE TEXTO

Filtrando los resultados

Finalmente, centrémonos nuevamente en el motor de búsqueda de Google para añadir varios controles de manera que el usuario pueda filtrar los resultados al buscar imágenes. También añadiremos un botón de reinicio para establecer los valores predeterminados:

<fieldset>
<form action="https://google.com/search" method="GET">
  <p>Buscar: <input type="text" name="q" class="big" required></p>

  <fieldset>
    <legend>Tamaño</legend>
    <select name="tbs"> 
      <option selected disabled>Cualquier tamaño</option>
      <option value="isz:l">Grande</option>
      <option value="isz:m">Mediano</option>
      <option value="isz:i">Icono</option>
    </select>
  </fieldset>
  <fieldset>
    <legend>Color</legend>        
    <select name="tbs"> 
      <option selected disabled>Cualquier color</option>
      <option value="ic:color">Color</option>
      <option value="ic:gray">Blanco y negro</option>
      <option value="ic:trans">Transparente</option>
   </select>
  </fieldset> 
  <fieldset>       
    <legend>Tipo</legend>        
    <select name="tbs"> 
      <option selected disabled>Cualquier tipo</option>
      <option value="itp:clipart">Clip art</option>
      <option value="itp:lineart">Dibujo lineal</option>
      <option value="itp:animated">GIF</option>
    </select>
  </fieldset>  
  <fieldset>     
    <legend>Fecha</legend>        
    <select name="tbs"> 
      <option selected disabled>Cualquier fecha</option>
      <option value="qdr:d">Últimas 24 horas</option>
      <option value="qdr:w">Última semana</option>
    </select>
  </fieldset> 
  <fieldset>       
    <legend>Licencia</legend>        
    <select name="tbs"> 
      <option selected disabled>Cualquier licencia</option>
      <option value="il:cl">Creative Commons</option>
      <option value="il:ol">Comercial y otras</option>
    </select>
  </fieldset>

  <input type="hidden" name="tbm" value="isch">

  <button type="reset">Reiniciar</button>
  <button type="submit">Buscar</button>
</form>
</fieldset>

Como verás, hemos añadido muchas opciones para establecer diferentes valores para un parámetro llamado “tbs” (hemos adivinado este parámetro y todos sus posibles valores observando la URL al buscar cualquier información en Google). De esta manera, en este ejemplo estamos pasando tres parámetros: q (la cadena de búsqueda), tbm (para buscar imágenes) y tbs (para filtrar los resultados). Por ejemplo, si estamos buscando imágenes GIF sobre perros, la URL resultante al enviar el formulario será esta: https://www.google.es/search?q=dog&tbm=isch&tbs=itp:animated.

También podrás apreciar que dentro de cada elemento estamos usando una opción predeterminada: <option selected disabled>...</option> para que, por defecto, ninguna de las opciones disponibles esté seleccionada y los resultados no estén filtrados.

Ejercicio propuesto: Filtrar imágenes con listas desplegables

Utilizando el código del ejemplo anterior, desarrolla una página web para buscar imágenes en Google y filtrar los resultados utilizando varias listas desplegables:

Buscar:

Tamaño
Color
Tipo
Fecha
Licencia

Ejercicio propuesto: Filtrando imágenes con botones de radio

Crea una nueva página web para buscar imágenes en Google y filtrar los resultados utilizando botones de radio:

Buscar:

Tamaño Grande
Mediano
Icono
Color Color
Blanco y negro
Transparente
Tipo Clip art
Dibujo lineal
GIF
Fecha Últimas 24 horas
Última semana
Licencia Creative Commons
Comercial y otros

Test

Comprueba tus conocimientos con este test sobre formato de texto y otros conceptos relacionados con esta unidad.