Introducción a Python - Curso Python - día 1

Introducción a Python - Curso Python - día 1

Python es uno de los lenguajes de programación más populares, versátiles y fáciles de utilizar. Por eso he decidido escribir esta serie de artículos, proponiendo conceptos y ejercicios para enseñarte a programar en Python en cuestión de semanas. A lo largo de estos artículos te explicaré los conceptos básicos y te propondré ejercicios. Si realmente […]

Categorías: Cursos

Adrián Garzón Ximénez - Desarrollador Fullstack


Python es uno de los lenguajes de programación más populares, versátiles y fáciles de utilizar. Por eso he decidido escribir esta serie de artículos, proponiendo conceptos y ejercicios para enseñarte a programar en Python en cuestión de semanas.

A lo largo de estos artículos te explicaré los conceptos básicos y te propondré ejercicios. Si realmente quieres aprender, mi recomendación es que hagas los ejercicios y leas sus explicaciones. Es más, haz variaciones para interiorizar los conceptos que vayamos trabajando. También incluiré materiales adicionales para que puedas profundizar, por lo que te recomiendo consultarlos.

Tal vez, en el futuro, prepare unos vídeos para acompañar el curso. De momento, si necesitas más información, te recomiendo recurrir a Google, YouTube y Stack Overflow. También puedes contactar conmigo a través de LinkedIn.

Mi idea es ir construyendo poco a poco tu conocimiento de Python, desde cero. No es necesario que sepas programar y, de hecho, si sabes programar puedes leer las primeras entradas en diagonal, o ir directamente a los ejemplos de código. Probablemente, ya conozcas los conceptos que esté introduciendo.

Aprender a programar en Python. Día 1

Durante el día de hoy te hablaré de:

  • Las funciones print() e input(), que nos permiten mostrar información o recabarla a través de la consola.
  • Nuestra primera estructura de datos: las strings o cadenas de textos.
  • Conceptos básicos en torno a:
    • Funciones.
    • Orden de ejecución de las mismas.
      • Introducción a otra estructura de datos pila o stack.
    • Variables.
    • Asignación y reasignación de valores.

Lo haremos con tres aplicaciones muy sencillas, pero que contienen los conceptos básicos para introducirnos en Python.

¿Por qué aprender Python?

Python ha sido, desde hace años, uno de los lenguajes de programación más populares, siendo el segundo más demandado en 2022. Se trata de un lenguaje flexible y fácil de utilizar, que nos permite desarrollar diferentes tipos de aplicaciones. Destaca en el desarrollo de aplicaciones backend, data science e inteligencia artificial.

Python se desarrolló bajo licencia de código abierto, una de las razones por las que posee una comunidad tan amplia. A la hora de aprender un lenguaje de programación, la comunidad es una de las piezas esenciales. Cuantos más seguidores tenga, más fácil será encontrar recursos y ayuda, por lo que la popularidad de Python lo convierte en un lenguaje idóneo.

Por último, su facilidad de uso y aprendizaje lo convierte en el lenguaje elegido por la mayoría de docentes cuando van a enseñar programación a recién llegados.

¿Qué es Python?

Aunque se trata de un lenguaje orientado a objetos, incorpora características propias de paradigmas imperativos, funcionales, procedurales y reflexivos. Esto lo hace flexible y fácil de aprender y utilizar.

Una de sus principales características es que es un lenguaje interpretado. Es decir, no debe compilarse, como Java o C, sino que se interpreta en tiempo de ejecución. Basta con contar con un intérprete para poder utilizarlo en cualquier plataforma.

Python se define como un lenguaje de programación que te permite trabajar rápidamente e integrar sistemas de forma más efectiva. Si quieres aprender a programar en Python, puedes consultar su extensa documentación o los múltiples recursos formativos y videotutoriales que encontrarás online.

Curso de desarrollo con Python

En esta línea de artículos encontrarás un curso de desarrollo con Python. Mi idea es recorrer sus características esenciales de forma rápida, incluyendo recursos en cada lección para que puedas profundizar.

