Warning

This course is fully in spanish :d

Características y ventajas de Python

Python es un lenguaje de programación de alto nivel, interpretado y de propósito general que se ha popularizado por su sintaxis legible y clara. Es un lenguaje versátil que permite a los programadores trabajar rápidamente e integrar sistemas de manera más efectiva.

Características Principales:

  • Sintaxis simple y fácil de aprender: Python es famoso por su legibilidad, lo que facilita el aprendizaje para los principiantes y permite a los desarrolladores expresar conceptos complejos en menos líneas de código que serían necesarias en otros lenguajes.
  • Interpretado: Python es procesado en tiempo de ejecución por el intérprete. Puedes ejecutar el programa tan pronto como termines de escribir los comandos, sin necesidad de compilar.
  • Tipado dinámico: Python sigue las variables en tiempo de ejecución, lo que significa que puedes cambiar el tipo de datos de una variable en tus programas.
  • Multiplataforma: Python se puede ejecutar en una variedad de sistemas operativos como Windows, Linux y MacOS.
  • Bibliotecas extensas: Python cuenta con una gran biblioteca estándar que está disponible sin cargo alguno para todos los usuarios.
  • Soporte para múltiples paradigmas de programación: Python soporta varios estilos de programación, incluyendo programación orientada a objetos, imperativa y funcional.

Ventajas de Usar Python:

  • Productividad mejorada: La simplicidad de Python aumenta la productividad de los desarrolladores ya que les permite enfocarse en resolver el problema en lugar de la complejidad del lenguaje.
  • Amplia comunidad: Una comunidad grande y activa significa que es fácil encontrar ayuda, colaboración y contribuciones de terceros.
  • Aplicabilidad en múltiples dominios: Python se utiliza en una variedad de aplicaciones, desde desarrollo web hasta inteligencia artificial, ciencia de datos y automatización.
  • Compatibilidad y colaboración: Python se integra fácilmente con otros lenguajes y herramientas, y es una excelente opción para equipos de desarrollo colaborativos.

Con estas características y ventajas, Python se ha establecido como un lenguaje clave en el desarrollo de software moderno. Su facilidad de uso y su amplia aplicabilidad lo hacen una elección excelente tanto para programadores principiantes como para expertos.

Diferencias entre Python2, Python3, pip2 y pip3

Python 2 y Python 3 son dos versiones del lenguaje de programación Python, cada una con sus propias características y diferencias clave. PIP2 y PIP3 son las herramientas de gestión de paquetes correspondientes a cada versión, utilizadas para instalar y administrar bibliotecas y dependencias.

Python 2 vs Python 3:

  • Sintaxis de print: En Python 2, ‘print’ es una declaración, mientras que en Python 3, ‘print()’ es una función, lo que requiere el uso de paréntesis.
  • División de enteros: Python 2 realiza una división entera por defecto, mientras que Python 3 realiza una división real (flotante) por defecto.
  • Unicode: Python 3 usa Unicode (texto) como tipo de dato por defecto para representar cadenas, mientras que Python 2 utiliza ASCII.
  • Librerías: Muchas librerías populares de Python 2 han sido actualizadas o reescritas para Python 3, con mejoras y nuevas funcionalidades.
  • Soporte: Python 2 llegó al final de su vida útil en 2020, lo que significa que ya no recibe actualizaciones, ni siquiera para correcciones de seguridad.

PIP2 vs PIP3:

  • Gestión de paquetes: PIP2 y PIP3 son herramientas que permiten instalar paquetes para Python 2 y Python 3, respectivamente. Es importante usar la versión correcta para garantizar la compatibilidad con la versión de Python que estés utilizando.
  • Comandos de instalación: El uso de pip o pip3 antes de un comando determina si el paquete se instalará en Python 2 o Python 3. Algunos sistemas operativos pueden requerir especificar pip2 o pip3 explícitamente para evitar ambigüedades.
  • Ambientes virtuales: Es una buena práctica usar ambientes virtuales para mantener separadas las dependencias de proyectos específicos y evitar conflictos entre versiones de paquetes para Python 2 y Python 3.

