Tuto flash de de programación: Python la rompe I

Spread the love

Qué es programación y por qué Python?

Introducción

En la presente entrada vamos tener una pequeña introducción a la programación y a Python como lenguaje de programación. Exploraremos algunos elementos básicos de la programación como las variables, las condiciones y los ciclos, bucles o repeticiones (mismo nombre para lo mismo).

Hace años que no escribo en éste blog porque la dinámica laboral me ha absorbido totalmente y, la verdad, escribir una buena entrada requiere mucho tiempo y algo de preparación. Sin embargo, debido a la popularidad de Python como lenguaje de programación, aplicable casi a cualquier dominio de conocimiento y muy particularmente en redes de datos, decidí invertir un poco de tiempo en escribir y preparar un pequeño curso de programación usando Python con fines de redondearlo para otros propósitos 🙂

Es probable que las nuevas generaciones piensen que la programación es obsoleta porque existen las IAs generativas que pueden programar con sólo darle unas indicaciones precisas y estarían parcialmente en lo cierto, sin embargo, los verdaderos expertos hablan de las IAs generativas como muy buenas herramientas para aprender o acelerar procesos, pero no como reemplazos completos de la actividad humana. De qué serviría decirle a una IA que cree un programa, si no entiendo qué hizo ni sabría qué cambiar en caso de ser necesario? Queremos depender completamente de una IA para hacer nuestro trabajo? La discusión es muy larga y compleja, pero sólo les recomiendo que piensen un poco antes de creer que las IA hacen obsoleta la habilidad de programar.

La programación es un tema grande y diverso, hay varios «paradigmas» de programación, lo cual sólo significa que hay familias de lenguajes de programación con una forma específica de tratar los «objetos de datos» y las «lógicas de control», por ejemplo, los lenguajes más tradicionales establecen sólo condiciones y ciclos para hacer que una máquina programable ejecute alguna acción; otros lenguajes, para evitar que la complejidad de un programa haga difícil llevar control de lo que se desea lograr, encapsula funcionalidades con objetos dandole un poco de significado a éstos últimos y cohesionando las actividades de cada uno de estos objetos. Éstos dos paradigmas de programación los conocemos como lenguajes estructurados y lenguajes orientados a objetos (OOL).

Por último, hay lenguajes con «filosofías» más sofisticadas con propósitos muy especializados. Recuerda que los paradigmas de programación son familias de lenguajes, es decir, los lenguajes de programación se enmarcan dentro de un paradigma, todos diseñados con la finalidad de hacer que las máquinas programables hagan lo que los humanos queremos que hagan. Unos lenguajes son muy específicos y el humano tiene que describir escenarios detallados y acciones a ejecutar en cada uno de ellos, otros, permiten que el humano sólo especifique un poco el objetivo y algunas condiciones para que el lenguaje haga que la máquina llegue a esos resultados sin tener que escribir tanto detalle. Yendo más lejos, las IA permiten usar los lenguajes naturales (Español, Inglés, Francés, etc.) como lenguajes de programación del más alto nivel posible, es decir, diciendole a un sistema qué hacer. No sé si podamos llamar a las IAs un nuevo paradigma de programación pero vale la pena considerarlo.

Python es uno de los lenguajes más populares y el de mayor crecimiento en la industria actualmente. Es un lenguaje que ha llegado a todos los dominios de conocimiento y tiene librerías para hacer casi cualquier cosa, adicionalmente, ha evolucionado de tal manera que es eficiente en la forma de usar los recursos de cómputo y resulta fácil de usar/aprender. Ésta última probablemente sea la razón por la cual crece tan rápido y se ha popularizado tanto.

Qué es programabilidad?

Cualquier cosa, que permita darle unas instrucciones para ser ejecutadas independientemente del humano que las introdujo se puede considerar programable. Por ejemplo, podríamos decir que una lavadora es programable y no estaríamos faltando a la verdad. Qué tan sofisticada es la programación de una lavadora es otra cuestión completamente diferente. Una lavadora, se puede considerar programable desde varias perspectivas: 1 la del fabricante, 2 la del usuario. El fabricante ha puesto sensores en la lavadora y ha diseñado un menú de acciones que hace que la lavadora, sin intervención humana, detecte el peso de la ropa y actúe en consecuencia, por ejemplo, sugiriendo al usuario un ciclo de lavado específico con base en el peso de la misma. El usuario, de otro lado, le indica a la lavadora cuánto tiempo quiere que trabaje y con qué intensidad, por ejemplo que haga un lavado fuerte o suave durante 30 minutos o 60 minutos, con o sin escurrido. En resumen: cualquier dispositivo al que se le den algunas instrucciones y éste ejecute acciones por su cuenta es programable.

