domingo, 15 de septiembre de 2024

Lenguajes. Python

Componentes básicos

Todo lenguaje cuenta con una serie de componentes básicos que son los que permite desarrollar los procesos fundamentales de que consta el desarrollo de un algoritmo y que, en términos generales, se ajusta al conocido esquema entrada-procesamiento-salida.


En síntesis la programación o computación (y de ahí le viene el nombre) consiste en la ejecución de cómputos sobre datos para la obtención de unos resultados, sean éstos los que sean. Esto, que es otra forma de formular el esquema anterior, supone y pone en evidencia la importancia de disponer de datos o valores, bien sean que los incorporemos como parte del programa, o bien que cedamos al usuario (en parte) su introducción mediante algún tipo de interfaz de entrada. 

Pero lo que ahora nos interesa es constatar que esos datos se almacenan en espacios de memoria RAM y que para acceder a ellos necesitamos alguna forma de referenciarlos: este es el papel de las variables, que no son otra cosa que referencias a los datos, referencias conocidas por explicitadas, claro está. 

Al contrario de lo que el lenguaje natural da a entender, en realidad ni las variables contienen datos (no son espacios de memoria, sino referencia, identificadores o "nombres" de esos espacios de memoria) ni la dirección de la relación es var -> dato. En realidad, la relación es a la inversa var <- dato, y así se representa la referenciación del dato a la variables en los pseudolenguajes con que se expresan los algoritmos (1).

Los datos pueden ser de diferentes tipos, siendo los más destacados los alfanuméricos (caracteres y sus derivados, las cadenas de texto o string), los numéricos, en sus diferentes tipos (enteros y decimales) y los booleanos.

Como trabajar con variables individuales puede resultar poco eficiente, los datos se pueden organizar en colecciones. Estas colecciones reciben diferentes nombres y tienen distintas características y funcionalidades (no siempre equivalentes entre los diferentes lenguajes), pero podemos identificarlas grosso modo y en términos generales con lo que normalmente se denominan como matrices.

La segunda parte del significado de la computación es la realización de cómputos u operaciones sobre los datos. Esta fase es tan importante que ocupa el centro del esquema básico (Procesamiento), siendo su componente fundamental.  Estas operaciones dan nombre y sirven para definir al conjunto de instrucciones que llamamos operadores y que se diferencian en función de los datos con los que tienen que trabajar: operadores de string, operadores algebraicos y operadores lógicos son sus categorizaciones más comunes.

Aunque la forma de procesamiento de los datos suele ser predominantemente lineal y jerárquica, lo que define la programación como un proceso basado en la sucesión de instrucciones, existen dos estructuras fundamentales y complementarias que responden a dos principios: el de bifurcación y el de iteración: el primero se concreta en las estructuras condicionales en las que se basa la opcionalidad, y el segundo como estructuras cíclicas o bucles, que permiten la repetición de instrucciones n veces y/o condicionadas al cumplimiento de un criterio. La conjunción de estos tres principios: linealidad o sucesión, bifurcación e iteración, conforman el cuerpo de un script. Aunque no necesariamente tienen que estar las tres presentes, raro es el algoritmo de cierta complejidad que no las requiere en cierta medida.

Tan raro como lo es el algoritmo que se pueda desarrollar (2) recurriendo únicamente a una lógica de programación basada en un único script. Salvo los problemas simples, la mayoría requieren secuencias largas de operaciones y el uso de diferentes estructuras (incluyendo su combinación y anidamiento). Cuando esto se observa y especialmente cuando segmentos de código se repiten con cierta frecuencia es cuando tenemos que pensar en las ventajas de la programación modular, cuya expresión más simple es la definición de funciones (3). 

Cuando predomina el uso de funciones y su combinación sobre el código lineal, hablamos del paradigma funcional y cuando el procedimiento de trabajo se basa en definir objetos (clases de objetos) formados por características y funciones, entonces nos estamos situando en el paradigma de la programación orientada a objetos (POO).

Python se define como lenguaje basado en la POO (4), con Python podemos trabajar siguiendo el paradigma imperativo-lineal y también podemos crear funciones, así que se comporta como un lenguaje que nos permite aprender diferentes formas de trabajar y de afrontar la solución de los problemas que nos planteemos. 

Junto con su simplicidad (relativa) como lenguaje, esa flexibilidad en términos de formas de trabajo hace del lenguaje Python una buena herramienta para el aprendizaje; pero lo que es más importante: también para la resolución de los problemas específicos relativos a nuestro trabajo para los que nos planteemos desarrollar soluciones informáticas.

NOTAS

(1) Por ejemplo en [PSeInt], una excelente herramienta para el aprendizaje de la lógica de programación que recomiendo conocer (y emplear) para este objetivo. Además de trabajar con pseudocódigo y simular el funcionamiento del algoritmo, también dispone de herramientas de representación gráfica o diagramas de flujo.
(2) Al menos de forma eficiente.
(3) En algunos lenguajes (y también planteamientos teóricos) se diferencia entre subrutinas y funciones. En Python se mantiene la misma denominación para ambas, aunque se diferencias las funciones que devuelven datos de las que no.
(4) De hecho muchos de sus componentes no son otra cosa que objetosincluyendo los tipos de datos, como la clase string, lo que dota de gran potencia y versatilidad al trabajo con los datos ya que, en tanto objetos, tiene propiedades y métodos.

No hay comentarios:

Publicar un comentario

Comenta esta entrada