Guía de iniciación a Python - TL;DR
El espíritu de esta guía de iniciación a Python
Para sentirse cómodo utilizando esta guía de iniciación, es necesario que ya esté relativamente familiarizado con algunas nociones de programación en algún lenguaje. En caso contrario, deberá tener Wikipedia a mano para consultar el significado de algún término o concepto que no hayamos explicado. También puede encontrar la documentación de Python en este enlace: https://www.python.org/
Este capítulo no es un curso exhaustivo sobre Python, ni un manual o recetario de trucos y consejos sobre Python. Por el contrario, se trata de un recorrido lineal para leer y practicar secuencialmente, que lo familiarizará con este lenguaje, al tiempo que construye paso a paso las referencias cognitivas o prácticas útiles para que aprenda a codificar en Python de forma eficaz, sencilla, limpia, legible y escalable.
Inicialmente, le aconsejamos que no varíe las fuentes de información y que utilice esta guía de iniciación de la forma más completa posible. Así evitará perderse y limitará el desánimo que puede producirle echarle un vistazo a la abrumadora cantidad de información disponible sobre Python.
Python es un lenguaje muy rico y permite realizar una operación de diferentes maneras. Hemos seleccionado cuidadosamente aquellas sintaxis...
Nomenclatura y convenciones
A la hora de nombrar los objetos, las variables y las funciones que va a crear, o de presentar el código, no hemos seguido las «buenas prácticas» de la profesión, con la esperanza de facilitar la lectura a un programador novato. Hemos utilizado un «espanglish» poco académico que no le aconsejamos que utilice en su práctica profesional. En cualquier caso, tendrá que ajustarse a las prácticas de nomenclatura de su organización, a menudo de acuerdo con la PEP8_style_guide (https://peps.python.org/pep-0008/), que le instamos a leer con detenimiento después de asimilar esta guía de iniciación a Python. Finalmente, le sugerimos que utilice herramientas como flake8 y pylint para ayudarle a identificar posibles anomalías en su código (https://flake8.pycqa.org/en/latest/ y https://docs.pylint.org/).
Dicho esto, y en la medida en que no parece afectar a la sencillez de nuestra exposición, hemos intentado seguir unas cuantas reglas básicas (cuyo significado quizá le quede claro conforme avance en este documento):
-
Las variables u objetos con escaso significado funcional, como los índices de un bucle o los parámetros de funciones técnicas o matemáticas, se formulan de la forma más breve posible, como: a, b, c, d, e, f, i, j, k, l, m, n, i_, i1, i_max, A, B, X, etc. La única restricción...
El zen de Python
He aquí una transcripción personal y muy modificada de algunos de los consejos de The Zen of Python, de Tim Peters. Estos consejos no son anecdóticos, sino que reflejan la forma en que debería enfocar la programación (tanto en Python como en otros lenguajes). Su significado se irá aclarando a medida que practique, así que léalos a menudo:
-
Lo bello es mejor que lo feo.
-
Lo explícito es mejor que lo implícito.
-
Lo simple es mejor que lo complejo.
-
Lo complejo es mejor que lo complicado.
-
Un estilo de programación muy lineal es mejor que un estilo anidado.
Traducción técnica: evite bucles innecesarios y cascadas de "if then else" inútiles. Utilice técnicas de programación funcional: funciones simples, generadores/iteradores o mapas, funciones lambda. Utilice objetos y métodos compactos, evitando clases y funciones demasiado prolijas.
-
El lenguaje claro es preferible al lenguaje denso.
-
La legibilidad es muy importante (traducción técnica: sangrías agradables de 2 o 4 caracteres, líneas de menos de 80 caracteres, elección de los nombres de los objetos, comentarios concisos y útiles, doc_string actualizado, etc.).
-
Los casos particulares no son tan particulares como para saltarse las normas, aunque la practicidad debe primar sobre la pureza.
-
Los errores durante la ejecución del código nunca deben silenciarse (if imprevisto: log...
Contexto de trabajo
Python está disponible en las versiones 2.x (normalmente, 2.7) y 3.x (actualmente > 3.11). Las versiones 2.x de Python se siguen utilizando en contextos en los que no se ha realizado la migración por diversas razones económicas o prácticas, pero hoy en día lo habitual es desarrollar en una versión superior o igual a la 3.8. Para evitar frustraciones, hemos utilizado este nivel de versión en nuestros ejemplos.
Tenga en cuenta que puede disponer de varias versiones en la misma máquina, gracias a diferentes mecanismos, como los entornos Python (venv) o conda. En este caso, necesitará invocar el entorno correcto antes de empezar a codificar.
En esta guía de iniciación, asumimos que Python está instalado y que es una versión superior o igual a 3.5, en el que está autorizado a instalar nuevos paquetes (librerías, packages), típicamente a través de la siguiente instrucción de línea de comandos : pip install nuevo_paquete.
Para probar Python en línea sin instalarlo en su máquina, puede utilizar:
-
Google Colab: https://colab.research.google.com/
-
onlineGDB : https://www.onlinegdb.com/online_python_interpreter
-
tutorials point: https://www.tutorialspoint.com/online_python_compiler.php
Para instalar un paquete de Python (= package, library), existen varias formas de proceder...
Primeros pasos
Aquí vamos a abordar los elementos más centrales, y a veces frustrantes, de la transcripción de un algoritmo sencillo a Python utilizando un Python muy básico.
1. Python, como una calculadora
Puede utilizar Python como una calculadora trivial (* representa la multiplicación, ** representa la potencia).
a = 1
b = 3
c = 2*a + b**2
print(c)
--| ...
Manipulaciones habituales de datos
1. Utilizar la función print y descubrir las strings
Las cadenas de caracteres pueden crearse con comillas simples: ’blabla’, o con comillas dobles: "blabla".
Pueden utilizarse en la función print. Si el propio mensaje contiene comillas o comillas dobles, debe ir precedido del carácter \ (se conoce como carácter de escape).
Las cadenas de caracteres son inmutables y su tipo se llama string.
print("Una cadena de caracteres con una \" y una \'. ")
--| Una cadena de caracteres con una " y una '.
Para crear cadenas con varias líneas, debe delimitarlas entre tres comillas simples o dobles.
print(
'''
Este es un texto
con varias líneas
'''
)
--|
--| Este es un texto
--| con varias líneas
--|
También puede utilizar el mismo procedimiento que en otros lenguajes para generar saltos de línea, utilizando la secuencia de escape \n.
print("una primera línea\ncon una segunda línea y un salto
final\n")
--| una primera línea
--| con una segunda línea y un salto final
Las cadenas de caracteres son objetos que pueden manipularse utilizando varios métodos, es decir, funciones específicas de una clase de objetos. Uno de ellos es el método format, que busca secuencias como {0} en una cadena y las sustituye por otra utilizando el número de secuencia entre llaves. Para invocar un método en un objeto, utilice el punto «.».
print(
"inserción_1: {0}, inserción_2: {1}, bis primero: {0}"
.format("una cadena",666)
)
--| inserción_1: una cadena, inserción_2: 666, bis primero:
una cadena
Puede dejar vacío el contenido de las llaves, en cuyo caso el orden es implícito.
print(
"inserción_1: {}, inserción_2: {}, bis primero: {}"
.format("una cadena", 666, "una cadena")
)
--| inserción_1: una cadena...
Diccionarios de Python
1. Introducción a los diccionarios
Esta estructura es muy popular entre los desarrolladores de Python, quizás demasiado. Antes de usarla, compruebe siempre si no serían más sencillos, potentes o adecuados una lista, un array/tensor de Numpy (o Tensorflow o Pytorch) o un dataframe de Pandas (un dataframe es una estructura tabular, como un archivo csv o una tabla relacional, pero en la que cada columna puede usarse como clave de acceso sin generar problemas de rendimiento específicos).
En términos generales, un diccionario es una lista de pares clave-valor, y las claves pueden considerarse índices. A diferencia de las listas, las matrices y las tuplas, el orden en que se organiza la información en el diccionario no importa, ya que se accede a cada valor a través de su clave.
Los diccionarios están para simplificarle la vida. Cuando tenga que recurrir a técnicas complicadas o difíciles de leer para utilizar sus diccionarios, probablemente se deba a que esta herramienta no es la más adecuada. Siempre puede transcribir sus datos a otra estructura más apropiada para ganar en fiabilidad.
Las listas y el subsetting se caracterizan sintácticamente por el uso de corchetes [], mientras que los diccionarios se caracterizan por el uso de llaves {}.
Es muy fácil crear un pequeño diccionario. En cuanto a las claves, lo más habitual es encontrar cadenas de caracteres o números enteros, mientras que en los valores, al igual que sucede con las listas, puede almacenarse cualquier tipo de objeto.
He aquí un ejemplo de diccionario y de utilización del método get para tratar el caso en que la clave no existe. Observe que, en cualquier consulta, siempre hay que contemplar el caso de que esta resulte infructuosa, ¡aunque considere que eso es funcionalmente imposible!
siglas ={
"CCNE": "Comité Consultivo Nacional de Ética",
"AMGE": "Agencia de Medioambiente y Gestión de la Energía",
"YAML": "Yet another markup language",
"CEE" : "Comunidad Económica Europea"
}
def encuentra_sigla(s): return siglas.get(s, "sigla desconocida")
print(encuentra_sigla("CCNE"))...
Zoom sobre los generadores
Para crear su propio iterador, resulta práctico utilizar un generador (de iteradores). Se trata de una función específica que, en lugar de devolver un valor mediante return, devuelve el siguiente valor que se utilizará al recorrer una estructura iterable. La instrucción utilizada para especificar este valor es yield, que funciona como return.
Incluya el siguiente generador en su caja de herramientas. Como ejercicio, intente modificarlo y analice las consecuencias de sus cambios.
def gen_i(start,end):
''' gen_i genera un iterador incremental de start a end incluido '''
for i in range(start - 1,end):
i = i + 1
yield i
Vamos a utilizarlo en un bucle for, ¡que es el destino más común de un iterador!
for j in gen_i(-2,3): print(j) # un bucle en j que varía de -2 a 3
--| -2
--| -1
--| 0
--| 1
--| 2
--| 3
El uso de un generador de este tipo es tan agradable como eficaz.
def gen_i_par(start, end):
''' generador de números pares '''
for i in range(start - 1, end):
i = i + 1
if...
Crear sus propios objetos
1. Creación de clases y objetos
Para crear un objeto (una instancia de una clase), se necesita una clase para poder declarar que ese objeto hereda de esa clase. Aquí creamos una clase ciudadano utilizando la instrucción individuo = Ciudadano( ). Implementamos la definición: «este individuo is_a ciudadano».
La clase se describe a través de sus métodos. El primer método que se construye es el constructor de la clase, que en Python se denomina init. Este método se invoca cuando se crea una instancia de la clase.
El primer parámetro de su clase se llama self y se utiliza para prefijar las variables internas de la futura instancia haciendo referencia al propio objeto.
El primer trabajo del constructor es rellenar las variables internas self.xxx = yyy. En casos sencillos como este, simplemente asignamos a las variables internas los valores introducidos en los parámetros del constructor, así: self.nombre = nombre. Si es necesario, podemos realizar inicializaciones mucho más complejas y llevar a cabo diversas comprobaciones de coherencia.
Después de expresar el constructor, añadimos todos los métodos que definen el comportamiento de la clase.
class Ciudadano:
'''Clase que describe los atributos mínimos de un ciudadano español'''
def__init__(self, apellido, nombre, num_ss):
self.apellido = apellido
self.nombre = nombre
self.num_ss = num_ss
def género(self): # en el num_ss el género está
# en la primera posición
''' devuelve el género de nacimiento de un ciudadano '''
return "femenino" if self.num_ss[0] == "2" else "masculino"
Ahora podemos instanciar un objeto de la clase Ciudadano.
individuo_1 = Ciudadano("Martín","Pedro","1891195555494")
Las variables y métodos de la clase ciudadano son ahora accesibles para el individuo1. Las variables accesibles a cualquier método...