La transición de Python 2 a Python 3 ha sido significativa en la comunidad de desarrolladores de Python, y es fundamental que los programadores comprendan las diferencias y sepan cómo trabajar con ambas versiones del lenguaje y sus herramientas asociadas.

El intérprete de Python

El intérprete de Python es el corazón del lenguaje de programación Python; es el motor que ejecuta el código que escriben los programadores. Cuando hablamos del “intérprete de Python“, nos referimos al programa que lee y ejecuta el código Python en tiempo real.

Funciones Clave del Intérprete de Python:

  • Ejecución de Código: El intérprete ejecuta el código escrito en Python línea por línea, lo que facilita la depuración y permite a los desarrolladores probar fragmentos de código de forma interactiva.
  • Modo Interactivo: El intérprete puede usarse en un modo interactivo que permite a los usuarios ejecutar comandos de Python uno a uno y ver los resultados de inmediato, lo cual es excelente para el aprendizaje y la experimentación.
  • Modo de Script: Además del modo interactivo, el intérprete puede ejecutar programas completos o scripts que se escriben en archivos con la extensión ‘.py‘.
  • Compilación a Bytecode: Aunque Python es un lenguaje interpretado, internamente, el intérprete compila el código a bytecode antes de ejecutarlo, lo que mejora el rendimiento.
  • Máquina Virtual de Python: El bytecode compilado se ejecuta en la Máquina Virtual de Python (Python Virtual Machine – PVM), que es una abstracción que hace que el código de Python sea portable y se pueda ejecutar en cualquier sistema operativo donde el intérprete esté disponible.

Ventajas del Intérprete de Python:

  • Facilidad de Uso: La capacidad de ejecutar código inmediatamente y de manera interactiva hace de Python una herramienta excelente para principiantes y para el desarrollo rápido de aplicaciones.
  • Portabilidad: El intérprete de Python está disponible en múltiples plataformas, lo que significa que los programas de Python pueden ejecutarse en casi cualquier sistema sin modificaciones.
  • Extensibilidad: El intérprete de Python permite la extensión con módulos escritos en otros lenguajes como C o C++, lo que puede ser utilizado para optimizar el rendimiento.

El intérprete de Python es una herramienta poderosa y flexible que hace que el lenguaje sea accesible y eficiente para una amplia variedad de aplicaciones de programación. Comprender cómo funciona el intérprete es fundamental para cualquier programador que desee dominar Python.

Shebang y convenios en Python

En el desarrollo con Python, el shebang y los convenios de codificación son aspectos importantes que facilitan la escritura de scripts claros y portables.

Shebang en Python:

El shebang es una línea que se incluye al principio de un script ejecutable para indicar al sistema operativo con qué intérprete debe ejecutarse el archivo. En los scripts de Python, el shebang común es:

  • #!/usr/bin/env python3

Esta línea le dice al sistema que utilice el entorno (env) para encontrar el intérprete de Python 3 y ejecutar el script con él. Es fundamental para asegurar que el script se ejecute con Python 3 en sistemas donde Python 2 todavía está presente.

Convenios en Python:

Los convenios de codificación son un conjunto de recomendaciones que guían a los desarrolladores de Python para escribir código claro y consistente. El más conocido es ‘PEP 8‘, que abarca:

  • Nombres de Variables: Utilizar ‘lower_case_with_underscores‘ para nombres de variables y funciones, ‘UPPER_CASE_WITH_UNDERSCORES‘ para constantes, y ‘CamelCase‘ para clases.
  • Longitud de Línea: Limitar las líneas a 79 caracteres para código y 72 para comentarios y docstrings.
  • Indentación: Usar 4 espacios por nivel de indentación.
  • Espacios en Blanco: Seguir las prácticas recomendadas sobre el uso de espacios en blanco, como no incluir espacios adicionales en listas, funciones y argumentos de funciones.
  • Importaciones: Las importaciones deben estar en líneas separadas y agrupadas en el siguiente orden: módulos de la biblioteca estándar, módulos de terceros y luego módulos locales.
  • Compatibilidad entre Python 2 y 3: Aunque Python 2 ha llegado al final de su vida útil, algunos convenios pueden seguirse para mantener la compatibilidad.