El objetivo es que en un par de meses puedas utilizar el lenguaje con fluidez. Para ello, incorporo ejercicios en cada entrada, que te recomiendo hacer para interiorizar los conceptos que vaya presentándote.

Para esta primera sección y las siguientes utilizaré replit, un IDE (Integrated Development Environment) que corre en el navegador y que puedes utilizar de forma gratuita. Gracias a esta herramienta te podrás poner a programar desde el minuto cero sin preocuparte de la configuración, que dejaremos para más adelante.

Recuerda que para aprovechar el curso es importante:

  1. Seguir las lecciones por orden.
  2. Realizar todos los ejercicios. Es más, haz variaciones para profundizar e interiorizar cada concepto.
  3. Consultar en Google, Stack Overflow y las redes sociales si tienes dudas. Recuerda que puedes encontrarme en Linkedin.

Secretos del programador

Aunque en el futuro colgaré algunos consejos para principiantes, aquí te traigo un par de los más importantes:

  1. Lee los errores. Siempre que la consola te arroje un error, fíjate en qué te está diciendo. Empieza por el primer error y ve resolviéndolos hasta que no haya ninguno. Si no entiendes qué te está diciendo, copia y pega en Google. Seguro que stack overflow tiene una respuesta para ti.
  2. Consulta. Lee la documentación del lenguaje de programación que estés aprendiendo. Es tedioso, pero te ayudará a entenderlo mejor. Hazlo poco a poco para no agobiarte y consulta diversas fuentes (stack overflow, medium…).

Manos a la obra: imprimir en pantalla. “Hello World” en Python

La costumbre al aprender cualquier lenguaje de programación es empezar escribiendo un programa “Hello World”. Su objetivo es, simplemente, imprimir “Hello World” en la pantalla.

Para hacerlo, date de alta gratuitamente en Replit. Al acceder, la aplicación te guiará a través de la interfaz, para que sepas cómo utilizarla. Una vez te hayas dado de alta y estés familiarizado con la interfaz, crearás tu primer Repl.

Para ello haz click en crear. A la hora de elegir una plantilla, deberás seleccionar Python. Ponle un nombre a tu Repl y selecciona “Create Repl”.

A continuación se abrirá tu entorno de desarrollo. Allí podrás introducir tu primera línea:

print("Hello World")

Por último, ejecuta el código haciendo click sobre “Run”... y habrás ejecutado tu primer programa.

https://replit.com/@AdrianGarzon/Hello-World

print()

Con esta anecdótica aplicación has utilizado la función print(). Esta función se encarga de imprimir en la consola el resultado proporcionado entre paréntesis, que es su argumento. Por tanto:

  1. Una función es un código ejecutable que realiza tareas cada vez que la invocamos (más adelante aprenderemos más sobre las funciones).
  2. Las funciones pueden tener parámetros (en este caso “Hello World”), que son piezas de información que proporcionamos a la función para que ejecute su cometido. En este caso, imprimir el parámetro proporcionado en pantalla.

“Hello World” parece una aplicación bastante inútil. Pero nos proporciona una herramienta para analizar el contenido de nuestro código: la función print().

Strings

Además de una función, en Hello World hemos utilizado una string (cadenas). Las strings son cadenas de caracteres, y en programación equivalen a texto plano. Como ves, las proporcionamos como argumento a la función print() introduciéndolas entre comillas.

En python podemos utilizar comillas simples y comillas dobles para delimitar una string:

"Esto es válido"
'Esto también'

También podemos combinarlas, lo que nos resultará útil si necesitamos imprimir comillas dentro de nuestra cadena de texto:

"Aquí se abren las dobles comillas 'Y aquí las simples' pero siempre debemos cerrarlas al terminar la cadena de texto 👉"

