Ciclos y rangos en comparación con Python
⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.
r8vnhill/python-dibs
En esta lección compararemos cómo Python y Kotlin abordan uno de los aspectos más fundamentales de cualquier lenguaje de programación: los ciclos y los rangos.
Aunque ambos lenguajes permiten repetir acciones, recorrer colecciones y construir nuevas estructuras de datos a partir de otras, lo hacen desde enfoques muy distintos:
- Kotlin favorece la expresividad con tipos estáticos y estructuras bien tipadas, como
1..10
,repeat
, o funciones comomap
yfilter
. - Python, en cambio, apuesta por una sintaxis simple, flexible y directa, con herramientas como
range
,for
, y especialmente las comprehensions, que permiten generar listas, conjuntos y diccionarios en una sola línea.
Esta comparación te permitirá:
- Ver en acción las diferencias entre ciclos
for
,while
,do-while
y sus equivalentes en Python. - Entender qué tipo de estructuras se pueden recorrer y cómo se define un rango en cada lenguaje.
- Aprender a usar comprehensions de listas, sets y diccionarios en Python, entendiendo su poder y sus limitaciones.
- Reconocer cuándo Python simplifica la escritura de código y cuándo puede perder expresividad o seguridad de tipos frente a Kotlin.
La meta no es decidir cuál es “mejor”, sino entender los matices de cada herramienta para que puedas tomar mejores decisiones al diseñar tus propias bibliotecas o escribir código idiomático y claro, sin importar el lenguaje que uses.
🔁 Declaración for
En Python, los ciclos for
permiten recorrer directamente cualquier objeto iterable, como listas, cadenas o rangos.
- Código esencial
- Código completo
def print_characters(characters: list[str]) -> None:
for char in characters:
print(char)
Veamos un ejemplo con una lista de personajes del cómic The Walking Dead:
def print_characters(characters: list[str]) -> None:
for char in characters:
print(char)
if __name__ == '__main__':
print_characters(["Rick", "Michonne", "Carl", "Negan", "Andrea"])
Rick
Michonne
Carl
Negan
Andrea
En cada iteración, el ciclo asigna un personaje a la variable character
y ejecuta el cuerpo del bucle, que en este caso imprime su nombre.
Este estilo de iteración es claro, expresivo y muy utilizado en Python, especialmente en programas donde queremos procesar elementos sin preocuparnos por índices o contadores.
⚙️ Generadores básicos
Python ofrece una sintaxis muy concisa y expresiva llamada comprehensions para generar nuevas colecciones a partir de otras estructuras iterables. Estas construcciones son especialmente útiles cuando queremos crear, transformar o filtrar datos de forma declarativa, sin necesidad de escribir ciclos for
explícitos.
🔁 Sintaxis general
La forma básica de una comprehension sigue esta estructura:
expresión for variable in iterable if condición
expresión
: lo que se va a agregar a la nueva colección. Tiene acceso avariable
.variable
: nombre con el que accedemos a cada elemento del iterable.iterable
: cualquier objeto que se pueda recorrer (list
,range
,str
, etc.).if condición
(opcional): filtra los elementos, incluyendo solo aquellos que la cumplan.
📦 List Comprehensions
Devuelven una lista con los resultados evaluados para cada elemento del iterable.
- Código esencial
- Código completo
def double_numbers(numbers: list[int]) -> list[int]:
return [x * 2 for x in numbers]
def double_numbers(numbers: list[int]) -> list[int]:
return [x * 2 for x in numbers]
if __name__ == '__main__':
print(double_numbers([1, 2, 3]))
[2, 4, 6]
También pueden incluir una condición:
- Código esencial
- Código completo
def filter_pairs(numbers: list[int]) -> list[int]:
return [x for x in numbers if x % 2 == 0]
def filter_pairs(numbers: list[int]) -> list[int]:
return [x for x in numbers if x % 2 == 0]
if __name__ == '__main__':
filter_pairs([1, 2, 3, 4, 5])
[2, 4]