Sin embargo, la lavadora u otros dispositivos del hogar tienen un conjunto muy limitado de instrucciones que el usuario puede dar, cuando un dispositivo permite muchas instrucciones el juego se pone interesante. Una computadora o un celular, que en esencia es una computadora de bolsillo, tiene un conjunto mucho más grande y detallado de instrucciones y es mucho más difícil de programar que una lavadora o un horno. No sólo lo que se le puede indicar sino las acciones que puede ejecutar son más diversas. Una computadora o celular, se pueden considerar máquinas de programabilidad «universal» en el sentido de que su programación no tiene un propósito específico como sí lo tiene un automóvil, una lavadora o un horno. Lo que se puede hacer con una computadora o cualquier otro dispositivo de cómpudo es «universal», es decir, puede ser cualquier cosa en el alcance de sus capacidades físicas (memoria, cpu, sensores y actuadores).

Qué es programación estructurada?

La verdad no sé si todavía se usa el término, pero cada vez que se usan estructuras de condiciones y repeticiones, hablamos de programación estructurada. La programación, en general, usa los recursos de la máquina de cómputo para prever escenarios en los cuales actuar cuando estos escenarios se presenten (detecten). Podríamos definir un escenario como «si la puerta está abierta» o «si la pantalla está apagada». Éstos escenarios están definidos mediante una condición que se declara con la palabra «si» y una condición se debe cumplir. A ésta palabra, la llamaremos estructura de control y corresponde a vincular la ejecución de «algo» (otras instrucciones) a que se cumpla una condición. Los lenguajes definen cómo se escribe un si con su respectiva condición, por ejemplo, por lo regular todos los lenguajes utilizan la palabra «if» para indicar a la computadora que evalúe una condición y a partir de ella ejecute o no otras instrucciones.

La otra estructura de control típica son los ciclos, es decir, repeticiones de instrucciones. En principio suena un poco estúpido repetir instrucciones, pero hay que recordar que las instrucciones usan datos que pueden variar, por ende, aunque las instrucciones sean las mismas, la información con la cual se ejecutan puede cambiar y por ende el resultado puede variar, por ejemplo: escribir una tabla de nros se corresponde con un ciclo en el que los números cambian pero las instrucciones no. Los ciclos tienen varias formas de expresarse, por ejemplo, podemos hablar de ciclos «mientras» en los cuales si una cierta condición se cumple se ejecutan las instrucciones del ciclo, otro ciclo común es un ciclo «para» o «por» en el cual le indicamos a la computadora cuántas veces ejecutar el conjunto de instrucciones del ciclo.

Por qué es importante la programación estructurada? Porque todos los lenguajes incorporan éstas estructuras de control de alguna manera, es más, dispositivos tan simples como un foco «inteligente» usa éstas estructuras. Cuando uno compra un foco inteligente y lo quiere programar para que se encienda/apague a cierta hora, la app con la cual lo programamos nos permite establecer una condición, que usualmente es la hora a la cual queremos ejecutar la acción y la acción sería encender o apagar. Adicionalmente, podemos decirle que lo haga regularmente y eso lo podríamos considerar un ciclo, cuya condición de control puede ser algo como «todos los días» o «todos los lunes» o «de lunes a Viernes», en éste caso la instrucción de apagado/encendido se ejecuta regularmente a cierta hora.

Memoria y CPU

En programa, entonces, es un conjunto de instrucciones agrupadas en condiciones, ciclos y funciones (luego definiremos qué son) y lo que hacemos con un programa, es controlar el uso de los actuadores de una máquina programable, por ejemplo, la pantalla del celular, sus bocinas, etc. De otro lado, ésto lo logramos indagando en el estado de sus sensores: el teclado, la pantalla misma, el sensor de movimiento, etc. Pero cómo lo hacemos? manipulando la memoria y un procesador del mismo.

Los lenguajes son la cara de ciertas aplicaciones ya escritas por alguien más, en el caso de Python, el lenguaje siempre es ejecutado por un intérprete que convierte las instrucciones escritas en Python a instrucciones de la máquina que estamos controlando, eso hace que el lenguaje sea multiplataforma: el mismo programa, sin cambios se puede ejecutar en diferentes plataformas, una laptop, un celular, un server. Con el lenguaje accedemos a las posiciones de memoria y procesadores del dispositivo de una manera más fácil que lo que realmente es, es decir el lenguaje se traduce a más instrucciones y mucho más específicas para cada máquina/plataforma.