Recuerda:

  • Una string es una cadena de caracteres. Ten en cuenta que los espacios son caracteres, así que si quieres que se muestren en la consola tendrás que incluirlos dentro de la cadena de texto.
  • Podemos abrir una string con comillas simples o dobles, pero siempre debemos cerrarlas utilizando el mismo símbolo que hayamos usado al abrirlas.
  • Siempre debemos cerrar la string cuando termine la cadena de texto. Si no cerramos correctamente la string, el intérprete entenderá que la cadena de texto no ha concluido y no podrá seguir ejecutando su programa.

Manipulación de cadenas de texto (strings)

Los lenguajes de programación nos permiten manipular cadenas de texto. A lo largo del curso iremos viendo algunas formas de hacerlo, pero de momento basta que sepas que puedes concatenarlas utilizando el operador +

"Esto " + "es una única cadena"
# Equivale a:
"Esto es una única cadena"

Comentarios en python

En el ejemplo anterior he introducido un comentario. Los comentarios son líneas precedidas por un símbolo de almohadilla:

# Esto es un comentario

La particularidad de los comentarios radica en que los ignorará el intérprete. Son una herramienta idónea para dejarnos notas que expliquen qué hace el código o recordatorios para el futuro, ya que no se ejecutan. Sin embargo, hay que utilizarlos con cuidado. Sobre el uso de comentarios, escribiré un artículo en el futuro.

Variables en Python e interacción con el usuario: la función input()

Uno de los problemas de la aplicación “Hello World” es que siempre que la ejecutemos obtendremos el mismo resultado. Pero normalmente, cuando escribimos un programa, queremos diferentes outputs para diferentes inputs. Es decir, queremos resultados diferentes para escenarios diferentes. O, dicho de otro modo, queremos un comportamiento dinámico.

Para ello vamos a necesitar almacenar y gestionar información, cosa que haremos mediante las variables. Y como introducción, vamos a crear un nuevo programa. En esta ocasión se trata de un saludador.

Crea un nuevo Repl e inserta el siguiente código, que comentaré a continuación. No olvides hacer variaciones para entender e interiorizar los conceptos (aunque de momento sean muy sencillos).

name = input("What's your name?\n")
print("Hello, " + name)

input()

La función input() nos permite solicitar al usuario la introducción de datos. Como argumento tendremos que pasarle una string, que es la pregunta (prompt) que queremos hacer al usuario.

Verás que he cerrado mi prompt de una forma un poco peculiar: \n

\n se utiliza para introducir un salto de línea, tanto en Python como en otros lenguajes de programación. Su efecto es que cuando ejecutes el programa, el cursor saltará a una nueva línea para que el usuario introduzca ahí su input. Se trata de una cuestión meramente estética, y te recomiendo que lo elimines del código para ver el resultado. Como comprobarás, todo funciona correctamente, pero el cursor aparece inmediatamente después del prompt, lo que hace que el programa parezca más desorganizado o incluso roto.

Fuera de esta peculiaridad en el prompt, el uso que hemos hecho de input es el básico. Input imprimirá en pantalla el prompt que le hayamos facilitado como argumento e interrumpirá la ejecución del programa hasta que el usuario haya introducido un valor y pulsado intro. A partir de ese momento, input equivaldrá a ese resultado. En seguida te explicaré cómo aprovechar esa equivalencia.

Orden de ejecución

En la primera línea de nuestro programa estamos declarando nuestra primera variable. Ahora entraremos en las variables, pero antes pensemos en cómo está funcionando esta línea.

Aquí estamos diciendo que la variable “name” equivale al resultado de “input(“What’s your name?”). Pero no conocemos el resultado de input(), pues este depende del input del usuario.

Repito: como hemos dicho, el valor de input() equivale al input del usuario. Por tanto, para poder asignar este valor a la variable “name”, primero tendremos que obtenerlo. Y esto nos indica el orden de ejecución en Python (y otros lenguajes de programación).

Lo que va a hacer el intérprete al leer esta línea es:

  1. Antes de asignar ningún valor a la variable “name”, detener la ejecución y preguntar al usuario por su nombre.
  2. El usuario introducirá su nombre, dando un valor a input().
  3. Por último, el programa asignará este valor a la variable “name”.