El cumplimiento de estos convenios no solo mejora la legibilidad del código, sino que también facilita la colaboración entre desarrolladores y el mantenimiento a largo plazo del software.

El uso adecuado del shebang y la adhesión a los convenios de Python son señales de un desarrollador cuidadoso y profesional. Integrar estos aspectos en tus prácticas de codificación es crucial para el desarrollo de software efectivo y eficiente en Python.

Tip

Comprueba dónde está instalado tu python con which python3

Note

¿Para qué sirve if __name__ == '__main__'? Sirve para comprobar que el módulo que se está ejecutando es el principal, es decir, que no se está llamando desde otro script (que no esté siendo importado en otro script)

Convenios

  • lowerCamelCase
  • UpperCamelCase
  • SCREAMING_SNAKE_CASE
  • PEP 8
  • snake_case

Tip

No es recomendable usar l (l minúscula) O (o mayúscula) I (i mayúscula), pues pueden dar lugar a confusión dependiendo de la letra

Variables y tipos de datos

Las variables en Python son como nombres que se le asignan a los datos que manejamos. Piensa en una variable como un nombre que pones a un valor, para poder referirte a él y utilizarlo en diferentes partes de tu código.

En la clase actual, vamos a enfocarnos en comprender las variables y algunos de los tipos de datos fundamentales en Python. Estos conceptos son esenciales, ya que nos permiten almacenar y manipular la información en nuestros programas.

Variables

Una variable en Python es como un nombre que se le asigna a un dato. No es necesario declarar el tipo de dato, ya que Python es inteligente para inferirlo.

Cadenas (Strings)

Las cadenas son secuencias de caracteres que se utilizan para manejar texto. Son inmutables, lo que significa que una vez creadas, no puedes cambiar sus caracteres individuales.

Números

Python maneja varios tipos numéricos, pero nos centraremos principalmente en:

  • Enteros (Integers): Números sin parte decimal.
  • Flotantes (Floats): Números que incluyen decimales.

Listas

Las listas son colecciones ordenadas y mutables que pueden contener elementos de diferentes tipos. Son ideales para almacenar y acceder a secuencias de datos.

Y para trabajar con estas listas, así como con cadenas y rangos de números, utilizaremos los bucles ‘for‘, que nos permiten iterar sobre cada elemento de una secuencia de manera eficiente.

Estas son solo algunas de las estructuras de datos con las que trabajaremos por el momento. A medida que avancemos en las próximas clases, exploraremos más tipos de datos y estructuras más complejas, ampliando nuestras herramientas para resolver problemas y construir programas más sofisticados.

Operadores básicos en Python

Los operadores aritméticos son símbolos que Python utiliza para realizar cálculos matemáticos.

Los fundamentales son:

  • Suma (+): No solo suma números, sino que también une secuencias como cadenas y listas, creando una nueva secuencia que es la combinación de ambas.
  • Resta (-): Se utiliza para restar un número de otro. Con listas, su uso es menos directo y generalmente no se aplica como operador directo.
  • Multiplicación (*): Cuando se multiplica un número por otro, obtenemos el producto. Con cadenas y listas, este operador repite los elementos la cantidad de veces especificada.
  • División (/): Divide un número entre otro y el resultado es siempre un número flotante, incluso si los números son enteros.
  • Exponente ():** Eleva un número a la potencia de otro. Por ejemplo, ‘2 ** 3‘ resultará en 8. Este operador es menos común en operaciones con cadenas o listas.

Operaciones con Cadenas

En Python, las cadenas son objetos que representan secuencias de caracteres y se pueden manipular usando operadores aritméticos:

  • Concatenación (+): Une varias cadenas en una sola. Por ejemplo, ‘Hola’ + ‘ ‘ + ‘Mundo’ se convierte en ‘Hola Mundo’.
  • Repetición (*): Crea repeticiones de la misma cadena. ‘Hola’ * 3 generará ‘HolaHolaHola’.

Operaciones con Listas

