Estructuras de control de flujo iterativas en R y Python
En este post vamos a comparar cómo se construyen las estructuras de control de flujo iterativas en R y en Python.
Las estructuras de control iterativas o bucles permiten ejecutar un bloque de código repetidamente mientras se cumpla una determinada condición. Existen dos grandes bucles: for y while. Vamos a ver la diferencia en la sintaxis de R y Python.
Bucle for
El bucle for sirve para iterar un código en un conjunto de datos, que puede ser una lista o un array. Por ejemplo, si quiero imprimir una lista de números del 1 al 10, lo hago de la siguiente forma en R:
for (i in 1:10){
print(paste("El número es", i))
}
## [1] "El número es 1"
## [1] "El número es 2"
## [1] "El número es 3"
## [1] "El número es 4"
## [1] "El número es 5"
## [1] "El número es 6"
## [1] "El número es 7"
## [1] "El número es 8"
## [1] "El número es 9"
## [1] "El número es 10"
Como vimos en el ‘post anterior sobre estructuras condicionales’, en R las sentencias a evaluar o las condiciones se encierran entre paréntesis, mientras que el código a ejecutar se encierra entre llaves. En cambio, en Python la sintaxis se define exclusivamente por la indentación y por los dos puntos:
for i in range(1, 10):
print(f"El número es {i}")
## El número es 1
## El número es 2
## El número es 3
## El número es 4
## El número es 5
## El número es 6
## El número es 7
## El número es 8
## El número es 9
Además de la sintaxis, este ejercicio nos muestra que R tiene base 1, mientras que Python tiene base 0, por lo cual si quiero que itere desde el 1 al 10 debo especificarlo en el rango, de lo contrario lo hará desde el 0 hasta el 9.
Los bucles pueden recorrer elementos dentro de una lista, de esta forma:
vocales <- c("a", "e", "i", "o", "u")
for (i in vocales){
print(paste("La letra", i, "es una vocal."))
}
## [1] "La letra a es una vocal."
## [1] "La letra e es una vocal."
## [1] "La letra i es una vocal."
## [1] "La letra o es una vocal."
## [1] "La letra u es una vocal."
A diferencia de R, en Python las cadenas de caracteres funcionan como arrays, por lo cual para ejecutar este código anterior no necesitamos crear previamente el elemento vocales
:
for i in "aeiou":
print(f"La letra {i} es una vocal.")
## La letra a es una vocal.
## La letra e es una vocal.
## La letra i es una vocal.
## La letra o es una vocal.
## La letra u es una vocal.
El bucle while
El bucle while se utiliza para indicar que se debe ejecutar un código mientras se cumpla determinada condición.
i <- 2020
while (i >= 2020 & i <= 2022) {
print(paste("El año", i, "fue pandémico."))
i <- i + 1
}
## [1] "El año 2020 fue pandémico."
## [1] "El año 2021 fue pandémico."
## [1] "El año 2022 fue pandémico."
El bucle comienza con el puntero i
con el valor 2020
; con cada iteración, aumenta una unidad. En los casos en que el valor sea mayor o igual a 2020 y menor o igual a 2022, se imprimirá la frase pedida.
En Python, la secuencia es similar, pero sin las llaves ni paréntesis, y reemplazando el ampersand (&) por la palabra reservada and
:
i = 2020
while i >= 2020 and i <= 2022:
print(f"El año {i} fue pandémico.")
i += 1
## El año 2020 fue pandémico.
## El año 2021 fue pandémico.
## El año 2022 fue pandémico.
Romper y continuar los bucles
En algunas situaciones necesitamos incluir alguna condición que permita romper un bucle: eso se utiliza con la instrucción break:
i <- 1
while (i < 20){
if (i == 18){
break
}
print(i)
i <- i + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
En Python, la secuencia es similar, con las ya mencionadas diferencias en la sintaxis sobre el uso de paréntesis y llaves:
i = 1
while i < 20:
if i == 18:
break
print(i)
i += 1
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8
## 9
## 10
## 11
## 12
## 13
## 14
## 15
## 16
## 17
Sin embargo, a veces necesitamos solamente saltear la iteración de una condición en particular. Esto se ejecuta con la instrucción next en R y continue en Python:
i <- 0
while (i < 10){
i <- i + 1
if (i == 5){
next
}
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
El resultado de este código es la secuencia 1-2-3-4-6-7-8-9-10, es decir, la presentación del dato en pantalla se saltea el 5. En cambio, en Python, esto mismo se genera de esta forma:
i = 1
while i < 10:
i += 1
if i == 5:
continue
print(i)
## 2
## 3
## 4
## 6
## 7
## 8
## 9
## 10
Cierre
Como vimos, las estructuras iterativas en R y en Python tienen la misma lógica: la única diferencia es la presencia o ausencia de paréntesis o llaves, que son las que definen la sintaxis del lenguaje.
Como siempre, recordá que podés suscribirte a mi blog para no perderte ninguna actualización, y si te quedó alguna consulta no dudes en contactarme. Y, si te gusta lo que hago, podés invitarme un cafecito desde Argentina o un kofi.