Dicho de otro modo, la parte derecha de la asignación se resolverá antes que la parte izquierda. Es decir, en estos casos, la última función invocada será la primera en resolverse. De otro modo, las operaciones previas (en este caso, la asignación del valor a la variable) no podrían realizarse, porque todavía no conocemos el resultado de las funciones de las que dependen (en este caso, la recepción de un input del usuario).

Para que entiendas mejor este comportamiento, he preparado dos variaciones del código.

Variación 1. Orden de ejecución

Modifica el código sobre el que estás trabajando para que quede así:

print("Hello, " + input("What's your name?\n") )

¿Qué está ocurriendo aquí?

  1. El programa debe imprimir "Hello, " + input("What's your name?\n")
  2. Para ello, necesita saber qué valor tiene input("What's your name?\n")
  3. Para ello, debe detener la ejecución y consultar al usuario.
  4. Cuando el usuario introduce su nombre (supongamos, “Raspas”), input("What's your name?\n") equivale a “Raspas”.
  5. Por tanto, "Hello, " + input("What's your name?\n") equivale a "Hello, " + “Raspas”.
  6. Como resultado, imprime “Hello, Raspas”.

Esta forma de ejecución se conoce como stack. En artículos más avanzados explicaré en detalle esta estructura de datos, pero de momento basta con que sepas cómo funciona.

Básicamente, el stack va registrando las funciones a realizar. Cuando ya no hay más funciones que registrar, las va ejecutando de una en una, empezando desde la última registrada y eliminándolas de la pila una vez ejecutadas.

En este caso, se ejecuta input() y luego print(). Es decir, se trata de un apilamiento de funciones que se ejecutan conforme a un sistema LIFO (Last-In, First-Out).

Este orden de ejecución permite que vayamos obteniendo los valores de las funciones anidadas, obteniendo el resultado final una vez hemos ejecutado toda nuestra pila de funciones. Veamos otro ejemplo con un nivel adicional de anidación.

Variación 2. Concatenación de funciones

En esta ocasión, vamos a incluir dos nuevas funciones a nuestro programa:

  1. len() espera una string como parámetro, y devuelve su número de caracteres.
  2. str() espera un número como parámetro, y devuelve el número como string. Más adelante hablaremos de los tipos de datos y su conversión.

Modifiquemos nuestro programa:

print("Your name has " + str(len(input("What's your name?\n"))) + " letters")

¿Qué está pasando ahora?

  1. Registramos en el stack o pila la función print().
  2. A continuación registramos la función str().
  3. La siguiente función en registrarse es len().
  4. Por último, se registra la función input(). Como no hay más funciones anidadas, comenzará la ejecución de la pila, desde la última a la primera función en registrarse.
  5. Se ejecuta la función input(), que toma como valor el input del usuario (supongamos “Raspas”).
  6. Se ejecuta la función len(), que toma como valor el número de caracteres de “Raspas” (que son 6).
  7. Se ejecuta la función str(), que convierte 6 en una string (es decir, “6”).
  8. Se ejecuta la concatenación , que convierte “Your name has “ + “6” + “letters” en una única cadena (que es “Your name has 6 letters”).
  9. Se ejecuta print(), que imprime por pantalla “Your name has 6 letters”.

No es imprescindible que entiendas a la perfección cómo funciona un stack ahora mismo. Pero sí es conveniente que entiendas que este es el orden de ejecución en python y otros lenguajes, por lo que:

  1. Las operaciones a la derecha de asignadores (name = input(“escribe tu nombre”)) se resolverán en primer lugar, para poder atribuir su valor a la variable.
  2. Puedes encadenar funciones, y estas se resolverán desde “dentro” hacia “afuera”. Es decir, las últimas en invocarse serán las primeras en ejecutarse, para poder ofrecer su resultado a las funciones de las capas exteriores.

Variables