Para manipular la memoria declaramos variables, una variable es un nombre que le ponemos a un dato que vamos a manipular pero no sabemos qué contiene exactamente. Por qué no sabemos? porque estamos previendo un escenario en el que el dato puede cambiar, por ende debemos prepararnos para manipularlo sin saber exactamente cuál es. Por ejemplo, si queremos hacer una calculadora, podríamos decirle al usuario que digite un par de números con un operador y Python calculará el resultado, por ejemplo si el usuario digita 2, +, 2, Python debería responder imprimiendo en alguna parte 4. Pero el programa dirá «x operador y», y no sabemos qué valores va a contener x, y o qué es el operador, el usuario podría haber escrito 123456 en x, 55 en y y haber escrito «^» cuando se le pregunte por el operador, el programa, entonces, debería calcular el resultado de elevar a 55 el valor 123456. A éstos «nombres» de datos desconocidos los llamamos variables.

Cómo manipulamos un procesador? Mediante las estructuras de control mencionadas. Por ejemplo, continuando con el tema de la calculadora, una buena calculadora no debería dividir por cero, entonces la calculadora debe checar si el operador es «división» y si su segundo operando es 0, en ese caso no debería calcular nada sino sacar un menaje de error que indique que no es posible dividir por 0. Cada vez que usamos una condición estamos manipulando un procesador del dispositivo, los procesadores por lo general ejecutan las condiciones. Cuando hacemos los cálculos también manipulamos un procesador, por ejemplo, al hacer el cálculo que solicitó el usuario en realidad le estamos trasladando a la cpu la labor de hacerlo. Si en algún momento el programa dice «x operador y», ésto hace que el procesador calcule el nro. resultante.

Tipos de datos, funciones y métodos

Los lenguajes de programación modernos casi todos son orientados a objetos, eso significa que cada variable que declaramos tiene asociada funcionalidades, éstas funcionalidades son operaciones que podemos hacer con los datos que contiene la variable. Por ejemplo, cuando un dato es numérico se le llama entero si no tiene decimales o flotante si tiene decimales, a un nro entero le puedo sumar, multiplicar, dividir, etc, pero a una variable de tipo flotante (es decir nro con decimales), también le podría querer redonder su valor, por ejemplo si el valor que contiene la variable x es 8.6 yo podría querer redondarlo a su nro mayor, por ejemplo a 9 o viceversa, redondearlo a la baja. En el caso particular de Python, los nros no son objetos per sé y se les aplican funciones, por ejemplo, para redondear una variable a su valor entero mayor se puede usar la expresión ceil(x) o a su entero menor floor(x), donde x es la variable y ceil o floor es una función (hay que importar las funciones antes de ejecutar). Algunas variables u objetos se les especifica una acción agregandole un punto al nombre de la variable y llamando una operación, a ésta operación se le llama método porque así se llaman las funcionalidades adicionales de los objetos. Por ejemplo, si a contiene una cadena de texto, digamos «cesar», yo podría querer que ésta cadena tenga la primera letra en mayúsculas, como a es una cadena y en Python éstas cadenas son objetos, llamo a su método capitalize() para cambiar su contenido: a.capitalize(), ésto me devuelve el valor «Cesar».

El intérprete de Python

Una de las características más populares de Python es que es un lenguaje interpretado, lo cual significa que podemos escribir el programa e ir probando qué hace, lo cual nos permite ver si el programa hacer lo que creemos que va a hacer y no otra cosa. Hay muchos intérpretes de Python, incluso los hay en webs interactivas que es lo que usaremos en ésta publicación. Personalmente, para casi todo lo web, sugiero usar las herramientas de W3C que es una organización internacional dedicada a promover el uso y conocimiento de tecnologías web. Puedes entrar al intérprete de Python en línea mediante éste enlace. Los botones marcados como «run» o «Try it yourself» permiten ejecutar instrucciones en Python. En el resto del tutorial vamos a usar una herramienta más profesional llamada PyCharm, que es un ambiente integrado de programación o IDE (integrated development environment) pero por ahora nos quedamos en el intérprete en línea.

Lo que vemos en la imagen son unas instrucciones del lado izquierdo (blanco) de la pantalla y lo que el programa haría del lado derecho (negro). Más adelante veremos por qué se escribe lo de la izquierda y cómo modificarlo, pero por el momento basta con entender que del lado izquierdo hay un programa y del lado derecho está el resultado. Podemos modificar todo lo que está entre comillas siempre y cuando mantengamos el cierre de las comillas. También podríamos agregar a cada variable el método capitalize escribiendo, sin dejar espacios, un punto y la palabra capitalize(), es decir: x.capitalize() Qué diferencias existen en el resultado sin el método y con el mismo? Intenta usar upper() en vez de capitalize(), qué ocurre?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.