Expresiones ternarias, comprensiones de listas, expresiones generadoras
1 Expresiones ternarias
nombre = input('Nombre: ')
resultado = 'Correcto' if nombre == 'carlos' else 'Incorrecto'
print(resultado)
2 Comprensiones de listas
# Ejemplo 1
lista_elementos = []
for i in range(10):
lista_elementos.append('item %s' % i)
lista_elementos = ['item %s' % i for i in range(10)]
# Ejemplo 2: Sintaxis
[expresion for item1 in iterable1 if condicion1
for item2 in iterable2 if condicion2
...
for itemN in iterableN if condicionN]
# Equivalente a
resultado = []
for item1 in iterable1:
if condicion1:
for item2 in iterable2:
if condicion2:
...
for itemN in iterableN:
if condicionN:
resultado.append(expresion)
# Ventaja: Simplifica el código y promueve la programación declarativa.
3 Expresiones generadoras
# Ejemplo: Cambiando [] por () se obtiene una expresión generadora
generador = ('elemento %s' % i for i in range(5))
print(generador) # Muestra el objeto generador
print(next(generador)) # 'elemento 0'
print(list(generador)) # ['elemento 1', 'elemento 2', 'elemento 3', 'elemento 4']
# Ventaja: Ahorra memoria, ya que produce un valor a la vez.
4 Ejercicios de programación declarativa
1. Convertir los nombres en ['ana','pedro_sb','maria','luis'] a mayúsculas.
2. Filtrar los nombres que terminan en 'sb' en la lista ['ana','pedro_sb','maria','luis'] y guardar la longitud de los restantes.
3. Encontrar la longitud de la línea más larga en el archivo 'datos.txt' (usar función max).
4. Calcular el total de caracteres en el archivo 'datos.txt' (usar función sum). Explicar por qué las sumas subsiguientes dan 0.
5. Análisis:
with open('datos.txt') as f:
generador_longitudes = (len(linea) for linea in f)
print(sum(generador_longitudes)) # ¿Por qué da error?
6. Contenido del archivo 'compras.txt':
portatil,1500,2
movil,800,5
coche,20000,1
Calcular el gasto total.
Listar la información de todos los productos en formato [{'nombre':'xxx','precio':1000,'cantidad':2}, ...]
Filtrar los productos con precio mayor a 1000, formato similar.
# Solución 1
nombres = ['ana', 'pedro_sb', 'maria', 'luis']
nombres_mayus = [nombre.upper() for nombre in nombres]
# Solución 2
nombres_filtrados = [len(nombre) for nombre in nombres if not nombre.endswith('sb')]
# Solución 3
with open('datos.txt', encoding='utf-8') as archivo:
print(max(len(linea) for linea in archivo))
# Solución 4
with open('datos.txt', encoding='utf-8') as archivo:
print(sum(len(linea) for linea in archivo)) # Primera suma
print(sum(len(linea) for linea in archivo)) # Da 0 porque el archivo se consumió
print(sum(len(linea) for linea in archivo)) # Da 0
# Solución 5 (omitted for brevity)
# Solución 6
with open('compras.txt', encoding='utf-8') as archivo:
datos = [linea.strip().split(',') for linea in archivo]
gasto_total = sum(float(precio) * int(cantidad) for _, precio, cantidad in datos)
print(gasto_total)
with open('compras.txt', encoding='utf-8') as archivo:
productos = [{
'nombre': campos[0],
'precio': float(campos[1]),
'cantidad': int(campos[2]),
} for campos in (linea.strip().split(',') for linea in archivo)]
print(productos)
with open('compras.txt', encoding='utf-8') as archivo:
productos_caros = [{
'nombre': campos[0],
'precio': float(campos[1]),
'cantidad': int(campos[2]),
} for campos in (linea.strip().split(',') for linea in archivo) if float(campos[1]) > 1000]
print(productos_caros)
Recursión y búsqueda binaria
1 Definición de llamada recursiva
# La recursión es una forma especial de anidamiento de funciones, donde la función se llama a sí misma directa o indirectamente.
def funcion_a():
print('desde a')
funcion_a() # Llamada directa
def funcion_b():
print('desde b')
funcion_a() # Llamada indirecta
# Python limita la profundidad de recursión para evitar desbordamiento de pila.
import sys
sys.getrecursionlimit() # Consultar límite
sys.setrecursionlimit(1000) # Modificar límite
2 Etapas de la recursión: retroceso y retroceso
# La recursión debe tener dos fases claras: retroceso (avance hacia el caso base) y retroceso (retroceso hacia el resultado).
# Ejemplo: Calcular salario acumulado.
def salario_acumulado(n):
if n == 1:
return 100
return salario_acumulado(n - 1) + 300
print(salario_acumulado(5)) # Salida: 1300
3 Recursión en Python y su eficiencia
# Python no tiene optimización de recursión de cola, por lo que la recursión puede ser ineficiente y causar desbordamiento de pila.
# Recomendaciones:
# 1. Definir un caso base claro.
# 2. Reducir el problema en cada llamada recursiva.
# 3. Usar iteración cuando sea posible para mejorar el rendimiento.
4 Búsqueda binaria
# Ejemplo de búsqueda binaria en una lista ordenada.
lista_ordenada = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
def busqueda_binaria(elemento, lista, inicio=0, fin=None):
if fin is None:
fin = len(lista) - 1
if inicio <= fin:
medio = inicio + (fin - inicio) // 2
if lista[medio] == elemento:
return medio
elif lista[medio] < elemento:
return busqueda_binaria(elemento, lista, medio + 1, fin)
else:
return busqueda_binaria(elemento, lista, inicio, medio - 1)
return -1
indice = busqueda_binaria(23, lista_ordenada)
print(f'Elemento encontrado en índice: {indice}')
Funciones aónimas
1 ¿Qué son las funciones anónimas?
# Son funciones sin nombre definidas con la palabra clave lambda.
def suma(x, y, z=1):
return x + y + z
# Función anónima equivalente
funcion_anonima = lambda x, y, z=1: x + y + z
print(funcion_anonima(1, 2, 3)) # Salida: 6
2 Comparación con funciones con nombre
# Funciones con nombre: Reutilizables y autoexplicativas.
# Funciones anónimas: Para uso único, como argumentos en funciones de orden superior (max, min, sorted, map, filter).
ejemplo_lista = [{'nombre': 'ana', 'nota': 85}, {'nombre': 'luis', 'nota': 92}]
mejor_nota = max(ejemplo_lista, key=lambda item: item['nota'])
print(mejor_nota)
Funciones integradas en Python
# Python incluye funciones integradas como id(), type(), max(), min(), sorted(), map(), filter(), etc.
# Ejemplo con format():
numero = 3.14159
print(format(numero, '.2f')) # '3.14'
print(format(100, 'b')) # '1100100' (binario)
# Ejemplo con max() y lambda:
salarios = {'maria': 5000, 'pedro': 8000, 'ana': 6000}
mayor_salario = max(salarios, key=lambda k: salarios[k])
print(f'Empleado con mayor salario: {mayor_salario}')
# Ejemplo con eval() y exec():
cadena_expresion = '2 + 3 * 4'
resultado_eval = eval(cadena_expresion)
print(resultado_eval) # 14
cadena_codigo = 'for i in range(3): print(i)'
exec(cadena_codigo) # Ejecuta el código
Ejericcios prácticos
1. Contenido del archivo 'empleados.txt':
carlos masculino 25 4000
ana femenino 30 5500
pedro masculino 28 4800
Cargar los registros en una lista de diccionarios con claves 'nombre', 'sexo', 'edad', 'salario'.
2. Obtener la información del empleado con mayor salario.
3. Obtener la información del empleado más joven.
4. Mapear los nombres a formato capitalizado (primera letra en mayúscula).
5. Filtrar empleados cuyo nombre empieza con 'c'.
6. Imprimir la secuencia de Fibonacci hasta un valor dado usando recursión.
7. Extraer todos los valores de una lista anidada, como [1,2,[3,[4,5]]], usando recursión.
# Solución 1
with open('empleados.txt') as archivo:
empleados = [{
'nombre': campos[0],
'sexo': campos[1],
'edad': int(campos[2]),
'salario': float(campos[3])
} for campos in (linea.strip().split() for linea in archivo)]
print(empleados)
# Solución 2
empleado_mayor = max(empleados, key=lambda emp: emp['salario'])
print(empleado_mayor)
# Solución 3
empleado_joven = min(empleados, key=lambda emp: emp['edad'])
print(empleado_joven)
# Solución 4
empleados_capitalizados = [{
'nombre': emp['nombre'].capitalize(),
'sexo': emp['sexo'],
'edad': emp['edad'],
'salario': emp['salario']
} for emp in empleados]
print(empleados_capitalizados)
# Solución 5
empleados_filtrados = [emp for emp in empleados if emp['nombre'].startswith('c')]
print(empleados_filtrados)
# Solución 6
def fibonacci_recursivo(a, b, limite):
if a > limite:
return
print(a, end=' ')
fibonacci_recursivo(b, a + b, limite)
fibonacci_recursivo(0, 1, 10) # Imprime: 0 1 1 2 3 5 8
# Solución 7
lista_anidada = [1, 2, [3, [4, 5]]]
def extraer_valores(secuencia):
for elemento in secuencia:
if isinstance(elemento, list):
extraer_valores(elemento)
else:
print(elemento)
extraer_valores(lista_anidada)