Las variables son una pieza clave en cualquier lenguaje de programación. Se trata de “contenedores” donde podemos meter información. Literalmente, son espacios reservados en la memoria de la máquina para guardar valores.

Aunque profundizaremos en el concepto, de momento basta con entender que una variable se compone de un nombre y un valor.

  • El nombre de una variable lo definimos nosotros en nuestro código. Tenemos cierta libertad para nombrar una variable (en la siguiente sección trataremos esta cuestión). Una vez seleccionado el nombre de nuestra variable, podremos utilizar este nombre para acceder a su contenido.
  • El valor de una variable se asigna mediante el operador de asignación, que es este símbolo: “=”. Es importante no confundirlo con el operador matemático de igualdad. Cuando hable de la igualdad verás que en programación se utiliza otro símbolo para determinar si los términos a ambos lados del operador son iguales o no. De momento quédate con que “=” está asignando a la variable de su izquierda el valor de su derecha.

Para declarar variables en Python, simplemente escribimos el nombre de la variable, seguido del operador de asignación, seguido de su valor. Por ejemplo, en nuestro código lo hemos hecho en la primera línea:

name = input("What's your name?\n")

Ejemplos más sencillos serían:

name ="Raspas"
age = 55

¿Para qué sirven las variables?

Las variables nos permiten almacenar e identificar información. Esto nos permite acceder a esa información posteriormente.

Hay dos escenarios en que las variables son especialmente útiles:

  1. Cuando no conocemos su valor de antemano. Por ejemplo, en nuestro programa no sabemos cómo se llama el usuario. Pero esto no nos impide escribir una aplicación que lo salude o cuente las letras de su nombre, porque las operaciones que debemos realizar (imprimir un texto o contar sus caracteres) se pueden ejecutar sobre la variable una vez definida.
    Piensa que, sin una variable que almacene el valor de input, tendríamos que pedir al usuario que introdujera su nombre cada vez que necesitemos realizar operaciones con él (imprimirlo, contar sus letras…).
    Sin embargo, al almacenar el nombre en una variable podremos acceder a él una y otra vez sin necesidad de que el usuario nos lo vuelva a proporcionar.
  2. Cuando queremos acceder de forma sencilla y consistente a un valor. Por ejemplo, imagina que estás escribiendo una aplicación de recomendaciones de actividades de ocio.
    Las coordenadas del Museo del Prado son 40.41470484141058, -3.691976898205975, pero lo más probable es que si quieres geolocalizarlo en tu aplicación no quieras escribir esa parrafada de dígitos cada vez que necesites indicar su ubicación: es molesto y puedes equivocarte. ¿Cómo lo resuelves?
    Básicamente guardándolas en una variable. Por ejemplo:
    coordenadas_museo_prado = “40.41470484141058, -3.691976898205975”
    A partir de este momento no necesitas recordar estas coordenadas, y basta con que utilices el nombre de tu variable. Por ejemplo, puedes imprimirlas en pantalla así:
    print(coordenadas_museo_prado)

Asignación y reasignación de variables

Una de las características de las variables es que, como su nombre indica, el valor almacenado en ellas puede variar. Veamos un ejemplo en nuestro código:

name = input("What's your name?\n")
print("Previous name: " + name)

name = "Raspas"
print("New name: " + name)

En este caso, el programa hará lo siguiente:

  1. Paraliza la ejecución hasta que el usuario introduzca su nombre (supongamos “Zari”).
  2. El nombre introducido pasa a ser el valor de input (ahora input() equivale a “Zari”).
  3. Asigna el valor de input a la variable name (ahora name equivale a “Zari”).
  4. Imprime “Previous name: “ + name (“Previous name: Zari”).
  5. Asigna el valor “Raspas” a name.
  6. Imprime “New name: “ + name (“New name: Raspas”).

Como ves, hemos reasignado la variable. Al ejecutar el primer print(), name equivalía al nombre introducido por el usuario. Pero al ejecutar el segundo print(), name equivalía a “Raspas” porque le hemos asignado un valor manualmente.