Las listas son colecciones ordenadas y mutables de elementos:

  • Concatenación (+): Similar a las cadenas, unir dos listas las combina en una nueva lista.
  • Repetición (*): Repite todos los elementos de la lista un número determinado de veces.

Funciones Especiales para Listas

  • Zip: Toma dos o más listas y las empareja, creando una lista de tuplas. Cada tupla contiene elementos de las listas originales que ocupan la misma posición.
  • Map: Aplica una función específica a cada elemento de un iterable, lo que resulta útil para transformar los datos contenidos.

Asimismo, otro de los conceptos que mencionamos es el de ‘TypeCast‘. El TypeCast, o conversión de tipo, es el proceso mediante el cual se cambia una variable de un tipo de dato a otro.

En Python, esto se realiza de manera muy directa, utilizando el nombre del tipo de dato como una función para realizar la conversión. Por ejemplo, convertir una cadena a un entero se hace pasando la cadena como argumento a la función int(), y transformar un número a una cadena se hace con la función str(). Esta capacidad de cambiar el tipo de dato es especialmente útil cuando se necesita estandarizar los tipos de datos para operaciones específicas o para cumplir con los requisitos de las estructuras de datos.

A medida que progresemos, ampliaremos nuestro repertorio para incluir operaciones más complejas y explorar otros tipos de datos y estructuras en Python.

String Formatting

Python proporciona varias maneras de formatear cadenas, permitiendo insertar variables en ellas, así como controlar el espaciado, alineación y precisión de los datos mostrados. Aquí están las técnicas de formateo de cadenas que exploraremos:

Operador % (Porcentaje)

También conocido como “interpolación de cadenas“, este método clásico utiliza marcadores de posición como ‘%s‘ para cadenas, ‘%d‘ para enteros, o ‘%f‘ para números de punto flotante.

Método format()

Introducido en Python 2.6, permite una mayor flexibilidad y claridad. Utiliza llaves ‘{}‘ como marcadores de posición dentro de la cadena y puede incluir detalles sobre el formato de la salida.

name = "gitblanc"
age = 666
print("Hola, soy {}!".format(name))
# [output] Hola, soy gitblanc!
 
print("Hola, soy {0}! y tengo {1} años. En verdad me llamo {0}".format(name, age)) # usando índices
# [output] Hola, soy gitblanc! y tengo 666 años. En verdad me llamo gitblanc

F-Strings (Literal String Interpolation)

Disponible desde Python 3.6, los F-Strings ofrecen una forma concisa y legible de incrustar expresiones dentro de literales de cadena usando la letra ‘f‘ antes de las comillas de apertura y llaves para indicar dónde se insertarán las variables o expresiones.

En esta clase, nos enfocaremos en cómo utilizar cada uno de estos métodos para formatear cadenas efectivamente, así como las situaciones en las que cada uno podría ser más apropiado. Al final, tendrás las herramientas para presentar información de manera profesional en tus programas de Python.

Control de flujo (Condicionales y Bucles)

Los conceptos vistos en esta clase son esenciales para entender cómo crear programas en Python que puedan tomar decisiones y repetir acciones hasta cumplir ciertos criterios. Aquí es donde nuestros programas obtienen la capacidad de responder a diferentes situaciones y datos.

Condicionales

Los condicionales son estructuras de control que permiten ejecutar diferentes bloques de código dependiendo de si una o más condiciones son verdaderas o falsas. En Python, las declaraciones condicionales más comunes son ‘if‘, ‘elif‘ y ‘else‘.

  • if: Evalúa si una condición es verdadera y, de ser así, ejecuta un bloque de código.
  • elif: Abreviatura de “else if“, se utiliza para verificar múltiples expresiones sólo si las anteriores no son verdaderas.
  • else: Captura cualquier caso que no haya sido capturado por las declaraciones ‘if‘ y ‘elif‘ anteriores.

Bucles

