sábado, 26 de octubre de 2024

Lenguajes. Python.

 Bucle determinista en Python

Toca ahora aprender ahora la sintaxis del bucle For en Python, la cual presenta características especiales y diferenciadas en este lenguaje. De hecho, trabajar con un bucle For en Python presupone cierto grado de conocimiento de lo que son los conjuntos de datos y las funciones, contenidos éstos sobre los que aun no hemos trabajado, por lo que implica alterar en cierto modo el orden lógico de aprendizaje de este lenguaje. Aun así, por mantener la coherencia con la temática, será conveniente iniciarse en el manejo de este componente del lenguaje.


Lo primero que tenemos que entender para comprender el funcionamiento de bucle For en Python es que no es exactamente igual a cómo se plantea en otros lenguajes, incluyendo la estructura genérica que hemos visto en Pse Int, aunque una de las dos formulaciones obedece claramente a esta lógica.

Efectivamente, en Python contamos con dos formulaciones básicas del bucle For:
  • La que se ejecuta sobre un elemento iterable como es un conjunto o colección de datos, como una lista, una tupla, un diccionario o una cadena de texto.
  • Y la que sirve para realizar una iteración o repetición cíclica definida en función de unos datos específicos de inicio, finalización y paso.
Veremos con cierto detalle ambas formulaciones, pero en función de lo dicho antes podemos concluir que la segunda de esas formulaciones es la que tiene más parecido lógico-funcional con lo que hasta el momento sabemos sobre el bucle For, resultado la segunda predefinida por ese elemento iterable.

Empezaré entonces por la segunda formulación, y veremos que la supuesta similitud es funcional, pero que en Python se rige por su propia lógica. Me refiero a la instrucción que se construye del siguiente modo:

for vcont in range(1,11,2):
  • vcont es una variable a la que damos la función de contador.
  • range(1,11,1) es una función (en realidad los expertos dicen que es una clase) que puede formularse como en este ejemplo, esto es: con tres valores numéricos separados por comas. En caso de escribirse así, el primer valor (1) identifica al valor de inicio del recorrido, el segundo (11) el valor final (también hace función de número de iteraciones o ciclos en los ciclos crecientes) y el tercero (2) el paso o salto de ciclo en ciclo. En su formulación más simple (range(11)) únicamente se especifica el número de ciclos o iteraciones, estado implícitos valores de inicio (0) y el salto (1). El de inicio se considera 0, puesto que 0 es el valor inicial de toda matriz en Python.
Veamos mejor un ejemplo para entender cómo funciona este ciclo:

        for vCont in range(1,11,1):
            print(vCont)

    Respuesta:
1
2
3
4
5
6
7
8
9
10
  • El inicio del bucle queda indicado por la sentencia For, su final con la eliminación de la sangría que se aprecia en la segunda línea (print(vCont))
  • Como ya dije respecto al condicional if, en Python la sangría no es únicamente un formalismo para facilitar la lectura del código, es parte de la sintaxis del lenguaje.
  • Como respuesta obtenemos un listado de números que finaliza en 10, y no en 11 como debería ser atendiendo al segundo valor de range(). Esto es así porque toda matriz en Python se inicia en 0. Nosotros al indicar que el recorrido comience en 1 estamos anulando la escritura de dicho valor inicial.
  • En consecuencia range(1,11,1) no es estrictamente equivalente a range(11), ya que el resultado de la segunda formulación incluye 0 como valor de inicio, mientras que en la primera formulación indicamos que ese valor sea 1. Lo que sí se mantiene es que el salto es de 1 en 1 (el tercer valor se supone implícitamente como 1) y el final es 10, por la misma razón que expuse antes.
  • También podemos escribir dos parámetros en la función range(), pero serán siempre el valor de inicio y el número de ciclos, si deseamos que esté incluido el parámetro paso estamos obligados a escribir los tres, ya que Python interpreta los dos primeros como valor de inicio y número de ciclos.
  • Estos valores tienen que ser siempre números enteros, no decimales.
  • Es posible plantear ciclos decrecientes, siendo obligado entonces que el valor de inicio sea superior al de final y que el paso sea un entero negativo.
for i in range(11,1,-1):
  • También podemos escribir en la sentencia print() el contenido de deseemos; el uso de la variable contador en el código anterior es meramente didáctico. Por ejemplo, podemos repetir un texto x veces o el contenido de una variable a la que previamente hemos asignado una cadena de caracteres.
vtexto="Hola personal"
for i in range(5):
    print(i)
    print(vtexto)

Respuestas:
    
0
Hola personal
1
Hola personal
2
Hola personal
3
Hola personal
4
Hola personal

La segunda formulación de este bucle es como medio para recorrer un elemento iterable, como es el caso de una lista o de una cadena de texto. Dado que aun no hemos hablado de los conjuntos de datos (una lista es un tipo de conjuntos de datos), me limitaré a utilizar for como "iterador" en su formulación más simple.

for i in (1,2,3):
    print(i)

Respuesta:
1
2
3

Pero también... 

for txt in("fresa","manzana","pera"):

    print(txt)

Respuesta:

fresa
manzana
pera

  •  En este caso la variable (i / txt) queda asociada a la lista de elementos que se definen entre paréntesis tras in()
  • Y lo que hace el bucle es recorrer esta lista y (mediante print()) escribirla en pantalla.
  • Este forma permite, con alguna variación, sustituir esta lista final de sentencia por el nombre de una colección de datos o de una variable de cadena (alfanumérica) que hayan sido previamente declaradas. Por ejemplo:

 var = "pelota"

for i in var:

    print(i)

Respuesta:

p
e
l
o
t
a

En este caso la lista que antes seguía a in es ahora la variable var. El ciclo recorre var asignando en cada ciclo cada uno de sus componentes (caracteres en este caso) a  la variable contador i. Mediante print() mostramos esos componentes por pantalla.

Son muchas las cosas que se pueden decir y hacer con For, pero para que se entiendan mejor es necesario trabajar antes con colecciones de datos, así que prefiero tratarlas más a fondo cuando trabajemos con esos elementos del lenguaje, por lo que queda pendiente para entonces. De momento no sería mala idea entrenar la sentencia For según las formas de uso expuestas en esta entrada.

No hay comentarios:

Publicar un comentario

Comenta esta entrada