Python
Tutorial Python: Funciones auxiliares
Aprende a usar funciones auxiliares de Python como enumerate, zip, sorted, reversed e itertools para manipular secuencias de forma eficiente y elegante.
Aprende Python y certifícateenumerate() y zip()
Python ofrece varias funciones auxiliares que simplifican tareas comunes al trabajar con colecciones de datos. Entre ellas, enumerate()
y zip()
destacan por su utilidad para manipular secuencias de manera elegante y eficiente.
La función enumerate()
Cuando necesitamos recorrer una secuencia y al mismo tiempo conocer la posición de cada elemento, enumerate()
resulta indispensable. Esta función toma una secuencia (como una lista, tupla o cadena) y devuelve un objeto iterable que produce pares de índice-valor.
La sintaxis básica es:
enumerate(iterable, start=0)
Donde:
iterable
: La secuencia que queremos recorrerstart
: El valor inicial del contador (por defecto es 0)
Veamos un ejemplo sencillo:
frutas = ["manzana", "plátano", "naranja"]
# Sin enumerate (forma tradicional)
for i in range(len(frutas)):
print(f"Índice {i}: {frutas[i]}")
# Con enumerate (forma elegante)
for indice, fruta in enumerate(frutas):
print(f"Índice {indice}: {fruta}")
La ventaja de enumerate()
es evidente: nos ahorra tener que gestionar manualmente un contador y acceder a los elementos por índice, lo que hace el código más legible y menos propenso a errores.
También podemos especificar un valor inicial diferente:
# Comenzando desde 1 en lugar de 0
for indice, fruta in enumerate(frutas, start=1):
print(f"Fruta #{indice}: {fruta}")
Esto resulta útil cuando queremos una numeración que comience en 1 para presentación al usuario, mientras mantenemos la indexación basada en 0 internamente.
La función zip()
La función zip()
permite combinar dos o más iterables elemento a elemento, creando un iterable de tuplas donde cada tupla contiene elementos de las secuencias originales en la misma posición.
La sintaxis básica es:
zip(*iterables)
Donde *iterables
representa una o más secuencias que queremos combinar.
Veamos un ejemplo simple:
nombres = ["Ana", "Carlos", "Elena"]
edades = [28, 35, 42]
# Sin zip (forma tradicional)
for i in range(len(nombres)):
print(f"{nombres[i]} tiene {edades[i]} años")
# Con zip (forma elegante)
for nombre, edad in zip(nombres, edades):
print(f"{nombre} tiene {edad} años")
La versión con zip()
es más concisa y expresiva, eliminando la necesidad de índices intermedios.
Un detalle importante: zip()
se detiene cuando se agota el iterable más corto. Si queremos un comportamiento diferente, podemos usar itertools.zip_longest()
:
from itertools import zip_longest
nombres = ["Ana", "Carlos", "Elena"]
edades = [28, 35]
# zip normal (se detiene al agotar 'edades')
for nombre, edad in zip(nombres, edades):
print(f"{nombre}: {edad}") # Solo imprime Ana y Carlos
# zip_longest (continúa hasta agotar todos los iterables)
for nombre, edad in zip_longest(nombres, edades, fillvalue="Desconocido"):
print(f"{nombre}: {edad}") # Elena tendrá edad "Desconocido"
Combinando enumerate() y zip()
Estas funciones pueden combinarse para obtener resultados aún más potentes:
nombres = ["Ana", "Carlos", "Elena"]
apellidos = ["García", "Rodríguez", "López"]
edades = [28, 35, 42]
for i, (nombre, apellido, edad) in enumerate(zip(nombres, apellidos, edades), 1):
print(f"Persona #{i}: {nombre} {apellido}, {edad} años")
Este patrón es extremadamente útil cuando necesitamos procesar múltiples listas relacionadas y también queremos mantener un contador.
Casos de uso prácticos
Creación de diccionarios
zip()
es perfecto para crear diccionarios a partir de listas paralelas:
claves = ["nombre", "edad", "ciudad"]
valores = ["Ana", 28, "Madrid"]
# Creación de diccionario con zip
persona = dict(zip(claves, valores))
print(persona) # {'nombre': 'Ana', 'edad': 28, 'ciudad': 'Madrid'}
Transposición de matrices
zip()
permite transponer una matriz (convertir filas en columnas y viceversa) de forma elegante:
matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Transposición con zip
transpuesta = list(zip(*matriz))
print(transpuesta) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Enumeración de archivos
enumerate()
es útil al procesar líneas de un archivo:
with open("ejemplo.txt", "r") as archivo:
for num_linea, linea in enumerate(archivo, 1):
print(f"Línea {num_linea}: {linea.strip()}")
Este patrón es especialmente valioso para reportar errores en archivos de configuración o logs, indicando el número de línea exacto.
Rendimiento y eficiencia
Tanto enumerate()
como zip()
son eficientes en términos de memoria porque devuelven iteradores, no listas completas. Esto significa que procesan los elementos bajo demanda, lo que resulta ideal para trabajar con secuencias grandes.
Si necesitamos una lista de resultados, podemos convertir explícitamente el resultado:
# Crear una lista de tuplas (índice, valor)
lista_enumerada = list(enumerate(["a", "b", "c"]))
print(lista_enumerada) # [(0, 'a'), (1, 'b'), (2, 'c')]
# Crear una lista de tuplas combinadas
combinados = list(zip([1, 2, 3], ["a", "b", "c"]))
print(combinados) # [(1, 'a'), (2, 'b'), (3, 'c')]
En resumen, enumerate()
y zip()
son herramientas fundamentales que simplifican el código al trabajar con múltiples secuencias, mejorando la legibilidad y reduciendo la posibilidad de errores. Dominar estas funciones auxiliares es esencial para escribir código Python elegante y eficiente.
sorted() y reversed()
Python proporciona funciones auxiliares que simplifican operaciones comunes sobre colecciones de datos. Las funciones sorted()
y reversed()
son herramientas fundamentales para manipular el orden de los elementos en secuencias, permitiéndonos reorganizar datos de forma eficiente y elegante.
La función sorted()
La función sorted()
permite ordenar cualquier iterable y devuelve una nueva lista con los elementos ordenados, sin modificar la secuencia original. Esta característica la hace especialmente útil cuando necesitamos preservar los datos originales.
La sintaxis básica es:
sorted(iterable, key=None, reverse=False)
Donde:
iterable
: La secuencia que queremos ordenarkey
: Función opcional que sirve como criterio de ordenaciónreverse
: Booleano que indica si el orden debe ser descendente (True) o ascendente (False)
Veamos ejemplos básicos:
# Ordenar una lista de números
numeros = [5, 2, 8, 1, 9]
numeros_ordenados = sorted(numeros)
print(numeros) # [5, 2, 8, 1, 9] - original sin cambios
print(numeros_ordenados) # [1, 2, 5, 8, 9] - nueva lista ordenada
# Ordenar una cadena (devuelve una lista de caracteres)
texto = "python"
print(sorted(texto)) # ['h', 'n', 'o', 'p', 't', 'y']
# Ordenar en orden descendente
print(sorted(numeros, reverse=True)) # [9, 8, 5, 2, 1]
Ordenación personalizada con key
El parámetro key
nos permite definir criterios de ordenación personalizados mediante una función que se aplica a cada elemento antes de compararlo:
# Ordenar por longitud de palabra
palabras = ["manzana", "pera", "kiwi", "uva", "mandarina"]
print(sorted(palabras, key=len)) # ['uva', 'pera', 'kiwi', 'manzana', 'mandarina']
# Ordenar ignorando mayúsculas/minúsculas
nombres = ["Ana", "carlos", "Beatriz", "david"]
print(sorted(nombres)) # ['Ana', 'Beatriz', 'carlos', 'david']
print(sorted(nombres, key=str.lower)) # ['Ana', 'Beatriz', 'carlos', 'david']
Ordenación de estructuras complejas
La función sorted()
es especialmente útil para ordenar estructuras de datos más complejas:
# Ordenar diccionario por clave
diccionario = {"c": 3, "a": 1, "b": 2}
print(sorted(diccionario)) # ['a', 'b', 'c'] - solo devuelve las claves ordenadas
print(sorted(diccionario.items())) # [('a', 1), ('b', 2), ('c', 3)]
# Ordenar lista de tuplas por el segundo elemento
datos = [("Ana", 25), ("Carlos", 18), ("Elena", 32)]
print(sorted(datos, key=lambda x: x[1])) # [('Carlos', 18), ('Ana', 25), ('Elena', 32)]
# Ordenar objetos por atributo
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def __repr__(self):
return f"Persona({self.nombre}, {self.edad})"
personas = [Persona("Ana", 25), Persona("Carlos", 18), Persona("Elena", 32)]
print(sorted(personas, key=lambda p: p.edad)) # [Persona(Carlos, 18), Persona(Ana, 25), Persona(Elena, 32)]
Ordenación múltiple
Para ordenar por múltiples criterios, podemos usar itemgetter
del módulo operator
:
from operator import itemgetter
# Ordenar por múltiples campos
estudiantes = [
{"nombre": "Ana", "nota": 8, "edad": 22},
{"nombre": "Carlos", "nota": 9, "edad": 20},
{"nombre": "Beatriz", "nota": 9, "edad": 19},
{"nombre": "David", "nota": 7, "edad": 22}
]
# Primero por nota (descendente) y luego por edad (ascendente)
print(sorted(estudiantes, key=lambda e: (-e["nota"], e["edad"])))
# [{'nombre': 'Beatriz', 'nota': 9, 'edad': 19}, {'nombre': 'Carlos', 'nota': 9, 'edad': 20},
# {'nombre': 'Ana', 'nota': 8, 'edad': 22}, {'nombre': 'David', 'nota': 7, 'edad': 22}]
# Usando itemgetter (más eficiente)
print(sorted(estudiantes, key=itemgetter("nota", "edad"), reverse=True))
La función reversed()
A diferencia de sorted()
, la función reversed()
simplemente invierte el orden de los elementos de un iterable sin ordenarlos. Devuelve un iterador que produce los elementos en orden inverso.
La sintaxis es muy simple:
reversed(secuencia)
Donde secuencia
debe ser un objeto que soporte el protocolo de secuencia (con tamaño definido y acceso por índice).
Ejemplos básicos:
# Invertir una lista
numeros = [1, 2, 3, 4, 5]
numeros_invertidos = list(reversed(numeros))
print(numeros) # [1, 2, 3, 4, 5] - original sin cambios
print(numeros_invertidos) # [5, 4, 3, 2, 1] - nueva lista invertida
# Invertir una cadena
texto = "python"
print(''.join(reversed(texto))) # "nohtyp"
# Invertir un rango
for i in reversed(range(1, 6)):
print(i, end=' ') # 5 4 3 2 1
Es importante destacar que reversed()
devuelve un iterador, no una lista. Esto significa que es eficiente en memoria porque no crea una copia completa de la secuencia. Si necesitamos una lista, debemos convertir explícitamente el resultado como hicimos en los ejemplos.
Diferencias con el método reverse()
No debemos confundir reversed()
con el método reverse()
de las listas:
# El método reverse() modifica la lista original
numeros = [1, 2, 3, 4, 5]
numeros.reverse() # No devuelve nada, modifica la lista in-place
print(numeros) # [5, 4, 3, 2, 1]
# La función reversed() no modifica la original
numeros = [1, 2, 3, 4, 5]
resultado = reversed(numeros) # Devuelve un iterador, no modifica la lista
print(list(resultado)) # [5, 4, 3, 2, 1]
print(numeros) # [1, 2, 3, 4, 5] - sin cambios
Casos de uso prácticos
Recorrido eficiente en orden inverso
reversed()
es ideal para recorrer secuencias en orden inverso sin crear copias:
# Procesar líneas de un archivo de abajo hacia arriba
with open("ejemplo.txt", "r") as archivo:
lineas = archivo.readlines()
for linea in reversed(lineas):
print(linea.strip())
Ordenación personalizada con sorted()
sorted()
facilita la implementación de algoritmos de ordenación complejos:
# Ordenar una lista de palabras por la última letra
palabras = ["manzana", "pera", "kiwi", "uva", "naranja"]
print(sorted(palabras, key=lambda palabra: palabra[-1]))
# ['pera', 'manzana', 'kiwi', 'naranja', 'uva']
# Ordenar una lista de números por su distancia al valor 5
numeros = [1, 8, 4, 6, 10, 3]
print(sorted(numeros, key=lambda x: abs(x - 5)))
# [4, 6, 3, 8, 1, 10]
Ordenación estable
sorted()
garantiza una ordenación estable, lo que significa que los elementos con el mismo valor de ordenación mantienen su orden relativo original:
# Ordenación estable por género y luego por edad
personas = [
{"nombre": "Ana", "genero": "F", "edad": 25},
{"nombre": "Carlos", "genero": "M", "edad": 30},
{"nombre": "Elena", "genero": "F", "edad": 22},
{"nombre": "David", "genero": "M", "edad": 25}
]
# Primero ordenamos por edad
por_edad = sorted(personas, key=lambda p: p["edad"])
# Luego por género (manteniendo el orden relativo por edad)
por_genero_edad = sorted(por_edad, key=lambda p: p["genero"])
for p in por_genero_edad:
print(f"{p['nombre']} ({p['genero']}), {p['edad']} años")
# Elena (F), 22 años
# Ana (F), 25 años
# David (M), 25 años
# Carlos (M), 30 años
Rendimiento y consideraciones
Tanto sorted()
como reversed()
están optimizados para ser eficientes, pero tienen diferentes características:
sorted()
crea una nueva lista en memoria, lo que puede ser costoso para colecciones muy grandes.reversed()
devuelve un iterador ligero, ideal para secuencias grandes cuando solo necesitamos recorrerlas una vez.
Para colecciones muy grandes donde el rendimiento es crítico, podemos considerar alternativas:
# Para ordenar archivos grandes línea por línea
import heapq
with open("archivo_grande.txt", "r") as f:
# Ordenar las 10 líneas más largas sin cargar todo el archivo en memoria
lineas_mas_largas = heapq.nlargest(10, f, key=len)
for linea in lineas_mas_largas:
print(linea.strip())
En resumen, sorted()
y reversed()
son herramientas esenciales que simplifican la manipulación del orden de los elementos en Python. Mientras que sorted()
ofrece flexibilidad para ordenar según criterios personalizados, reversed()
proporciona una forma eficiente de invertir secuencias sin modificar los datos originales.
itertools
El módulo itertools
es una joya de la biblioteca estándar de Python que proporciona un conjunto de herramientas eficientes para trabajar con iteradores. Estas funciones permiten crear y manipular secuencias de datos de manera elegante, siguiendo los principios de la programación funcional.
Fundamentos de itertools
El módulo itertools
está diseñado para ser eficiente en memoria ya que trabaja con iteradores en lugar de crear listas completas en memoria. Esto lo hace ideal para procesar grandes volúmenes de datos o crear secuencias potencialmente infinitas.
Para empezar a utilizarlo, simplemente importamos el módulo:
import itertools
Funciones para iteraciones infinitas
itertools
ofrece varias funciones que generan secuencias infinitas, útiles para muchos algoritmos:
- count(): Genera una secuencia infinita de números, similar a un contador.
# Contador básico (similar a range() pero sin fin)
for i in itertools.count(10, 2):
print(i, end=' ')
if i > 20:
break
# 10 12 14 16 18 20 22
- cycle(): Repite indefinidamente los elementos de un iterable.
# Ciclo de elementos
colores = ['rojo', 'verde', 'azul']
contador = 0
for color in itertools.cycle(colores):
print(color, end=' ')
contador += 1
if contador >= 7:
break
# rojo verde azul rojo verde azul rojo
- repeat(): Repite un elemento un número específico de veces (o infinitamente).
# Repetir un elemento
for x in itertools.repeat("Python", 3):
print(x, end=' ')
# Python Python Python
Funciones para combinaciones y permutaciones
itertools
facilita enormemente la generación de combinaciones y permutaciones, tareas comunes en matemáticas, estadística y ciencias de la computación:
- product(): Calcula el producto cartesiano de los iterables de entrada.
# Producto cartesiano (similar a bucles anidados)
for par in itertools.product('AB', '12'):
print(''.join(par), end=' ')
# A1 A2 B1 B2
# Equivalente a:
for letra in 'AB':
for numero in '12':
print(letra + numero, end=' ')
- permutations(): Genera todas las permutaciones posibles de longitud r.
# Todas las permutaciones de 3 elementos tomados de 2 en 2
for p in itertools.permutations('ABC', 2):
print(''.join(p), end=' ')
# AB AC BA BC CA CB
- combinations(): Genera todas las combinaciones posibles de longitud r.
# Todas las combinaciones de 4 elementos tomados de 2 en 2
for c in itertools.combinations('ABCD', 2):
print(''.join(c), end=' ')
# AB AC AD BC BD CD
- combinations_with_replacement(): Similar a combinations(), pero permite repetir elementos.
# Combinaciones con repetición
for c in itertools.combinations_with_replacement('ABC', 2):
print(''.join(c), end=' ')
# AA AB AC BB BC CC
Funciones para procesamiento de iterables
itertools
también ofrece funciones para manipular y transformar iterables existentes:
- chain(): Concatena múltiples iterables en uno solo.
# Concatenar varios iterables
numeros = [1, 2, 3]
letras = ['a', 'b', 'c']
for elemento in itertools.chain(numeros, letras):
print(elemento, end=' ')
# 1 2 3 a b c
- islice(): Extrae elementos selectivos de un iterable.
# Obtener un subconjunto de elementos (similar a slice para listas)
for elemento in itertools.islice(range(10), 2, 8, 2):
print(elemento, end=' ')
# 2 4 6
- groupby(): Agrupa elementos consecutivos de un iterable cuando comparten un atributo común.
# Agrupar elementos consecutivos
datos = ['A', 'A', 'B', 'C', 'C', 'C', 'B']
for clave, grupo in itertools.groupby(datos):
print(f"{clave}: {list(grupo)}")
# A: ['A', 'A']
# B: ['B']
# C: ['C', 'C', 'C']
# B: ['B']
# Con una función clave personalizada
palabras = ['casa', 'carro', 'bote', 'banana', 'avión']
palabras_ordenadas = sorted(palabras, key=lambda x: x[0]) # Ordenamos primero por inicial
for letra, grupo in itertools.groupby(palabras_ordenadas, key=lambda x: x[0]):
print(f"Palabras con {letra}: {list(grupo)}")
# Palabras con a: ['avión']
# Palabras con b: ['banana', 'bote']
# Palabras con c: ['casa', 'carro']
Casos de uso prácticos
Procesamiento de datos en lotes
itertools
es ideal para procesar grandes conjuntos de datos en lotes:
def procesar_en_lotes(iterable, tamano_lote=3):
"""Divide un iterable en lotes del tamaño especificado."""
iterator = iter(iterable)
while True:
# Extraer un lote usando islice
lote = list(itertools.islice(iterator, tamano_lote))
if not lote:
break
yield lote
datos = range(10)
for lote in procesar_en_lotes(datos, 3):
print(f"Procesando lote: {lote}")
# Procesando lote: [0, 1, 2]
# Procesando lote: [3, 4, 5]
# Procesando lote: [6, 7, 8]
# Procesando lote: [9]
Generación de secuencias
Podemos crear secuencias complejas combinando funciones de itertools
:
# Generar los primeros 10 números pares
pares = itertools.islice(itertools.count(0, 2), 10)
print(list(pares)) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Alternar entre dos valores
alternar = itertools.islice(itertools.cycle(['On', 'Off']), 6)
print(list(alternar)) # ['On', 'Off', 'On', 'Off', 'On', 'Off']
Análisis de datos
itertools.groupby()
es especialmente útil para análisis de datos:
# Contar ocurrencias de valores consecutivos
datos = [1, 1, 1, 2, 2, 3, 1, 1, 4, 4]
resultado = [(k, len(list(g))) for k, g in itertools.groupby(datos)]
print(resultado) # [(1, 3), (2, 2), (3, 1), (1, 2), (4, 2)]
# Análisis de datos estructurados
ventas = [
{'producto': 'A', 'region': 'Norte', 'unidades': 10},
{'producto': 'B', 'region': 'Norte', 'unidades': 5},
{'producto': 'A', 'region': 'Sur', 'unidades': 8},
{'producto': 'C', 'region': 'Norte', 'unidades': 3},
{'producto': 'B', 'region': 'Sur', 'unidades': 7},
]
# Ordenamos primero por producto
ventas_ordenadas = sorted(ventas, key=lambda x: x['producto'])
# Agrupamos por producto
for producto, grupo in itertools.groupby(ventas_ordenadas, key=lambda x: x['producto']):
total_unidades = sum(item['unidades'] for item in grupo)
print(f"Producto {producto}: {total_unidades} unidades")
Combinación con otras funciones auxiliares
itertools
se combina perfectamente con otras funciones auxiliares de Python:
# Combinar zip con cycle para crear un patrón repetitivo
nombres = ['Ana', 'Carlos', 'Elena']
roles = itertools.cycle(['Admin', 'Usuario'])
for nombre, rol in zip(nombres, roles):
print(f"{nombre}: {rol}")
# Ana: Admin
# Carlos: Usuario
# Elena: Admin
# Enumerar elementos de un ciclo
for i, color in zip(range(5), itertools.cycle(['rojo', 'verde', 'azul'])):
print(f"Elemento {i}: {color}")
# Elemento 0: rojo
# Elemento 1: verde
# Elemento 2: azul
# Elemento 3: rojo
# Elemento 4: verde
Funciones adicionales útiles
Además de las funciones mencionadas, itertools
ofrece otras herramientas valiosas:
- takewhile() y dropwhile(): Filtran elementos basados en una condición.
# Tomar elementos mientras se cumple una condición
numeros = [1, 3, 5, 7, 9, 2, 4, 6, 8]
for n in itertools.takewhile(lambda x: x < 6, numeros):
print(n, end=' ')
# 1 3 5
# Descartar elementos mientras se cumple una condición
for n in itertools.dropwhile(lambda x: x < 6, numeros):
print(n, end=' ')
# 7 9 2 4 6 8
- accumulate(): Genera sumas acumulativas (o usa otra función binaria).
# Suma acumulativa
for total in itertools.accumulate([1, 2, 3, 4, 5]):
print(total, end=' ')
# 1 3 6 10 15
# Producto acumulativo
import operator
for total in itertools.accumulate([1, 2, 3, 4], operator.mul):
print(total, end=' ')
# 1 2 6 24
- compress(): Filtra elementos según una secuencia de booleanos.
# Filtrar elementos según una máscara
datos = ['A', 'B', 'C', 'D', 'E']
selectores = [True, False, True, False, True]
for letra in itertools.compress(datos, selectores):
print(letra, end=' ')
# A C E
Rendimiento y eficiencia
Las funciones de itertools
están implementadas en C, lo que las hace extremadamente eficientes. Además, al trabajar con iteradores, consumen muy poca memoria incluso con secuencias enormes:
# Generar una secuencia potencialmente infinita
secuencia = itertools.count()
# Tomar solo los primeros 5 elementos
primeros = list(itertools.islice(secuencia, 5))
print(primeros) # [0, 1, 2, 3, 4]
# La secuencia original sigue disponible
mas_elementos = list(itertools.islice(secuencia, 3))
print(mas_elementos) # [5, 6, 7]
El módulo itertools
es una herramienta fundamental para cualquier programador Python que busque escribir código más elegante, eficiente y funcional. Dominar estas funciones auxiliares permite resolver problemas complejos con menos código y mejor rendimiento, siguiendo el principio de "baterías incluidas" que caracteriza a Python.
Ejercicios de esta lección Funciones auxiliares
Evalúa tus conocimientos de esta lección Funciones auxiliares con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Módulo math
Reto herencia
Excepciones
Introducción a Python
Reto variables
Funciones Python
Reto funciones
Módulo datetime
Reto acumulación
Reto estructuras condicionales
Polimorfismo
Módulo os
Reto métodos dunder
Diccionarios
Reto clases y objetos
Reto operadores
Operadores
Estructuras de control
Funciones lambda
Reto diccionarios
Reto función lambda
Encapsulación
Reto coleciones
Reto funciones auxiliares
Crear módulos y paquetes
Módulo datetime
Excepciones
Operadores
Diccionarios
Reto map, filter
Reto tuplas
Proyecto gestor de tareas CRUD
Tuplas
Variables
Tipos de datos
Conjuntos
Reto mixins
Módulo csv
Módulo json
Herencia
Análisis de datos de ventas con Pandas
Reto fechas y tiempo
Reto estructuras de iteración
Funciones
Reto comprehensions
Variables
Reto serialización
Módulo csv
Reto polimorfismo
Polimorfismo
Clases y objetos
Reto encapsulación
Estructuras de control
Importar módulos y paquetes
Módulo math
Funciones lambda
Reto excepciones
Listas
Reto archivos
Encapsulación
Reto conjuntos
Clases y objetos
Instalación de Python y creación de proyecto
Reto listas
Tipos de datos
Crear módulos y paquetes
Tuplas
Herencia
Reto acceso a sistema
Proyecto sintaxis calculadora
Importar módulos y paquetes
Clases y objetos
Módulo os
Listas
Conjuntos
Reto tipos de datos
Reto matemáticas
Módulo json
Todas las lecciones de Python
Accede a todas las lecciones de Python y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Python
Introducción
Instalación Y Creación De Proyecto
Introducción
Tema 2: Tipos De Datos, Variables Y Operadores
Introducción
Instalación De Python
Introducción
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Estructuras Control Iterativo
Sintaxis
Estructuras Control Condicional
Sintaxis
Testing Con Pytest
Sintaxis
Listas
Estructuras De Datos
Tuplas
Estructuras De Datos
Diccionarios
Estructuras De Datos
Conjuntos
Estructuras De Datos
Comprehensions
Estructuras De Datos
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Mixins Y Herencia Múltiple
Programación Orientada A Objetos
Métodos Especiales (Dunder Methods)
Programación Orientada A Objetos
Composición De Clases
Programación Orientada A Objetos
Funciones Lambda
Programación Funcional
Aplicación Parcial
Programación Funcional
Entrada Y Salida, Manejo De Archivos
Programación Funcional
Decoradores
Programación Funcional
Generadores
Programación Funcional
Paradigma Funcional
Programación Funcional
Composición De Funciones
Programación Funcional
Funciones Orden Superior Map Y Filter
Programación Funcional
Funciones Auxiliares
Programación Funcional
Reducción Y Acumulación
Programación Funcional
Archivos Comprimidos
Entrada Y Salida Io
Entrada Y Salida Avanzada
Entrada Y Salida Io
Archivos Temporales
Entrada Y Salida Io
Contexto With
Entrada Y Salida Io
Módulo Csv
Biblioteca Estándar
Módulo Json
Biblioteca Estándar
Módulo Datetime
Biblioteca Estándar
Módulo Math
Biblioteca Estándar
Módulo Os
Biblioteca Estándar
Módulo Re
Biblioteca Estándar
Módulo Random
Biblioteca Estándar
Módulo Time
Biblioteca Estándar
Módulo Collections
Biblioteca Estándar
Módulo Sys
Biblioteca Estándar
Módulo Statistics
Biblioteca Estándar
Módulo Pickle
Biblioteca Estándar
Módulo Pathlib
Biblioteca Estándar
Importar Módulos Y Paquetes
Paquetes Y Módulos
Crear Módulos Y Paquetes
Paquetes Y Módulos
Entornos Virtuales (Virtualenv, Venv)
Entorno Y Dependencias
Gestión De Dependencias (Pip, Requirements.txt)
Entorno Y Dependencias
Python-dotenv Y Variables De Entorno
Entorno Y Dependencias
Acceso A Datos Con Mysql, Pymongo Y Pandas
Acceso A Bases De Datos
Acceso A Mongodb Con Pymongo
Acceso A Bases De Datos
Acceso A Mysql Con Mysql Connector
Acceso A Bases De Datos
Novedades Python 3.13
Características Modernas
Operador Walrus
Características Modernas
Pattern Matching
Características Modernas
Instalación Beautiful Soup
Web Scraping
Sintaxis General De Beautiful Soup
Web Scraping
Tipos De Selectores
Web Scraping
Web Scraping De Html
Web Scraping
Web Scraping Para Ciencia De Datos
Web Scraping
Autenticación Y Acceso A Recursos Protegidos
Web Scraping
Combinación De Selenium Con Beautiful Soup
Web Scraping
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender y aplicar las funciones enumerate() y zip() para recorrer y combinar secuencias.
- Utilizar sorted() y reversed() para ordenar y revertir colecciones con criterios personalizados.
- Explorar el módulo itertools para generar y manipular iteradores eficientes y secuencias complejas.
- Implementar casos prácticos que combinan estas funciones para mejorar la legibilidad y eficiencia del código.
- Analizar consideraciones de rendimiento y diferencias entre funciones similares en Python.