Los bucles permiten ejecutar un bloque de código repetidamente mientras una condición sea verdadera o para cada elemento en una secuencia. Los dos tipos principales de bucles que utilizamos en Python son ‘for‘ y ‘while‘.

  • for: Se usa para iterar sobre una secuencia (como una lista, un diccionario, una tupla o un conjunto) y ejecutar un bloque de código para cada elemento de la secuencia.
  • while: Ejecuta un bloque de código repetidamente mientras una condición específica se mantiene verdadera.

Control de Flujo en Bucles

Existen declaraciones de control de flujo que pueden modificar el comportamiento de los bucles, como ‘break‘, ‘continue‘ y ‘pass‘.

  • break: Termina el bucle y pasa el control a la siguiente declaración fuera del bucle.
  • continue: Omite el resto del código dentro del bucle y continúa con la siguiente iteración.
  • pass: No hace nada, se utiliza como una declaración de relleno donde el código eventualmente irá, pero no ha sido escrito todavía.

En esta clase, profundizaremos en cada uno de estos aspectos con ejemplos detallados. Aprenderemos cómo tomar decisiones dentro de nuestros programas y cómo automatizar tareas repetitivas. Esto nos dará la base para escribir programas que pueden manejar tareas complejas y responder dinámicamente a los datos de entrada. Al final de la clase, estarás equipado con el conocimiento para controlar el flujo de tus programas de Python de manera eficiente y efectiva.

Funciones y ámbito de las variables

En esta clase nos sumergimos en dos conceptos fundamentales de la programación en Python que potencian la modularidad y la gestión eficaz de los datos dentro de nuestros programas.

Funciones

Las funciones son bloques de código reutilizables diseñados para realizar una tarea específica. En Python, se definen usando la palabra clave ‘def‘ seguida de un nombre descriptivo, paréntesis que pueden contener parámetros y dos puntos. Los parámetros son “variables de entrada” que pueden cambiar cada vez que se llama a la función. Esto permite a las funciones operar con diferentes datos y producir resultados correspondientes.

Las funciones pueden devolver valores al programa principal o a otras funciones mediante la palabra clave ‘return‘. Esto las hace increíblemente versátiles, ya que pueden procesar datos y luego pasar esos datos modificados a otras partes del programa.

Ámbito de las Variables (Scope)

El ámbito de una variable se refiere a la región de un programa donde esa variable es accesible. En Python, hay dos tipos principales de ámbitos:

  • Local: Las variables definidas dentro de una función tienen un ámbito local, lo que significa que solo pueden ser accesadas y modificadas dentro de la función donde fueron creadas.
  • Global: Las variables definidas fuera de todas las funciones tienen un ámbito global, lo que significa que pueden ser accesadas desde cualquier parte del programa. Sin embargo, para modificar una variable global dentro de una función, se debe declarar como global.

Durante esta clase, exploraremos cómo definir y llamar funciones, cómo pasar información a las funciones a través de argumentos, y cómo las variables interactúan con diferentes ámbitos. También veremos las mejores prácticas para definir funciones claras y concisas y cómo el correcto manejo del ámbito de las variables puede evitar errores y complicaciones en el código.

Comprender estos conceptos es esencial para escribir programas claros, eficientes y mantenibles en Python. Al finalizar la clase, tendrás una sólida comprensión de cómo estructurar tu código y cómo gestionar las variables para que tus programas funcionen de manera impecable.

def funcion():
	print("Hola mundo!")
 
funcion()
  • Cuando se llama a una variable global dentro de una función, no se cambia su valor global, sino que se crea otra igual de ámbito local
variable = "Soy global"
 
def mi_funcion():
	# Si se quiere modificar, previamente poner: 
	# global variable
	variable = "Soy local" 
	print(variable)
 
mi_funcion() # [output] Soy local
 
print(variable) # [output] Soy global

Funciones lambda anónimas

Esta clase se centra en una característica poderosa y expresiva de Python que permite la creación de funciones en una sola línea: las funciones lambda.

Funciones Lambda

Las funciones lambda son también conocidas como funciones anónimas debido a que no se les asigna un nombre explícito al definirlas. Se utilizan para crear pequeñas funciones en el lugar donde se necesitan, generalmente para una operación específica y breve. En Python, una función lambda se define con la palabra clave ‘lambda‘, seguida de una lista de argumentos, dos puntos y la expresión que desea evaluar y devolver.

