Estructuras de control de flujo iterativas en R y Python | Macarena Quiroga

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.

Macarena Quiroga
Macarena Quiroga
Lingüista/Becaria doctoral

Investigo la adquisición del lenguaje. Estudio estadística y ciencia de datos con R/Rstudio. Si te gusta lo que hago, podés invitarme un cafecito desde Argentina, o un kofi desde otros países. Suscribite a mi blog aquí.

Relacionado