viernes, 13 de septiembre de 2024

Lenguajes. Python. Variables

Variables alfanuméricas (cadenas)

Inicio esta sección del blog no con el análisis del elemento más básico, que es el carácter, pero sí con el que resulta ser el mínimo funcional para el trabajo con textos mediante Python: las cadenas alfanuméricas o string.


Como ya vimos en [esta entrada] (pendiente), las cadenas alfanuméricas son uno de los tipos de datos que podemos manejar con el lenguaje Python, y el fundamental para lo que en esta sección [TEXTOSnos ocupa (las distintas forma de manejar textos) y nos interesa (automatizar la creación de textos) en función del interés que tiene para el trabajo del orientador.

Empezaré por tratar con más detalle sobre las cadenas de caracteres (string, de ahora en adelante), tanto por su carácter básico como por el estatus que en realidad tiene que posiciona al string en una zona intermedia entre el dato y la colección de datos. Esto incrementa la complejidad de tratamiento, pero también ofrece un amplio conjunto de posibilidades de manejo en Python (1).

Ya sabemos por lo visto en la sección [LENGUAJE] que, al contrario que en otros lenguajes, en Python no es necesario declarar previamente de qué tipo es una variable (2), siendo suficiente con asignarle contenido para que quede realizado el tipado, que, además, se modificará en función de los cambios de contenido que pueda recibir la variable a lo largo del programa. En consecuencia, la asignación de contenido string a una variable en Python es tan sencillo como esto: VarSaludo = "Hola Mundo"Y es igual de sencillo para contenidos mínimos (un carácter) que máximos (un texto completo).

Precisamente por ello, disponemos en Python de determinadas funciones que nos permiten conocer de qué tipo es cada variable (3), una de ellas es la función type() (4). Usando esta función podemos apreciar el significado de Python como lenguaje de tipado dinámico:

var1 = "1"
print(type(var1))
<class 'str'>

Inicialmente asigno a var1 el dato alfanumérico "1" (var1 = "1") y mediante la función type() (print(type(var1))) obtengo información respecto a su categorización como string (<class 'str'>), pero si modifico el dato asignado a var1 (ahora como valor numérico -> var1 = 1), lo que me devuelve la type() es que la variable es (pertenece a la clase de tipo) integer (<class 'int'>).

En esta primera entrada me limitaré a tratar dos de los procesos implicados en el desarrollo de un algoritmo: la entrada o input y la salida o output. El procesamiento, que es la parte más compleja, requerirá diversas entradas, aunque la primera y más básica (al menos para lo que a nuestros objetivos ser refiere) es el encadenamiento de string, por lo que trataremos esta cuestión en breve.

Para en entrada (input) de datos, en Python empleamos la función input() (5), con la que obtendremos resultados diferentes en función del modo (directo o indirecto) en que usemos dicha función. Si la usamos directamente (input ("Nombre: ")) ...

input ("Nombre: ")
             
Nombre: Javier
'Javier'

... en el modo directo (desde el Shell) se producirá la ejecución de la instrucción, a la que responderemos (Nombre: Javier) y obtendremos como resultado nuestra respuesta entrecomillada ('Javier'), clara indicación de que el "programa" nos está devolviendo un dato de tipo string.

Pero si la empleamos indirectamente, esto es, asociada a una variable (vsNombre = input("Nombre: " )), también en el Shell, obtendremos como respuesta de ejecución la petición realizada (Nombre:), quedando el programa a la espera de nuestra respuesta (igual que antes), pero a diferencia del procedimiento anterior, una vez que respondemos a la petición de entrada de datos, el programa finaliza o queda a la espera de las siguientes instrucciones, esto es, no produce ninguna salida informativa como sí hizo antes.

Es este el momento en el que entra en acción la función output (salida) print() (print (vsNombre)), que produce aparentemente la misma salida, pero con una diferencia: ahora el string de respuesta no aparece entrecomillado (Javier). Esta pequeña gran diferencia está informando de que la respuesta no es informativa del sistema, es la continuación del programa mostrando la salida esperada en función del procesamiento del dato entrante que previamente hemos suministrado, procesamiento que ha realizado la función print().

Digo pequeña diferencia porque únicamente aparenta ser una cuestión de forma (con vs. sin comillas), pero en realidad es una diferencia grande, dado que afecta a la lógica del funcionamiento del código: quedar a la espera de una nueva instrucción implica solicitar continuidad del procesamiento, que en este caso se concreta como función de salida (print()) (6). Podemos considerar la combinación input() - variable - print() como la base del proceso de programación, esto es, de generación de un procedimiento basado en un algoritmo.

Otras formas de construir estos pequeños "programas" (7), empleando únicamente ambas funciones, es informar primero (mediante print()) de la demanda que sigue, y que se canaliza a través de input(), para devolver finalmente el resultado mediante (de nuevo) la función print():

print("Por favor, dime tu nombre:")

Por favor, dime tu nombre:

vsNombre = input()

Javier

print(vsNombre)

Javier

También podemos hacer uso del argumento end de la función print(), evitando así el salto de línea en el momento de la ejecución del programa (print("Por favor, dime tu nombre:"), end="")

De estas diferentes formas de trabajar con los procesos de entrada y salida, el más común es el primero, pero todos ellos no dejan de ser variaciones sobre el mismo procedimiento de escaso interés práctico; lo importante es que sobre ellas construiremos el trabajo con los textos, según iremos viendo en las entradas que siguen en esta sección.

NOTAS

(1) Un string es ciertamente un dato (una unidad de información) que podemos manejar como tal mediante su asignación o referenciación a una variable, pero también una colección de caracteres. Siendo como es el carácter el elemento mínimo de información del string, este se comporta (y se maneja) como colección de datos, más concretamente como lista, de ahí que en Python sea posible trabajar con el string como con una lista. En realidad, en términos de modelo de objeto, el string es una clase de objeto, por lo que en el trabajo con él podemos hacer uso de los métodos y los atributos que tiene asociados. De ahí la riqueza y la complejidad de presenta Python en el manejo de este tipo de dato.
(2) Recuerda lo explicado [en esta entrada] (pendiente) respecto a Python como lenguaje de tipado dinámico: la variable es del tipo del dato que se le asigne. En otros lenguajes, como en OOo Basic, podemos (y es conveniente) determinar a priori el tipo de dato que contendrá una variable antes de realizar la asignación (Dim sNombre As String) como paso previo para sNombre = "Javier"). Esta exigencia, al menos en algunos lenguajes, resulta conveniente, ya que evita errores de programación cuando el script es de cierta complejidad y extensión.
(3) Ya sabemos que lo correcto es decir qué tipo de contenido o dato está referenciado por una variable, ya que la variable no es otra cosa que un identificador, una clave, que facilita al lenguaje el acceso a una posición de memoria RAM en la que se almacena el dato; en este caso nuestro string. Pero, a riesgo de simplificar, en este blog emplearé expresiones como la anterior, ya que resulta más sencillo y se supone al lector el conocimiento teórico básico suficiente para no dar lugar a una confusión que, por otra parte, es poco relevante en términos operativos.
(4) Desde [este enlace] puedes acceder a una explicación más detallada sobre funciones y formas de conocer el tipo variable. En relación con la naturaleza de objeto que tienen los tipos de datos (entre ellos los string) es interesante la información que se aporta el enlace anterior respecto a las funciones dir() y __class__, que permiten conocer los atributos de cada clase-tipo de dato.
(5) input() devuelve siempre y por defecto un string, por lo que si trabajamos con datos de otro tipo deberemos convertirlos al tipo mediante las funciones correspondientes. Aquí, como estamos trabajando con string, esa conversión no es necesaria.
(6) El Shell también nos permite comprobar el funcionamiento de print() como función pura, siendo esta precisamente la forma básica y prototípica en que suele empezar todo aprendizaje de un lenguaje de programación (print("Hola mundo") -> Hola mundo). Obsérvese como la respuesta no está entrecomillada.
(7) Esto y lo que sigue tiene sentido más como parte del aprendizaje formal del lenguaje que utilidad práctica (en este sentido sólo aporta variaciones sobre el mismo tema) y es más propio de trabajo sobre la utilidad de escritura de código del IDLE que para su implementación directa en el Shell.

No hay comentarios:

Publicar un comentario

Comenta esta entrada