Una de las ventajas de las funciones lambda es su simplicidad sintáctica, lo que las hace ideal para su uso en operaciones que requieren una función por un breve momento y para casos donde la definición de una función tradicional completa sería excesivamente verbosa.

Usos comunes de las Funciones Lambda

  • Con funciones de orden superior: Como aquellas que requieren otra función como argumento, por ejemplo, ‘map()‘, ‘filter()‘ y ‘sorted()‘.
  • Operaciones simples: Para realizar cálculos o acciones rápidas donde una función completa sería innecesariamente larga.
  • Funcionalidad en línea: Cuando se necesita una funcionalidad simple sin la necesidad de reutilizarla en otro lugar del código.

En esta clase, aprenderemos cómo y cuándo utilizar las funciones lambda de manera efectiva, además de entender cómo pueden ayudarnos a escribir código más limpio y eficiente. Aunque su utilidad es amplia, también discutiremos las limitaciones de las funciones lambda y cómo el abuso de estas puede llevar a un código menos legible.

Al dominar las funciones lambda, ampliarás tu conjunto de herramientas de programación en Python, permitiéndote escribir código más conciso y funcional.

mi_funcion = lambda: "Hola mundo!"
print(mi_funcion())
cuadrado = lambda x: x**2
print(cuadrado(4))
suma = lambda x, y: x + y
print(suma(4, 7))
numeros = [1,2,3,4,5]
cuadrados = list(map(lambda x: x**2, numeros))
print(cuadrados)

Manejo de errores y excepciones

En esta clase, abordaremos el manejo de errores y excepciones, un aspecto crítico para la creación de programas robustos y confiables en Python. Los errores son inevitables en la programación, pero manejarlos correctamente es lo que diferencia a un buen programa de uno que falla constantemente.

Manejo de Errores

Los errores pueden ocurrir por muchas razones: errores de código, datos de entrada incorrectos, problemas de conectividad, entre otros. En lugar de permitir que un programa falle con un error, Python nos proporciona herramientas para ‘atrapar’ estos errores y manejarlos de manera controlada, evitando así que el programa se detenga inesperadamente y permitiendo reaccionar de manera adecuada.

Excepciones

Una excepción en Python es un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal de las instrucciones del programa. Cuando el intérprete se encuentra con una situación que no puede manejar, ‘levanta’ o ‘arroja’ una excepción.

Bloques try y except

Para manejar las excepciones, utilizamos los bloques ‘try‘ y ‘except‘. Un bloque ‘try‘ contiene el código que puede producir una excepción, mientras que un bloque ‘except‘ captura la excepción y contiene el código que se ejecuta cuando se produce una.

Otras Palabras Clave de Manejo de Excepciones

  • else: Se puede usar después de los bloques ‘except‘ para ejecutar código si el bloque ‘try‘ no generó una excepción.
  • finally: Se utiliza para ejecutar código que debe correr independientemente de si se produjo una excepción o no, como cerrar un archivo o una conexión de red.

Levantar Excepciones

También es posible ‘levantar’ una excepción intencionalmente con la palabra clave ‘raise‘, lo que permite forzar que se produzca una excepción bajo condiciones específicas.

En esta clase, aprenderemos a identificar diferentes tipos de excepciones y cómo manejarlas de manera específica. También exploraremos cómo utilizar la declaración ‘raise‘ para crear excepciones que ayuden a controlar el flujo del programa y evitar estados erróneos o datos corruptos.

Al final de esta clase, tendrás las habilidades para escribir programas que manejen situaciones inesperadas de manera elegante y mantengan una ejecución limpia y controlada, incluso cuando se encuentren con problemas imprevistos.

try:
	num = 5/0
except ZeroDivisionError:
	print("No se puede dividir un número entre 0")
else:
	print(f"El resultado es {num}")
finally:
	print("Esto siempre se va a ejecutar")
x = -5
if(x < 0):
	raise Exception("No se pueden usar números negativos!")

Continúa con Colecciones y Estructuras de datos en Python 🍍