Esto implica que:

  1. Puedes cambiar el valor de una variable durante la ejecución de tu programa.
  2. Por tanto, ten cuidado de no reasignarlo accidentalmente, o tu código arrojará resultados inesperados.
  3. Y recuerda que el orden de ejecución importa.

Cómo elegir el nombre de nuestras variables

A la hora de elegir un nombre para nuestras variables, podemos utilizar cualquier palabra siempre que:

  1. No empiece por un número, aunque sí podemos utilizar números en otras posiciones de la palabra:
    1. ❌ MAL: 1user
    2. ✔️BIEN: user1
  2. No utilice palabras reservadas o keywords
    1. ❌ MAL: continue
    2. ✔️BIEN: continue_execution

Pese a ello, no cualquier nombre de variable es óptimo. Debemos asegurarnos de que nuestro código sea legible, por lo que deberíamos utilizar nombres de variables descriptivos. Aunque publicaré algunos recursos sobre buenas prácticas para mantener un código limpio, te paso aquí un par de ejemplos:

✔️BIEN: name = input("What's your name?\n")

Se trata de un nombre descriptivo. Tal vez podríamos hacerla incluso más evidente llamándola user_name. Fíjate que en python escribimos el nombre de nuestras variables en minúsculas y utilizamos una barra baja si necesitamos separar palabras.

❌ MAL: n = input("What's your name?\n")

No es para nada descriptiva. Si nuestro código incluye 10 o 20 de estas variables tendremos problemas para saber a qué hace referencia cada una.

Te dejo un texto sobre nombres de variables que, aunque hace referencia a JavaScript, es aplicable a todos los lenguajes de programación. ¡Cuidado! Es absolutamente irónico. Pero entenderás por qué conviene utilizar nombres de variables legibles y consistentes.

Recapitulando: conceptos iniciales de Python

En esta introducción hemos visto algunos conceptos importantes para iniciarnos en Python:

  1. Cómo utilizar la consola para recibir y enviar información:
    1. print()
    2. input()
  2. Qué son las strings y cómo concatenarlas. Recuerda:
    1. Se declaran con comillas simples o dobles.
    2. Debes cerrarlas adecuadamente para que el intérprete sepa que ha terminado la cadena y debe seguir ejecutando el código.
  3. Nociones básicas sobre las funciones, su orden de ejecución y la posibilidad de concatenarlas anidándolas unas dentro de otras. Recuerda:
    1. Una función puede utilizar información “del exterior” si se la proporcionamos como parámetro (entre paréntesis).
    2. El orden básico de ejecución de una secuencia de funciones es LIFO: primero se ejecutan las últimas en invocarse.
  4. Nociones básicas sobre las variables, su reasignación y su nomenclatura. Recuerda:
    1. Debes utilizar nombres legibles y consistentes en tus variables.
    2. Puedes reasignar una variable, así que el orden de ejecución es importante.
  5. Un par de funciones adicionales de python:
    1. len()
    2. str()
  6. También has aprendido:
    1. Cómo escribir comentarios en Python: #
    2. Cómo introducir saltos de línea en strings: \n

Aplicaciones

Además, hemos escrito dos aplicaciones: el clásico “Hello, World” y una aplicación que saluda al usuario basándose en su input. Es más, incluso hemos hecho una iteración sobre la última que nos permite contar el número de letras en el nombre de un usuario.

Aunque estas aplicaciones parezcan inútiles, iremos iterando sobre ellas para construir programas mucho más llamativos.

Dejo de nuevo el código aquí, por si quieres consultarlas de nuevo:

¿Y ahora qué?

Ahora puedes descansar o saltar a la lección del día 2 (tipos de datos en Python). Mi recomendación es que no te des un atracón. Descansa, reposa toda esta información e interiorízala y vuelve mañana. Haz un rápido repaso y salta a la segunda lección.

Como ves, hemos tocado muchos aspectos involucrados en la programación. Y la mejor forma de asimilarlos todos es hacerlo poco a poco.