Está en la página 1de 58

Escritura: Damián Staghezza

Introducción
• ¿Por qué Python?
• Instalación de Python
Capítulo 1: Fundamentos de Python
• Variables y tipos de datos
• Operadores
• Estructuras de control (if, while, for)
• Funciones
• Manejo de excepciones
• Módulos y paquetes
• Manejo de archivos
Capítulo 2: Estructuras de datos
• Listas
• Tuplas
• Conjuntos
• Diccionarios
• Comprensión de listas y diccionarios
Capítulo 3: Programación orientada a objetos
• Clases y objetos
• Herencia y polimorfismo
• Encapsulación
• Métodos especiales
Capítulo 4: Manejo de errores y excepciones
• Tipos de excepciones
• Creación de excepciones personalizadas
• Uso de try, except, finally
Capítulo 5: Bibliotecas estándar
• Trabajo con archivos y directorios
• Manipulación de cadenas
• Fechas y horas
• Serialización de datos (pickle, JSON)
Capítulo 6: Programación funcional
• Funciones lambda
• Funciones de orden superior
• Map, Filter, Reduce
• Decoradores
Capítulo 7: Trabajo en red y APIs
• Sockets y conexiones de red
• Consumir APIs REST
• Creación de APIs con Flask
Capítulo 8: Bases de datos
• Acceso a bases de datos SQLite, MySQL, PostgreSQL
• Uso de ORMs como SQLAlchemy
Capítulo 9: Desarrollo Web con Python
• Introducción a frameworks web (Flask, Django)
• Creación de una aplicación web simple
Capítulo 10: Proyectos prácticos
• Análisis de datos con bibliotecas de ciencia de datos
Capítulo 11: Buenas prácticas y consejos
• Estilo de codificación (PEP 8)
• Pruebas de codigo
• Control de versiones (Git)
Capítulo 12: Recursos adicionales y avanzados
• Paralelismo y concurrencia
• Creación de GUIs con Tkinter o PyQt
• Machine learning con Python (scikit-learn, TensorFlow)
Capítulo 13: Practica constante
• Ejercicios y proyectos adicionales

Introducción a Python
¿Por qué Python?
Python es un lenguaje de programación versátil y de alto nivel que ha ganado una
enorme popularidad en la última década. Su simplicidad, legibilidad y eficiencia lo hacen
adecuado para una amplia gama de aplicaciones. En este capítulo, exploraremos las
razones por las que Python se ha convertido en una de las herramientas más populares
en el mundo de la programación. Algunos de los puntos clave a tener en cuenta
incluyen:
• Facilidad de aprendizaje: Python se distingue por su sintaxis sencilla y legible,
lo que lo convierte en un excelente lenguaje para principiantes. Esto significa que
es más fácil para las personas que no tienen experiencia previa en programación
comenzar a escribir código rápidamente.

• Versatilidad: Python es utilizado en una amplia variedad de campos, desde


desarrollo web y aplicaciones de escritorio hasta análisis de datos, inteligencia
artificial y ciencia de datos. Su capacidad para adaptarse a múltiples tareas lo
convierte en una opción atractiva para programadores de diferentes disciplinas.
• Gran comunidad y recursos: Python cuenta con una comunidad activa y una
abundancia de recursos en línea, que incluyen documentación oficial, tutoriales,
bibliotecas de terceros y foros de ayuda. Esto hace que sea más fácil obtener
respuestas a tus preguntas y aprender de otros programadores.

• Portabilidad: Python es un lenguaje multiplataforma, lo que significa que


puedes escribir código en una plataforma y ejecutarlo en otra sin problemas.
Esto es especialmente útil para desarrolladores que trabajan en diferentes
sistemas operativos.

• Librerías y frameworks: Python ofrece una amplia gama de bibliotecas y


frameworks que pueden ahorrar tiempo en el desarrollo de proyectos. Desde
Django y Flask para desarrollo web hasta TensorFlow y PyTorch para
aprendizaje automático, Python tiene todo lo que necesitas.

Instalación de Python
Antes de comenzar a programar en Python, necesitas instalarlo en tu computadora. A
continuación, te mostraré cómo hacerlo en diferentes sistemas operativos.
Instalación en Windows
Para instalar Python en un sistema Windows, sigue estos pasos:
• Abre tu navegador web y ve al sitio web oficial de Python en
https://www.python.org/downloads/.

• Descarga la última versión de Python (3.x.x) haciendo clic en el enlace de


descarga correspondiente.

• Ejecuta el archivo descargado y sigue las instrucciones del instalador. Asegúrate


de marcar la casilla "Add Python X.X to PATH" durante la instalación.

• Una vez que la instalación haya finalizado, puedes verificar si Python se ha


instalado correctamente abriendo la línea de comandos y ejecutando el comando
python. Deberías ver el intérprete de Python.

El mejor software para programar en Python es Visual Studio Code:

Visual Studio Code (VS Code) es un editor de código fuente gratuito y de código abierto
desarrollado por Microsoft. Es popular entre los desarrolladores de Python debido a su
soporte integrado para Python, depuración, comandos Git integrados, y su
extensibilidad. Puedes descargarlo desde https://code.visualstudio.com/download.
Instalación en macOS
Para instalar Python en macOS, sigue estos pasos:
• Abre tu navegador web y ve al sitio web oficial de Python en
https://www.python.org/downloads/.

• Descarga la última versión de Python (3.x.x) haciendo clic en el enlace de


descarga correspondiente

• Ejecuta el archivo descargado y sigue las instrucciones del instalador.

• Verifica la instalación abriendo la Terminal y ejecutando el comando python.


Deberías ver el intérprete de Python

Instalación en Linux
La mayoría de las distribuciones de Linux ya vienen con Python preinstalado. Para
verificar si Python está instalado en tu sistema, abre la terminal y ejecuta el comando
python. Si no está instalado, puedes instalarlo desde el administrador de paquetes de tu
distribución.
Por ejemplo, en Ubuntu, puedes usar el siguiente comando:

sudo apt-get install python3

En este libro, utilizaremos Python 3, que es la versión más reciente del lenguaje. A
medida que avancemos en los capítulos, aprenderás a escribir y ejecutar código en
Python, lo cual te permitirá aprovechar al máximo las capacidades de este lenguaje de
programación versátil.
Capítulo 1: Fundamentos de Python
En este capítulo, exploraremos los conceptos básicos de Python, que son esenciales para
cualquier persona que desee aprender a programar en este lenguaje. Abordaremos
temas como variables, tipos de datos, operadores, estructuras de control, funciones,
manejo de excepciones, módulos y paquetes, y manejo de archivos. Comenzaremos
desde cero para que los principiantes puedan comprender y aplicar estos conceptos de
manera efectiva.
1.1 Variables y tipos de datos
Las variables son contenedores que almacenan información. Piensa en ellas como
etiquetas que asignas a un valor para referenciarlo posteriormente en tu programa.
Python utiliza diferentes tipos de datos para representar la naturaleza de la información
almacenada en una variable. Los tipos de datos comunes son:
• Enteros (int): Representan números enteros, como 1, -5, 100.
• Flotantes (float): Representan números decimales, como 3.14, -0.5, 2.0.
• Cadenas (str): Almacenan texto, como "Hola, mundo" o 'Python es genial'.
• Booleanos (bool): Representan valores verdaderos o falsos, es decir, True o
False.

Ejemplo:
La elección del tipo de dato correcto es fundamental para garantizar que Python maneje
la información de manera adecuada en tu programa.
Operadores

# Ejemplos de variables y tipos de datos

entero = 42

flotante = 3.14

cadena = "Hola, Python"

booleano = True

Los operadores son símbolos especiales que realizan operaciones en Python. Se dividen
en tres categorías principales:
• Operadores aritméticos: Realizan operaciones matemáticas, como suma (+),
resta (-), multiplicación (*), división (/), y otros.

• Operadores de comparación: Comparan valores y devuelven resultados


booleanos (True o False), como igual (==), no igual (!=), mayor que (>), menor
que (<), etc.
• Operadores lógicos: Se utilizan para combinar expresiones lógicas, como "y"
(and), "o" (or), y "no" (not).

Ejemplo:

# Ejemplos de operadores

a=5

b = 10

suma = a + b # Operador aritmético (+)

comparacion = a > b # Operador de comparación (>)

logico = True and False # Operador lógico (and)

Los operadores son fundamentales para realizar cálculos, tomar decisiones y controlar
el flujo de tu programa.
Estructuras de control (if, while, for)
Las estructuras de control son esenciales para dirigir el flujo de un programa. Aquí se
describen las tres más comunes:
• Instrucción if: Permite tomar decisiones en función de una condición. Ejecuta
un bloque de código si la condición es verdadera; de lo contrario, salta el bloque.

• Bucle while: Se utiliza para repetir un bloque de código mientras una condición
sea verdadera. Es útil para realizar tareas que deben repetirse hasta que se
cumpla una condición.

• Bucle for: Itera sobre elementos en una secuencia, como una lista, tupla o
cadena. Facilita la repetición de operaciones para cada elemento en la secuencia.

Ejemplos:
# Ejemplo de estructura de control if

edad = 18

if edad >= 18:

print("Eres mayor de edad")

else:

print("Eres menor de edad")

# Ejemplo de bucle while

contador = 0

while contador < 5:

print("Contador:", contador)

contador += 1

# Ejemplo de bucle for

nombres = ["Juan", "María", "Pedro"]

for nombre in nombres:

print("Hola,", nombre)

Estas estructuras de control permiten que tu programa tome decisiones y repita tareas
de manera eficiente.
Funciones
Las funciones son bloques de código reutilizables que realizan tareas específicas. Al
definir funciones, puedes modularizar tu código y hacerlo más legible. Las funciones
toman argumentos (inputs) y pueden devolver un valor (output) o realizar tareas sin
retorno. Esto fomenta la reutilización y organización del código.
Ejemplo:
# Ejemplo de función

def saludar(nombre):

mensaje = "Hola, " + nombre

return mensaje

nombre = "Juan"

saludo = saludar(nombre)

print(saludo)

Las funciones te permiten encapsular lógica específica y ejecutarla en diferentes partes


de tu programa.
Manejo de excepciones
En programación, los errores son inevitables. El manejo de excepciones te permite
anticipar errores y manejarlos de manera controlada. Puedes evitar bloqueos
inesperados del programa y proporcionar respuestas específicas cuando se produzca
una excepción.
Ejemplo:

# Ejemplo de manejo de excepciones

try:

numero = int("no es un número")

except ValueError:

print("Ha ocurrido un error de valor")

El manejo de excepciones es esencial para garantizar la robustez de tu programa.


Módulos y paquetes
Python proporciona una amplia biblioteca estándar de módulos y paquetes que
contienen funciones y variables útiles. Los módulos son archivos de Python que
almacenan código reutilizable, mientras que los paquetes son directorios que agrupan
módulos relacionados. Importar módulos te permite utilizar funcionalidades
adicionales en tus programas y fomenta la reutilización del código.
Ejemplo:
# Ejemplo de importación de un módulo

import math

raíz_cuadrada = math.sqrt(16)

print(raíz_cuadrada)

Los módulos y paquetes son esenciales para ampliar las capacidades de Python y
facilitar el desarrollo de aplicaciones.
Manejo de archivos
En la programación, a menudo es necesario leer o escribir datos en archivos. Python
proporciona herramientas para abrir, leer, escribir y cerrar archivos de manera segura.
Esto es útil para tareas como guardar datos, leer configuraciones y trabajar con archivos
de texto o binarios.
Ejemplo:

# Ejemplo de manejo de archivos

with open("miarchivo.txt", "w") as archivo:

archivo.write("Hola, mundo")

with open("miarchivo.txt", "r") as archivo:

contenido = archivo.read()

print(contenido)

El manejo de archivos es crucial para interactuar con el sistema de archivos y para el


almacenamiento de datos.

En este capítulo, hemos explorado los conceptos fundamentales de Python, desde la


creación de variables y el uso de operadores hasta la implementación de estructuras de
control, funciones, manejo de excepciones, módulos y paquetes, y el manejo de archivos.
En los próximos capítulos, profundizaremos en conceptos más avanzados y aplicaciones
prácticas de Python.

Capítulo 2: Estructuras de Datos


En este capítulo, exploraremos las estructuras de datos en Python. Las estructuras de
datos son fundamentales para organizar y manipular información de manera efectiva. A
lo largo de este capítulo, aprenderás sobre las listas, tuplas, conjuntos, diccionarios y
cómo aprovechar la comprensión de listas y diccionarios para simplificar tu código.
Listas
Las listas son colecciones ordenadas de elementos en Python. Pueden contener una
variedad de tipos de datos y se definen mediante corchetes [ ]. Aquí hay algunas
características clave de las listas:
• Ordenadas: Los elementos se almacenan en un orden específico, lo que significa
que puedes acceder a ellos por índice.

• Mutables: Puedes agregar, eliminar o modificar elementos en una lista después


de crearla.

• Pueden contener diferentes tipos de datos: En una lista, puedes mezclar


números, cadenas, booleanos y otros tipos de datos.

Ejemplo:

# Ejemplo de lista

mi_lista = [1, "Hola", 3.14, True]

Tuplas
Las tuplas son similares a las listas, pero con una diferencia importante: son inmutables.
Esto significa que una vez que creas una tupla, no puedes cambiar su contenido. Se
definen mediante paréntesis ( ).
• Ordenadas: Al igual que las listas, las tuplas mantienen un orden específico de
elementos.

• Inmutables: No puedes agregar, eliminar ni modificar elementos en una tupla


después de su creación.

• Pueden contener diferentes tipos de datos: Las tuplas pueden albergar una
mezcla de tipos de datos, al igual que las listas.

Ejemplo:
# Ejemplo de tupla

mi_tupla = (1, "Hola", 3.14)

Conjuntos
Los conjuntos son colecciones no ordenadas de elementos únicos en Python. Se definen
mediante llaves { } o la función set(). Aquí hay algunas características clave de los
conjuntos:
• No ordenados: Los elementos no tienen un orden específico en un conjunto.

• Elementos únicos: Un conjunto no puede contener duplicados; cada elemento


es único.

• Mutables: Puedes agregar y eliminar elementos de un conjunto después de su


creación.

Ejemplo:

# Ejemplo de conjunto

mi_conjunto = {1, 2, 3, 1, 2}

Lógica: Los conjuntos son útiles cuando necesitas almacenar elementos únicos y no te
importa el orden. Son eficientes para verificar si un elemento específico está presente.
Diccionarios
Los diccionarios son estructuras de datos clave-valor en Python. Se definen mediante
llaves { } y tienen la forma clave: valor. Aquí hay algunas características clave de los
diccionarios:
• No ordenados: Al igual que los conjuntos, los elementos no tienen un orden
específico en un diccionario.

• Clave-valor: Cada elemento tiene una clave única que actúa como identificador y
un valor asociado.

• Mutables: Puedes agregar, eliminar o modificar elementos en un diccionario


después de su creación.

Ejemplo:
# Ejemplo de diccionario

mi_diccionario = {"nombre": "Juan", "edad": 30, "ciudad":


"Ejemplo"}

Lógica: Los diccionarios son ideales para asociar información, donde una clave única se
relaciona con un valor específico. Esto permite una rápida recuperación de datos basada
en su clave.
Comprensión de listas y diccionarios
La comprensión de listas y diccionarios es una característica avanzada que permite
crear listas y diccionarios de manera concisa y legible. Permite definir estructuras de
datos utilizando una sintaxis más compacta.
• Comprensión de listas: Te permite crear listas utilizando una expresión for y,
opcionalmente, una expresión if para filtrar elementos.

Ejemplo de comprensión de listas:

numeros = [1, 2, 3, 4, 5]

cuadrados = [x**2 for x in numeros]

• Comprensión de Diccionarios: Te permite crear diccionarios utilizando una


expresión for y una forma de especificar tanto las claves como los valores.

Ejemplo de comprensión de diccionarios:

personas = ["Juan", "María", "Pedro"]

edades = [30, 25, 35]

diccionario_edades = {persona: edad for persona, edad in zip(personas, edades)}

El zip es una función incorporada de Python que se utiliza para combinar dos o más
iterables (por ejemplo, listas, tuplas o cadenas) en un solo iterable. Esta función toma
elementos correspondientes de los iterables de entrada y los empareja en tuplas.
La función zip se utiliza comúnmente cuando necesitas combinar datos relacionados de
dos o más secuencias para procesarlos juntos.
Lógica: La comprensión de listas y diccionarios simplifica la creación de estructuras de
datos, reduciendo la cantidad de código necesario y haciendo que el código sea más
claro y legible.
Capítulo 3: Programación Orientada a
Objetos

Clases y Objetos
La Programación Orientada a Objetos (POO) se basa en el concepto de clases y objetos.
Aquí hay una explicación más detallada:

• Clase: Una clase es una plantilla o un plano para crear objetos. Imagina que una
clase es como un modelo para un tipo específico de objeto. Define las
características (atributos) y acciones (métodos) que los objetos de esa clase
tendrán. En el ejemplo del libro, la clase "Libro" define la estructura general de
todos los libros, como título, autor y los métodos para prestar y devolver.

• Objeto: Un objeto es una instancia concreta de una clase. Cuando creas un


objeto, estás creando una versión específica basada en la plantilla de la clase.
Cada objeto tiene sus propios valores para los atributos de la clase. Por ejemplo,
"libro1" y "libro2" son dos objetos de la clase "Libro".
# Definición de una clase Libro

class Libro:

def __init__(self, titulo, autor):

self.titulo = titulo

self.autor = autor

self.prestado = False

def prestar(self):

if not self.prestado:

self.prestado = True

print("El libro ha sido prestado.")

else:

print("El libro ya está prestado.")

def devolver(self):

if self.prestado:

self.prestado = False

print("El libro ha sido devuelto.")

else:

print("El libro no está prestado.")

# Creación de objetos Libro

libro1 = Libro("Harry Potter", "J.K. Rowling")

libro2 = Libro("El Señor de los Anillos", "J.R.R. Tolkien")

# Uso de métodos

libro1.prestar()

libro1.devolver()

libro2.prestar()

Herencia y Polimorfismo
• Herencia: La herencia es un concepto clave en la POO que permite que una clase
(subclase) herede atributos y métodos de otra clase (superclase). La superclase
proporciona una estructura general y las subclases pueden personalizar o
extender esta estructura. En el ejemplo, la clase "LibroDigital" hereda de la clase
"Libro" y obtiene todos sus atributos y métodos. Esto fomenta la reutilización de
código.

• Polimorfismo: El polimorfismo significa que objetos de diferentes clases pueden


responder de la misma manera a ciertas operaciones o métodos. En el ejemplo,
tanto "libro1" como "libro2" pueden ser prestados de la misma manera, a pesar
de que uno es un objeto de la clase "Libro" y el otro de la clase "LibroDigital".
Esto simplifica la escritura de código que funciona con diferentes tipos de
objetos.

Encapsulación

• Encapsulación: La encapsulación es un principio de POO que implica ocultar los


detalles internos de un objeto y proporcionar una interfaz para interactuar con
él. En Python, puedes marcar atributos como privados usando un guion bajo (por
ejemplo, _saldo). Esto significa que estos atributos no deben modificarse
directamente desde fuera de la clase, sino a través de métodos públicos. Esto
protege los datos y evita cambios no deseados.
# Clase con encapsulación

class CuentaBancaria:

def __init__(self, saldo):

self._saldo = saldo # Atributo privado

def depositar(self, cantidad):

if cantidad > 0:

self._saldo += cantidad

print("Depósito exitoso.")

else:

print("Cantidad no válida.")

def _retirar(self, cantidad): # Método privado

if 0 < cantidad <= self._saldo:

self._saldo -= cantidad

print("Retiro exitoso.")

else:

print("Saldo insuficiente o cantidad no válida.")

def obtener_saldo(self):

return self._saldo

# Creación de objeto

cuenta = CuentaBancaria(1000)

# Uso de métodos para interactuar con el atributo privado

cuenta.depositar(500)

cuenta._retirar(200) # No se debe acceder directamente a un


método privado

print("Saldo actual:", cuenta.obtener_saldo())

Métodos Especiales

• Métodos especiales: Los métodos especiales, también llamados "métodos


mágicos", son métodos predefinidos en Python que tienen nombres especiales
con doble guion bajo, como __init__ y __str__. Estos métodos permiten
personalizar el comportamiento de las clases en situaciones específicas. Por
ejemplo, __init__ se llama cuando se crea un objeto y se utiliza para inicializar
atributos, mientras que __str__ se llama cuando se imprime un objeto y se usa
para definir cómo se verá el objeto como una cadena.

# Clase con método especial __str__

class Persona:

def __init__(self, nombre, edad):

self.nombre = nombre

self.edad = edad

def __str__(self):

return f"{self.nombre}, {self.edad} años"

# Creación de objeto y uso del método especial

persona = Persona("Juan", 30)

print(persona) # Esto llama implícitamente a persona.__str__()

Capítulo 4: Manejo de errores y


excepciones
En el Capítulo 4, exploraremos el manejo de errores y excepciones en Python. A lo largo
de este capítulo, cubriremos tres aspectos importantes: tipos de excepciones, la
creación de excepciones personalizadas y el uso de las estructuras try, except y
finally para controlar y manejar las excepciones.
Tipos de excepciones
En Python, una excepción es un evento que ocurre durante la ejecución del programa y
que interrumpe el flujo normal de este. Aquí hay una explicación detallada de este
concepto:
• Excepción: Una excepción es una situación inesperada o un error que ocurre en
el programa. Cuando una excepción se desencadena, el flujo normal del
programa se interrumpe y el programa busca un manejador de excepciones para
tratar la situación.

• Tipos de excepciones: Python proporciona una amplia gama de tipos de


excepciones incorporadas, como ZeroDivisionError, TypeError,
FileNotFoundError, entre otros. Cada tipo de excepción se refiere a un tipo
específico de error que puede ocurrir. Por ejemplo, ZeroDivisionError ocurre
cuando intentas dividir por cero.

• Manejo de excepciones: Para manejar excepciones, puedes utilizar las


estructuras try y except. En un bloque try, colocas el código que podría generar
una excepción, y en un bloque except, defines cómo deseas manejar la excepción
si se produce.

• ZeroDivisionError: Ocurre cuando intentas dividir por cero.

try:

resultado = 5 / 0

except ZeroDivisionError:

print("Error: División por cero no permitida.")

• TypeError: Ocurre cuando realizas operaciones entre tipos incompatibles.

try:

resultado = "5" + 3

except TypeError:

print("Error: No se pueden concatenar una cadena y un número.")

• FileNotFoundError: Ocurre cuando intentas abrir un archivo que no existe.


try:

with open("archivo_inexistente.txt", "r") as archivo:

contenido = archivo.read()

except FileNotFoundError:

print("Error: El archivo no existe.")

Creación de excepciones personalizadas


En ocasiones, es útil crear excepciones personalizadas para manejar situaciones
específicas en tu programa. Aquí hay una explicación más detallada:
• Excepciones personalizadas: Python te permite definir tus propias excepciones
personalizadas creando una clase que herede de Exception o de una excepción
específica. Puedes agregar atributos y métodos a estas clases para personalizar el
comportamiento de tu excepción.
• Razones para excepciones personalizadas: Puedes crear excepciones
personalizadas para manejar situaciones específicas que no están cubiertas por
las excepciones incorporadas. Esto te permite proporcionar mensajes de error
más descriptivos y un mejor control de errores en tu programa.

class MiErrorPersonalizado(Exception):

def __init__(self, mensaje):

super().__init__(mensaje)

def dividir(a, b):

if b == 0:

raise MiErrorPersonalizado("No se puede dividir por cero.")

return a / b

try:

resultado = dividir(5, 0)

except MiErrorPersonalizado as e:

print("Error personalizado:", e)

Uso de try, except, finally


• Estructuras try, except, finally: Estas estructuras te permiten manejar
excepciones de manera efectiva. En un bloque try, colocas el código que podría
generar una excepción. En un bloque except, defines cómo deseas manejar la
excepción si se produce. El bloque finally se ejecuta siempre,
independientemente de si se produce una excepción o no. Esto es útil para
realizar acciones de limpieza, como cerrar archivos o conexiones de bases de
datos.
• **Uso de try y except sin finally**: Puedes usar solo tryyexceptpara
manejar excepciones sin la necesidad de un bloquefinally`. Esto es común
cuando no necesitas realizar acciones de limpieza adicionales.
• Manejo de múltiples excepciones: Puedes tener varios bloques except para
manejar diferentes tipos de excepciones. De esta manera, puedes personalizar el
manejo de errores según el tipo de excepción que se genere.
def abrir_archivo(nombre_archivo):

try:

archivo = open(nombre_archivo, "r")

contenido = archivo.read()

return contenido

except FileNotFoundError:

print("Error: El archivo no existe.")

return None

finally:

if 'archivo' in locals():

archivo.close()

contenido = abrir_archivo("miarchivo.txt")

if contenido:

print("Contenido del archivo:", contenido)

Este capítulo te proporciona una comprensión profunda sobre cómo manejar los
errores y excepciones en Python. Aprenderás a identificar y manejar diferentes tipos de
excepciones, crear excepciones personalizadas y utilizar las estructuras try, except, y
finally para controlar y gestionar las excepciones de manera efectiva. El manejo de
excepciones es esencial para escribir programas más robustos y seguros.

Capítulo 5: Bibliotecas estándar


En el Capítulo 5, exploraremos la amplia gama de funcionalidades que ofrece la
Biblioteca Estándar de Python. A lo largo de este capítulo, aprenderás a trabajar con
archivos y directorios, manipular cadenas de texto, manejar fechas y horas, y serializar
datos utilizando formatos como pickle y JSON.

Trabajo con archivos y directorios


Python proporciona herramientas eficientes para trabajar con archivos y directorios.
Puedes crear, leer, escribir y gestionar archivos de diversas formas.
Algunas de las tareas comunes que puedes realizar incluyen:
• Lectura de archivos: Puedes abrir y leer archivos de texto o binarios para
acceder a su contenido.

• Escritura en archivos: Puedes crear, abrir y escribir en archivos para almacenar


datos o información.

• Manipulación de directorios: Puedes crear, eliminar, renombrar y navegar por


directorios.

• Operaciones de archivo avanzadas: Python te permite copiar, mover y realizar


otras operaciones avanzadas en archivos y directorios.

Aquí tienes un ejemplo de cómo abrir un archivo y leer su contenido:

# Abrir un archivo en modo lectura

with open("miarchivo.txt", "r") as archivo:

contenido = archivo.read()

print(contenido)

Además de leer archivos, Python te permite crear nuevos archivos, escribir en ellos,
renombrarlos, eliminarlos y más.

Manipulación de cadenas
Las cadenas de texto son una parte fundamental de la programación. Python ofrece
numerosos métodos y operaciones para manipular cadenas. Aquí tienes un ejemplo de
cómo concatenar cadenas y convertir texto a mayúsculas:

cadena1 = "Hola"

cadena2 = "Mundo"

resultado = cadena1 + " " + cadena2

resultado_mayusculas = resultado.upper()

print(resultado)

print(resultado_mayusculas)
Puedes realizar operaciones como dividir cadenas, reemplazar texto, y mucho más.

Fechas y horas
El manejo de fechas y horas es esencial en muchas aplicaciones. Python tiene un módulo
llamado datetime que te permite trabajar con fechas y horas de manera efectiva. Aquí
tienes un ejemplo de cómo obtener la fecha y hora actual:

import datetime

fecha_actual = datetime.datetime.now()

print("Fecha y hora actual:", fecha_actual)

Puedes realizar operaciones como sumar o restar días, horas y más.


Serialización de datos (pickle, JSON)
La serialización es el proceso de convertir datos en un formato que puede ser
almacenado o transmitido y luego reconstruido. En Python, dos formatos populares son
pickle y JSON para serializar datos.
• Pickle: Es un formato de serialización específico de Python. Puedes utilizarlo
para almacenar objetos Python completos, incluyendo listas, diccionarios y
objetos personalizados. Es útil para guardar el estado de tus aplicaciones.

• JSON (JavaScript Object Notation): Es un formato de serialización más


universal y legible por humanos. Es ideal para intercambio de datos entre
aplicaciones, especialmente en entornos web.

Aquí tienes ejemplos de cómo utilizarlos:


import pickle

import json

# Serialización con pickle

datos = {"nombre": "Juan", "edad": 30}

with open("datos.pickle", "wb") as archivo:

pickle.dump(datos, archivo)

# Serialización con JSON

datos = {"nombre": "María", "edad": 25}

with open("datos.json", "w") as archivo:

json.dump(datos, archivo)

# Deserialización con pickle

with open("datos.pickle", "rb") as archivo:

datos_cargados = pickle.load(archivo)

print("Datos cargados con pickle:", datos_cargados)

# Deserialización con JSON

with open("datos.json", "r") as archivo:

datos_cargados = json.load(archivo)

print("Datos cargados con JSON:", datos_cargados)

La Biblioteca Estándar de Python ofrece numerosos módulos para una amplia variedad
de tareas, desde manipulación de archivos y cadenas hasta manejo de fechas y horas, y
serialización de datos. Dominar estas herramientas te permitirá crear aplicaciones más
poderosas y eficientes. En los próximos capítulos, exploraremos temas avanzados que te
ayudarán a llevar tus habilidades de programación en Python al siguiente nivel.

Capítulo 6: Programación Funcional


La programación funcional es un paradigma de programación que se centra en el
tratamiento de las funciones como ciudadanos de primera clase y se basa en la
evaluación de funciones matemáticas. Python es un lenguaje que admite programación
funcional, y en este capítulo, exploraremos algunas de las características clave de la
programación funcional en Python:
6.1 Funciones Lambda
• Las funciones lambda, también conocidas como funciones anónimas, son
funciones pequeñas y sin nombre que pueden tener uno o más argumentos, pero
solo una expresión. Son útiles para tareas rápidas y sencillas que no requieren
una función definida de antemano.

Ejemplo de una función lambda que suma dos números:

suma = lambda x, y: x + y

resultado = suma(3, 5)

print("Resultado de la función lambda:", resultado)

Funciones de Orden Superior


• En Python, las funciones son ciudadanos de primera clase, lo que significa que se
pueden tratar como cualquier otro objeto, como variables, pasarse como
argumentos a otras funciones y devolverse como resultados. Las funciones de
orden superior son aquellas que toman una o más funciones como argumentos o
devuelven una función como resultado.

Ejemplo de una función de orden superior que toma una función como argumento:

def aplicar(funcion, lista):

resultado = []

for elemento in lista:

resultado.append(funcion(elemento))

return resultado

def cuadrado(x):

return x * x

numeros = [1, 2, 3, 4, 5]

resultado = aplicar(cuadrado, numeros)

print("Resultado de la función de orden superior:", resultado)

Funciones Map, Filter, Reduce


• Estas son funciones integradas en Python que permiten realizar operaciones
sobre secuencias de datos, como listas.
• map: Aplica una función a cada elemento de una secuencia y devuelve una nueva
secuencia con los resultados.

numeros = [1, 2, 3, 4, 5]

cuadrados = list(map(lambda x: x * x, numeros))

print("Cuadrados:", cuadrados)

• filter: Filtra elementos de una secuencia según una función que devuelve
valores booleanos, devolviendo una nueva secuencia con los elementos que
cumplen la condición.

numeros = [1, 2, 3, 4, 5]

pares = list(filter(lambda x: x % 2 == 0, numeros))

print("Números pares:", pares)

• reduce: Aplica una función a una secuencia de manera acumulativa, es decir,


toma el resultado de la operación anterior y lo usa como entrada para la
siguiente operación.

Para utilizar reduce, primero debes importarlo desde el módulo functools:

from functools import reduce

numeros = [1, 2, 3, 4, 5]

suma_total = reduce(lambda x, y: x + y, numeros)

print("Suma total:", suma_total)

Decoradores
• Los decoradores son funciones que se utilizan para extender o modificar el
comportamiento de otras funciones o métodos sin cambiar su código fuente. Los
decoradores son ampliamente utilizados en Python y son esenciales para la
programación funcional.

Ejemplo de un decorador que mide el tiempo de ejecución de una función:


import time

def medir_tiempo(funcion):

def wrapper(*args, **kwargs):

inicio = time.time()

resultado = funcion(*args, **kwargs)

fin = time.time()

print(f"Tiempo de ejecución: {fin - inicio} segundos")

return resultado

return wrapper

@medir_tiempo

def funcion_lenta():

time.sleep(2)

funcion_lenta()

Capítulo 7: Trabajo en Red y APIs


(Para Principiantes)

En este capítulo, nos adentraremos en el mundo de las redes y las APIs, pero lo haremos
de una manera que sea fácil de entender para alguien que es nuevo en este campo.

Sockets y conexiones de red


• Los "sockets" son como canales de comunicación que permiten que las
computadoras se hablen entre sí a través de una red. Imagina que son como
cables virtuales que conectan tu computadora con otras.

• Python tiene una herramienta llamada "socket" que te permite crear estos
canales y comunicarte con otras computadoras a través de la red.

• Esto puede ser útil para cosas como chatear en línea, transferir archivos o jugar
juegos con amigos en línea.

• Aquí tienes un ejemplo simple: Supongamos que quieres conectar tu computado


a un servidor remoto y obtener una página web:
import socket

# Crear un canal de comunicación (socket)

canal = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Conectarlo a un servidor remoto (por ejemplo, un sitio web)

servidor = 'example.com'

puerto = 80

canal.connect((servidor, puerto))

# Enviar un mensaje al servidor

mensaje = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"

canal.sendall(mensaje.encode())

# Recibir la respuesta del servidor

respuesta = canal.recv(1024)

print(respuesta.decode())

# Cerrar el canal de comunicación

canal.close()

Consumir APIs REST


• Una "API" es como un menú de opciones que permite que diferentes programas
se hablen entre sí. Es como un conjunto de reglas para solicitar y recibir
información.

• Las "APIs REST" son un tipo común de API que utiliza el lenguaje de la web,
HTTP, para enviar y recibir datos. Esto es similar a cómo tu navegador web
obtiene información de sitios web.
• Python tiene una herramienta llamada "requests" que hace que sea más fácil
usar estas APIs. Puedes usarlo para obtener información de otros sitios web o
servicios.

• Aquí tienes un ejemplo de cómo usar "requests" para obtener datos de una API:

import requests

# URL de la API

url = 'https://api.example.com/data'

# Hacer una solicitud para obtener datos

respuesta = requests.get(url)

# Comprobar si la solicitud fue exitosa

if respuesta.status_code == 200:

datos = respuesta.json() # Convierte la respuesta en


información que Python puede entender

print(datos)

else:

print("Hubo un error al obtener los datos.")

Creación de APIs con Flask


• Flask es como una herramienta para construir tus propias APIs. Es como crear tu
propio menú de opciones para que otros programas se comuniquen con tu
programa.
• Aquí tienes un ejemplo simple de cómo usar Flask para crear tu propia API:
from flask import Flask, jsonify

app = Flask(__name)

@app.route('/saludo')

def saludar():

mensaje = {'mensaje': 'Hola, mundo'}

return jsonify(mensaje)

if __name__ == '__main__':

app.run()

• En este ejemplo, hemos creado una API web que responde a solicitudes en la ruta
"/saludo" y devuelve un mensaje en formato que otras computadoras pueden
entender.

Capítulo 8: Bases de Datos (Para


Principiantes)
En este capítulo, exploraremos el mundo de las bases de datos, comenzando desde lo
más básico para que sea accesible para aquellos que son nuevos en este tema.

Acceso a bases de datos SQLite, MySQL, PostgreSQL

• Las bases de datos son como archivos grandes y organizados que almacenan
información de manera estructurada. Puedes pensar en ellas como grandes hojas
de cálculo electrónicas que almacenan datos.

• Python te permite conectarte y trabajar con diferentes tipos de bases de datos,


como SQLite, MySQL y PostgreSQL. Cada una de estas bases de datos tiene sus
propias características y usos.

• Para acceder a una base de datos en Python, necesitas una biblioteca que sea
compatible con el tipo de base de datos que estás utilizando. Por ejemplo, para
SQLite, puedes usar la biblioteca "sqlite3", y para MySQL, puedes usar la
biblioteca "mysql-connector".

• Aquí tienes un ejemplo simple de cómo acceder a una base de datos SQLite y
realizar una consulta:
import sqlite3

# Conectar a la base de datos SQLite

conexion = sqlite3.connect('mi_base_de_datos.db')

# Crear un cursor (como una herramienta para hacer consultas)

cursor = conexion.cursor()

# Realizar una consulta SQL

cursor.execute("SELECT * FROM tabla")

resultados = cursor.fetchall()

# Cerrar la conexión

conexion.close()

# Mostrar los resultados

for fila in resultados:

print(fila)

Uso de ORMs como SQLAlchemy

• Un ORM (Mapeo Objeto-Relacional) es una herramienta que te permite trabajar


con bases de datos de una manera más orientada a objetos. En lugar de escribir
consultas SQL directamente, puedes interactuar con la base de datos utilizando
objetos y métodos en tu código.

• SQLAlchemy es una biblioteca ORM popular en Python que te permite trabajar


con varias bases de datos de manera uniforme. Te permite definir tus tablas de
base de datos como clases de Python y realizar consultas utilizando métodos de
Python.

• Aquí tienes un ejemplo muy básico de cómo usar SQLAlchemy para definir una
tabla y realizar una consulta:
from sqlalchemy import create_engine, Column, Integer, String

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

# Crear una conexión a la base de datos

motor = create_engine('sqlite:///mi_base_de_datos.db')

# Crear una sesión (como una herramienta para interactuar con la base de datos)

Sesion = sessionmaker(bind=motor)

sesion = Sesion()

# Definir una tabla como una clase de Python

Base = declarative_base()

class MiTabla(Base):

__tablename__ = 'mi_tabla'

id = Column(Integer, primary_key=True)

nombre = Column(String)

# Realizar una consulta

resultados = sesion.query(MiTabla).all()

# Mostrar los resultados

for fila in resultados:

print(fila.id, fila.nombre)

Uso Básico de una Base de Datos


• Para usar una base de datos, necesitas saber cómo crear tablas, insertar datos,
recuperar datos y actualizar datos. Aquí hay una visión general muy básica:

• Crear una tabla: Define la estructura de tus datos, incluyendo los nombres de las
columnas y los tipos de datos que almacenan.

• Insertar datos: Agrega filas de datos a tu tabla.

• Recuperar datos: Realiza consultas para seleccionar datos específicos de tu tabla.

• Actualizar datos: Modifica los datos existentes en tu tabla.

• Aquí tienes un ejemplo simple de cómo crear una tabla y agregar datos en una
base de datos SQLite:
import sqlite3

# Conectar a la base de datos SQLite

conexion = sqlite3.connect('mi_base_de_datos.db')

# Crear un cursor

cursor = conexion.cursor()

# Crear una tabla

cursor.execute('''

CREATE TABLE usuarios (

id INTEGER PRIMARY KEY,

nombre TEXT

''')

# Insertar datos en la tabla

cursor.execute('INSERT INTO usuarios (nombre) VALUES (?)', ('Juan',))

cursor.execute('INSERT INTO usuarios (nombre) VALUES (?)', ('María',))

# Guardar los cambios

conexion.commit()

# Realizar una consulta para recuperar datos

cursor.execute('SELECT * FROM usuarios')

resultados = cursor.fetchall()

# Mostrar los resultados

for fila in resultados:

print(fila)

# Cerrar la conexión

conexion.close()
Capítulo 9: Desarrollo web con Python
para principiantes
En este capítulo, te adentrarás en el emocionante mundo del desarrollo web con Python.
Desde los conceptos más básicos hasta la creación de una aplicación web simple, esta
sección te proporcionará una visión general completa, especialmente diseñada para
quienes son nuevos en el desarrollo web y Python.
9.1 Introducción a Frameworks Web (Flask, Django)
• ¿Qué es un Framework Web?: Un framework web es una herramienta que
simplifica el proceso de construir aplicaciones web. Proporciona una estructura
predefinida y reglas para ayudarte a desarrollar aplicaciones más rápido y
eficientemente.

• Flask y Django: Flask y Django son dos de los frameworks web más populares
en el mundo Python. Flask es ligero y flexible, ideal para proyectos pequeños y
medianos. Django es más completo y ofrece una amplia gama de características,
adecuado para aplicaciones web más grandes y complejas.

9.2 Creación de una Aplicación Web Simple


Aquí tienes los pasos básicos para crear una aplicación web simple:
• Instalar un Framework Web: Comienza instalando Flask o Django. Utiliza la
herramienta pip (Descarga en: https://pypi.org/project/pip/) para realizar la
instalación. Ejemplo: pip install flask o en el caso de Django: pip install
django.

• Comprueba su instalación:
1. Abre tu terminal o línea de comandos.

2. Ejecuta el siguiente comando para verificar si Flask está instalado:

flask --version

• En el caso de Django:

django-admin --version
• Configurar la aplicación: Define la estructura de tu aplicación y configura las
rutas URL. Flask utiliza decoradores para definir rutas, mientras que en Django,
se configuran en archivos de configuración.

• Crear plantillas HTML: Diseña las plantillas HTML que determinarán cómo se
verá tu sitio web. Estas plantillas se utilizan para generar páginas web dinámicas.

• Diseñar la lógica de la aplicación: Define la lógica de tu aplicación, que incluye


cómo se manejarán las solicitudes del usuario y cómo se generarán las
respuestas. Esto se hace en las funciones o métodos de tu aplicación.

• Conectar con una base de datos (si es necesario): Si tu aplicación necesita


almacenar datos, puedes conectarla a una base de datos. Flask y Django ofrecen
soporte para esto, permitiéndote almacenar y recuperar información de manera
eficiente.

• Ejecutar el servidor: Ejecuta el servidor web proporcionado por el framework


para ver tu aplicación en acción. Por lo general, esto se hace ejecutando un
comando en la terminal, como flask run o python manage.py runserver en el
caso de Django.

• Interactuar con tu aplicación: Abre un navegador web y visita la dirección local


donde se ejecuta tu aplicación (generalmente http://localhost:5000 para
Flask). Interactúa con tu aplicación y observa cómo responde a las solicitudes.

Por ejemplo, en Flask:

1. Crear un archivo:

Puedes crear un archivo de Python para tu aplicación y definir las rutas URL utilizando
decoradores. Aquí tienes un ejemplo:
from flask import Flask

app = Flask(__name)

@app.route('/')

def index():

return 'Hola, mundo!'

if __name__ == '__main__':

app.run()

Este código crea una aplicación Flask simple con una ruta URL que responde a la
dirección raíz ('/'). Cuando visites la dirección http://localhost:5000/ en tu navegador,
verás el mensaje "Hola, mundo!".
2. Crear plantillas HTML:
Para diseñar plantillas HTML en Flask, debes crear una carpeta llamada "templates" en
el directorio de tu proyecto y almacenar tus archivos HTML allí. Puedes usar el motor de
plantillas Jinja2 integrado con Flask para generar páginas web dinámicas. Aquí tienes un
ejemplo de una plantilla HTML:
1. Creación de archivo HTML:

• Abre un editor de texto: Utiliza cualquier editor de texto que prefieras. Puedes
usar editores simples como el Bloc de notas en Windows o aplicaciones más
avanzadas como Visual Studio Code, Sublime Text o Notepad++.

• Guarda el archivo: Guarda el archivo con una extensión ".html". Por ejemplo,
puedes nombrarlo "mi_pagina.html". Asegúrate de seleccionar "Todos los
archivos" como el tipo de archivo al guardar.

• Abre el archivo en un navegador: Para ver tu página web, simplemente abre el


archivo HTML en un navegador web. Puedes hacerlo haciendo doble clic en el
archivo o utilizando la opción "Abrir archivo" en el menú de tu navegador.
<!DOCTYPE html>

<html>

<head>

<title>Mi Página Web</title>

</head>

<body>

<h1>{{ titulo }}</h1>

<p>{{ contenido }}</p>

</body>

</html>

• <!DOCTYPE html>: Esta línea declara el tipo de documento que estamos creando,
que es un documento HTML5. Es una declaración necesaria al comienzo de un
documento HTML.
• <html>: Este elemento es la raíz del documento HTML y engloba todo el
contenido.
• <head>: Esta sección contiene información sobre el documento, como el título de
la página y enlaces a otros recursos, como hojas de estilo y scripts. El contenido
del head no es visible en la página web.
• <title>: Define el título de la página que se mostrará en la pestaña del
navegador.
• <body>: Aquí es donde se coloca el contenido visible de la página web, como
texto, imágenes y enlaces.
• <h1>: Esto representa un encabezado de nivel 1. Los encabezados se utilizan para
marcar títulos o secciones importantes en la página. Cuanto más bajo es el
número, más grande es el encabezado. <h1> es el más grande.
• {{ titulo }}: Esto parece un marcador de posición que será llenado con un
valor real cuando se renderice la página. En el contexto de Flask, es un marcador
para datos dinámicos que provienen del servidor.
• <p>: Este elemento se utiliza para crear párrafos de texto en la página.
• {{ contenido }}: Al igual que el marcador de título, este es otro marcador de
posición para datos dinámicos que se llenarán con información real cuando se
muestre la página.

En tu aplicación Flask, puedes renderizar esta plantilla y pasar datos a la misma. Por
ejemplo:
from flask import Flask, render_template

app = Flask(__name)

@app.route('/')

def index():

return render_template('mi_plantilla.html',
titulo='Bienvenido', contenido='Esta es mi página web.')

if __name__ == '__main__':

app.run()

3. Diseñar la lógica de la aplicación:


La lógica de la aplicación se define en funciones de tus vistas. En el ejemplo anterior, la
vista index() maneja la ruta URL raíz y renderiza una plantilla HTML. Puedes agregar
más vistas para manejar otras rutas y definir cómo se generarán las respuestas en esas
vistas.
4. Conectar con una base de datos:
Si necesitas conectarte a una base de datos en Flask, puedes usar extensiones como
SQLAlchemy para interactuar con bases de datos. Primero, debes instalar la extensión:

pip install Flask-SQLAlchemy

Luego, puedes configurar y utilizar SQLAlchemy para interactuar con la base de datos
según tus necesidades.
5. Ejecutar el servidor:
Para ejecutar el servidor web proporcionado por Flask y ver tu aplicación en acción,
abre la terminal y navega al directorio de tu proyecto. Luego, ejecuta el siguiente
comando:

flask run

Esto ejecutará la aplicación en modo de desarrollo y mostrará la dirección local donde


puedes acceder a tu aplicación (generalmente http://localhost:5000).
6. Interactuar con tu aplicación:
Abre un navegador web y visita la dirección local donde se ejecuta tu aplicación (por
ejemplo, http://localhost:5000). Puedes interactuar con tu aplicación y observar cómo
responde a las solicitudes.

Definiciones clave:
Flask:
• Routing (Enrutamiento): Flask utiliza decoradores para asignar rutas URL a
funciones específicas. Por ejemplo, al usar @app.route('/ruta'), puedes definir
una función que se ejecutará cuando se acceda a esa ruta.
• Plantillas (Templates): Flask utiliza el motor de plantillas Jinja2 para
renderizar páginas HTML. Puedes diseñar plantillas HTML y utilizar etiquetas
Jinja2 para incrustar datos dinámicos en tus páginas.
• Formularios: Puedes crear formularios HTML y procesar los datos del
formulario en tus vistas de Flask. La extensión Flask-WTF facilita la creación de
formularios y la validación de datos.
• Autenticación: Flask-Login es una extensión que facilita la implementación de la
autenticación de usuarios. Puedes gestionar la sesión del usuario y restringir el
acceso a rutas específicas.
Django:
• Routing (Enrutamiento): En Django, el enrutamiento se configura en el archivo
urls.py. Puedes asignar vistas a rutas URL específicas utilizando patrones de
URL.
• Plantillas (Templates): Django tiene su propio sistema de plantillas que
permite diseñar páginas HTML con una sintaxis específica. Puedes incrustar
datos en las plantillas utilizando etiquetas y filtros.
• Formularios: Django proporciona un sistema robusto para crear y procesar
formularios HTML. Puedes definir formularios en Python y renderizarlos en tus
vistas.
• Autenticación: La autenticación de usuarios se simplifica en Django con el
sistema de autenticación incorporado. Puedes gestionar la autenticación,
autorización y sesiones de usuario de manera eficiente.

Capítulo 10: Análisis de Datos con


bibliotecas de ciencia de datos

• Instalar Jupyter Notebook (opcional): Jupyter Notebook es una excelente


herramienta para el análisis de datos interactivo. Puedes instalarlo con pip
install jupyter.
• Instalar bibliotecas de ciencia de datos: Las bibliotecas esenciales para el análisis
de datos incluyen NumPy, Pandas, Matplotlib y Seaborn. Puedes instalarlas con
pip install numpy pandas matplotlib seaborn.

Paso 2: Importar bibliotecas


En tu proyecto de análisis de datos, el primer paso es importar las bibliotecas
necesarias:

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

Paso 3: Cargar datos


Utiliza Pandas para cargar tus datos desde fuentes como archivos CSV, Excel, bases de
datos u otras. Por ejemplo, para cargar un archivo CSV:

data = pd.read_csv('mi_archivo.csv')

# Reemplaza 'mi_archivo.csv' con el nombre real de tu archivo


CSV.

Paso 4: Explorar y limpiar datos


Antes de realizar análisis, explora y limpia tus datos. Algunos comandos útiles incluyen:
• data.head(): Muestra las primeras filas de tus datos.
• data.info(): Proporciona información sobre tipos de datos y valores nulos.
• data.describe(): Calcula estadísticas descriptivas.
• data.isnull().sum(): Muestra la cantidad de valores nulos en cada columna.
• data.dropna(): Elimina filas con valores nulos.

Paso 5: Realizar análisis


Aquí es donde comienza el análisis real. Puedes realizar cálculos y visualizaciones para
obtener información valiosa de tus datos. Algunas tareas comunes incluyen:
• Estadísticas descriptivas: data.describe()
• Gráficos exploratorios: sns.pairplot(data), sns.heatmap(data.corr())
• Visualizaciones: plt.bar(x, y), plt.hist(data['columna'])

Paso 6: Interpretar resultados


Una vez que hayas realizado el análisis, interpreta los resultados, depende del fin que le
hayas dado a la extracción y manipulación de estos datos. ¿Qué conclusiones puedes
extraer de tus datos? ¿Cuál es el significado de los patrones o tendencias que has
identificado?
Paso 7: Comunicar resultados
Comunica tus hallazgos a través de informes, gráficos o presentaciones, según sea
necesario. La comunicación efectiva de resultados es crucial en el análisis de datos.
Paso 8: Automatización (Opcional)

Si tu análisis es un proceso recurrente, puedes considerar la automatización. Crea scripts o


programas que realicen análisis similares en nuevos datos.

Por ejemplo:

import pandas as pd

# Cargar los datos desde el archivo CSV

data = pd.read_csv('datos.csv')

# Calcular el total de ventas

total_ventas = data['Ventas'].sum()

# Generar un informe

informe = f"Resumen de Ventas:\nTotal de Ventas:


${total_ventas:.2f}"

# Guardar el informe en un archivo

with open('informe_ventas.txt', 'w') as archivo:

archivo.write(informe)

print("Proceso de análisis y generación de informe


completado.")

En este script:
• Importamos la biblioteca Pandas para manejar los datos desde el archivo CSV.
• Cargamos los datos desde datos.csv en un DataFrame de Pandas.
• Calculamos el total de ventas sumando la columna "Ventas".
• Generamos un informe con el total de ventas.
• Guardamos el informe en un archivo llamado informe_ventas.txt.
• Imprimimos un mensaje para indicar que el proceso ha sido completado.

Capítulo 11: Buenas prácticas y


consejos
Estilo de codificación (PEP 8)

PEP 8 es el documento de estilo de codificación de Python, que define las


recomendaciones y normas para escribir código Python legible. Aquí algunos aspectos
clave:
• Indentación: Usa 4 espacios para la sangría.
• Longitud de línea: Líneas de código de hasta 79 caracteres.
• Espacios en blanco: Usa espacios en blanco con moderación, y no mezcles
espacios y tabuladores.
• Nombres de variables y funciones: Utiliza nombres descriptivos en minúsculas
con subrayados.
• Comentarios: Usa comentarios concisos y descriptivos.
• Documentación: Incluye docstrings en tus funciones y clases.

Un ejemplo de cómo no se debería hacer:

def Calc_Prom(datos):

suma = 0

cant = 0

for x in datos:

suma += x

cant += 1

prom = suma / cant

return prom

numeros = [10, 20, 30, 40, 50]

res = Calc_Prom(numeros)

print(f"Promedio: {res}")

En este ejemplo, se incumplen varias recomendaciones de PEP 8:


• Indentación incorrecta: Se utilizan tabuladores en lugar de espacios para la
sangría.

• Longitud de línea excesiva: Las líneas de código son largas y difíciles de leer.

• Nombres de variables y funciones no descriptivos: Los nombres de variables


como "cant" y "prom" no son descriptivos y no siguen la convención de
minúsculas con subrayados.

• Falta de comentarios (#comentario explica funcion) y docstrings (“””): No


hay docstrings que expliquen la función y no hay comentarios descriptivos.

Ejemplo que cumple con las recomendaciones:


# Longitud de línea: Líneas de código de hasta 79 caracteres.

# Es importante que las líneas de código no sean demasiado largas, para que
sean fácilmente legibles.

def calcular_promedio(datos):

"""

Documentación: Incluye docstrings en tus funciones y clases.

Esta función toma una lista de números y calcula su promedio.

Args:

datos (list): Una lista de números.

Returns:

float: El promedio de los números en la lista.

"""

# Indentación: Usa 4 espacios para la sangría.

suma = 0

cantidad = 0

# Espacios en blanco: Usa espacios en blanco con moderación.

for numero in datos:

suma += numero

cantidad += 1

# Nombres de variables y funciones: Utiliza nombres descriptivos en


minúsculas con subrayados.

promedio = suma / cantidad

return promedio

# Comentarios: Usa comentarios concisos y descriptivos.

numeros = [10, 20, 30, 40, 50] # Una lista de números.

resultado = calcular_promedio(numeros)

print(f"El promedio de los números es: {resultado}")

En este ejemplo, se siguen las recomendaciones de PEP 8. La indentación usa 4 espacios,


la longitud de línea es inferior a 79 caracteres, se utilizan nombres de variables y
funciones descriptivos en minúsculas con subrayados, se incluyen docstrings para
documentar la función y se utilizan comentarios descriptivos para explicar el código.

Prueba tu código

Las pruebas unitarias son esenciales para garantizar que tu código funcione como se
espera y para detectar errores temprano. Python proporciona el módulo unittest para
escribir tus pruebas de codigo.
• Repl.it: Repl.it es una plataforma en línea que te permite escribir, ejecutar y
compartir código en varios lenguajes de programación, incluido Python. No
necesitas instalar nada, simplemente visitas el sitio web y comienzas a escribir tu
código en el navegador. Ofrece un entorno de desarrollo integrado (IDE) que
facilita la programación y la ejecución de código Python. Puedes acceder a Repl.it
en https://replit.com/.

• PythonAnywhere: PythonAnywhere es una plataforma en línea que se centra en


la ejecución de código Python en la nube. Ofrece un entorno completo para
programar en Python, ejecutar scripts y aplicaciones web. Además, proporciona
una consola interactiva en línea para probar y depurar código. Puedes encontrar
PythonAnywhere en https://www.pythonanywhere.com/.

También existen bibliotecas como pytest que hacen que escribir y ejecutar pruebas sea
más sencillo.
Escribir pruebas unitarias te permite verificar que las partes individuales de tu código
funcionen correctamente y ayuda a mantener la calidad del software.

Control de Versiones (Git)

El control de versiones es fundamental para rastrear cambios en tu código y colaborar


con otros desarrolladores. Git es uno de los sistemas de control de versiones más
populares y ampliamente utilizados. Aprender a usar Git te permite realizar un
seguimiento de las modificaciones de tu código, colaborar con otros programadores y
deshacer cambios si es necesario.
Como Git tiene algunos términos nuevos a entonces explicaremos los principales para
evitar confusiones:

• Rama principal ("Master" o "Main"): La rama principal es la línea de desarrollo


principal en un repositorio de Git. Es la rama predeterminada que se crea cuando
se inicia un nuevo proyecto. En muchos proyectos, esta rama se llama "master" o
"main." Representa la versión estable y desplegable del código.

• Rama: Una rama es una bifurcación separada de la rama principal, que permite a
los desarrolladores trabajar en características, correcciones de errores o mejoras
sin afectar la rama principal. Cada rama tiene su propia copia del código y el
historial de cambios.

• Crear una rama: Puedes crear una nueva rama a partir de la rama principal o
cualquier otra rama existente. Por ejemplo, si deseas trabajar en una nueva
característica, puedes crear una rama específica para esa característica.

• Commit: Un "commit" es un registro de un conjunto de cambios en el


repositorio. Cada vez que realizas un commit, se crea un nuevo punto en la línea
de tiempo de la rama, lo que representa un conjunto de cambios específicos.

• Cambiar de Rama: Puedes cambiar entre diferentes ramas en Git para trabajar
en ellas. El comando "git checkout" te permite cambiar de una rama a otra.

• Fusión (merge): La fusión es el proceso de combinar los cambios realizados en


una rama en otra rama. Por ejemplo, puedes fusionar los cambios de una rama de
características en la rama principal una vez que la característica esté completa.

• Resolución de conflictos: Cuando dos ramas contienen cambios conflictivos en


la misma parte del código, se produce un conflicto. Debes resolver estos
conflictos manualmente para completar la fusión.

• Etiquetas (Tags): Las etiquetas son punteros estáticos a puntos específicos en la


línea de tiempo del proyecto, generalmente usados para marcar versiones
importantes o lanzamientos.

• Repositorio remoto: Un repositorio remoto es una copia de tu proyecto de Git


alojada en un servidor en línea (como GitHub, GitLab o Bitbucket). Los
desarrolladores pueden colaborar en el mismo proyecto compartiendo cambios
entre repositorios remotos y locales.

• Clonar un repositorio: Clonar un repositorio significa crear una copia local del
repositorio remoto en tu propia máquina para poder trabajar en él.

• Área de preparación: Es un concepto clave en Git, un sistema de control de


versiones distribuido. También se le conoce como "índice" o "staging area." Esta
área es esencial para organizar y gestionar los cambios que realizarás en tu
repositorio antes de confirmarlos definitivamente. Te permite seleccionar qué
modificaciones de tus archivos deseas incluir en el próximo "commit" o
confirmación de cambios.
Paso 1: Instalar Git
Si aún no tienes Git instalado, necesitas descargarlo e instalarlo en tu computadora.
Puedes hacerlo siguiendo las instrucciones en el sitio web oficial de Git: https://git-
scm.com/.
Paso 2: Configurar Git
Después de instalar Git, es importante configurar tu nombre de usuario y dirección de
correo electrónico. Abre la terminal y ejecuta los siguientes comandos, reemplazando
"Tu Nombre" y "tu@email.com" con tus propios datos:

git config --global user.name "Tu Nombre"

git config --global user.email tu@email.com

Esto establece tu identidad en Git y será utilizado en cada confirmación que hagas.
Paso 3: Iniciar un Repositorio Local
Para empezar a rastrear un proyecto con Git, dirígete al directorio de tu proyecto en la
terminal y ejecuta el siguiente comando para inicializar un repositorio Git local:

git init

Paso 4: Agregar y Confirmar Cambios


Una vez que tienes un repositorio Git, puedes comenzar a trabajar en tu proyecto y
realizar confirmaciones (commits) para rastrear tus cambios. Aquí hay algunos
comandos útiles:
Agregar archivos al área de preparación (staging area) antes de confirmarlos:

git add nombre_del_archivo


o git add . (si se trata de una carpeta)

Paso 5: Confirmar (commit) tus cambios:


• Cuando hayas realizado cambios en tus archivos y estés listo para registrar una
nueva versión de tu proyecto, utiliza el comando git commit. Debes
proporcionar un mensaje descriptivo que explique los cambios realizados. Por
ejemplo:
git commit -m "Añadida la funcionalidad de registro de usuarios."

Bien, esa sería la parte del registro y guardado de la nueva rama, ahora aprenderas a como modificar
y rabajar sobre las ramas:

Ver historial de versiones:

• Puedes utilizar el comando git log para ver el historial de versiones de tu


proyecto, que mostrará todos los commits que has realizado.

• Trabajar en una rama (branch):


• Git permite trabajar en ramas para desarrollar nuevas características sin afectar
la rama principal (generalmente llamada "master" o "main"). Puedes crear una
nueva rama con:

git branch nombre-de-la-rama

• Luego, puedes cambiar a esa rama con:

git checkout nombre-de-la-rama

• Fusionar ramas:
• Cuando hayas completado tu trabajo en una rama y estés listo para incorporarlo
a la rama principal, puedes fusionar (merge) la rama en la principal. Esto se hace
con:

git merge nombre-de-la-rama

• Subir cambios a un repositorio remoto:

Si estás trabajando en colaboración con otros desarrolladores o deseas realizar copias


de seguridad de tu repositorio, puedes subir tus cambios a un repositorio remoto en
servicios como GitHub o GitLab. Esto se hace utilizando el comando git push.

• Descargar cambios desde un repositorio remoto:

Si otros desarrolladores han realizado cambios en el repositorio remoto, puedes


descargar (pull) esos cambios a tu repositorio local utilizando el comando git pull.

• Etiquetar versiones (tags):


Puedes etiquetar versiones importantes de tu proyecto con comandos como git tag.
Esto facilita la referencia a versiones específicas en el futuro.

Ten en cuenta que estos softwares se utilizan en casos en los que el proyecto es más
grande y se requiere un grupo y una mayor organización para el proyecto en cuestión.

Capítulo 12: Recursos Adicionales y


Avanzados:
Paralelismo y Concurrencia:
• Paralelismo vs. Concurrencia:
• Explicación: En programación, paralelismo se refiere a la ejecución simultánea
de tareas, mientras que concurrencia implica la gestión de múltiples tareas en un
intervalo de tiempo.
• Ejemplo: Supongamos que tienes que lavar platos y cocinar al mismo tiempo. Si
delegas una tarea mientras haces la otra, es concurrencia. Si puedes hacer ambas
tareas al mismo tiempo, es paralelismo.
• Multiprocesamiento en Python:
• Uso de multiprocessing:
• Explicación: La librería multiprocessing de Python permite ejecutar procesos
simultáneamente, aprovechando múltiples núcleos de CPU.
• Ejemplo:

from multiprocessing import Process

def tarea():

print("Realizando tarea...")

if __name__ == "__main__":

proceso = Process(target=tarea)

proceso.start()

proceso.join()

• Hilos en Python:
• Uso de threading:
• Explicación: threading es una librería que facilita la concurrencia a través de
hilos en Python.
• Ejemplo:
import threading

def tarea():

print("Realizando tarea...")

hilo = threading.Thread(target=tarea)

hilo.start()

hilo.join()

• Problemas Comunes y Soluciones:


• Identificación y Resolución:
• Explicación: Problemas como condiciones de carrera pueden surgir en
concurrencia. Se resuelven utilizando técnicas de sincronización como bloqueos
(Lock).
• Ejemplo:

import threading

contador = 0

bloqueo = threading.Lock()

def incrementar():

global contador

with bloqueo:

contador += 1

for _ in range(10):

threading.Thread(target=incrementar).start()

print(contador)

Creación de GUIs con Tkinter o PyQt:


• Introducción a Tkinter y PyQt:
• Descripción General:
• Explicación: Tkinter es una librería estándar de Python para construir
interfaces gráficas. PyQt es una librería externa con características avanzadas.
• Ejemplo: Mostrar una ventana simple con ambos.
• Instalación y Configuración:
• Guía Paso a Paso:
• Explicación: Instalación de Tkinter y PyQt.
• Ejemplo:
• Instalar Tkinter: pip install tk
• Instalar PyQt: pip install PyQt5
• Diseño de Interfaz Gráfica con Tkinter:
• Creación de Elementos:
• Explicación: Tkinter permite la creación de ventanas, botones, cuadros de texto,
etiquetas, y más.
• Ejemplo: Creación de una ventana básica y un botón.
import tkinter as tk

def saludar():

etiqueta.config(text="Hola, " + entrada.get())

ventana = tk.Tk()

entrada = tk.Entry(ventana)

boton = tk.Button(ventana, text="Saludar", command=saludar)

etiqueta = tk.Label(ventana, text="")

entrada.pack()

boton.pack()

etiqueta.pack()

ventana.mainloop()

• Visualización de Datos con Matplotlib:


• Gráficos Interactivos:
• Explicación: Matplotlib es una librería para crear gráficos en 2D y 3D. Se puede
integrar con Tkinter para visualizaciones interactivas.
• Ejemplo: Crear un gráfico de líneas interactivo.
import tkinter as tk

from matplotlib.figure import Figure

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def graficar():

datos = [1, 2, 3, 4, 5]

figura.clear()

ax = figura.add_subplot(1, 1, 1)

ax.plot(datos)

lienzo.draw()

ventana = tk.Tk()

figura = Figure(figsize=(5, 4), dpi=100)

lienzo = FigureCanvasTkAgg(figura, master=ventana)

lienzo.get_tk_widget().pack()

boton_graficar = tk.Button(ventana, text="Graficar", command=graficar)

boton_graficar.pack()

ventana.mainloop()

• Machine Learning con Python (scikit-learn, TensorFlow):


• Introducción al Machine Learning:
• Conceptos Básicos:
• Explicación: Machine Learning implica enseñar a una máquina a realizar tareas
sin programación explícita. Aprendizaje supervisado para predecir etiquetas y
no supervisado para patrones.
• Ejemplo: Clasificación supervisada de imágenes de gatos y perros.
• Bibliotecas Populares en Python:
• scikit-learn y TensorFlow:
• Explicación: scikit-learn es ideal para tareas clásicas de machine learning.
TensorFlow es una librería de código abierto para aprendizaje automático y
redes neuronales.
• Ejemplo: Clasificación de flores Iris con scikit-learn.
• Ejemplos Prácticos:
• Aplicaciones Concretas:
• Explicación: Aplicación de machine learning en proyectos prácticos como
reconocimiento de voz con TensorFlow.
• Ejemplo:
from sklearn import datasets

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier

# Cargar el conjunto de datos

iris = datasets.load_iris()

datos_entrenamiento, datos_prueba, etiquetas_entrenamiento, etiquetas_prueba


= train_test_split(

iris.data, iris.target, test_size=0.2)

# Crear un clasificador k-NN

clasificador = KNeighborsClassifier(n_neighbors=3)

# Entrenar el clasificador

clasificador.fit(datos_entrenamiento, etiquetas_entrenamiento)

# Hacer predicciones

predicciones = clasificador.predict(datos_prueba)

Recursos para Aprender Más:
• Referencias y Tutoriales:
• Explicación: Dónde encontrar más información y recursos educativos sobre
estos temas.
• Ejemplo:
• Documentación de Multiprocessing en Python
• Tutorial de Tkinter
• Recursos de Machine Learning con TensorFlow

Capítulo 13: Practica constante


En este último capítulo tendrás distintas secciones de autoevaluación y proyectos para
ponerte a prueba en las distintas dificultades:
Nivel Fácil:
• Calculadora simple: Crea una calculadora que realice operaciones básicas, como
suma, resta, multiplicación y división.
• Lista de tareas: Desarrolla una aplicación de lista de tareas que permita al
usuario agregar, eliminar y marcar tareas como completadas.
• Generador de contraseñas: Crea un programa que genere contraseñas seguras
con diferentes requisitos, como longitud y caracteres especiales.
• Conversor de unidades: Desarrolla un conversor que convierta entre diferentes
unidades, como de Celsius a Fahrenheit o de kilómetros a millas.
• Juego de adivinanza: Crea un juego en el que la computadora elija un número
aleatorio y el usuario intente adivinarlo.

Nivel Medio:
• Registro de gastos: Desarrolla una aplicación que permita al usuario registrar sus
gastos diarios y genere informes mensuales.
• Aplicación de libreta de direcciones: Crea una libreta de direcciones que permita
al usuario agregar, editar y eliminar contactos.
• Administrador de contraseñas: Diseña un administrador de contraseñas que
almacene de forma segura las contraseñas y permita su recuperación.
• Sistema de registro y autenticación: Crea un sistema de registro y autenticación
de usuarios para tu aplicación.
• Juego de Blackjack: Desarrolla un juego de Blackjack en el que el usuario juegue
contra la computadora.

Nivel Difícil:
• Aplicación de blog: Crea una aplicación de blog que permita a los usuarios
escribir, editar y eliminar publicaciones.
• Clon de Twitter: Diseña una versión simplificada de la red social Twitter con
perfiles de usuarios y publicaciones.
• Editor de imágenes: Desarrolla un editor de imágenes con funciones como
recorte, rotación y filtros.
• Aplicación de pronóstico del tiempo: Crea una aplicación que muestre el
pronóstico del tiempo actual y futuro para una ubicación específica.
• Juego de ajedrez: Desarrolla un juego de ajedrez que permita a dos jugadores
enfrentarse en línea.

Autoevaluación:
Conceptos Básicos de Python:
• ¿Qué es Python y por qué es un lenguaje de programación popular?
• ¿Cuál es la diferencia entre una variable y una constante en Python?
• Explica la diferencia entre una lista y una tupla en Python.
Estructuras de Control y Bucles:
• Describe cómo funciona una declaración "if" en Python. Proporciona un ejemplo.
• ¿Cuál es la función de un bucle "for" en Python? Proporciona un ejemplo de uso.
• Explica la diferencia entre "break" y "continue" en un bucle.
Funciones y Módulos:
• ¿Qué es una función en Python y por qué son útiles?
• ¿Qué es un módulo en Python y cómo puedes usarlo en tus programas?
• ¿Cuál es la diferencia entre una variable local y una variable global en Python?
Estructuras de Datos:
• Enumera algunos tipos de estructuras de datos en Python y proporciona
ejemplos de uso.
• ¿Qué es la comprensión de listas y cómo se usa en Python?
• Explica la diferencia entre una lista y un diccionario en Python.

Respuestas:

Conceptos Básicos de Python:


• Python es un lenguaje de programación de alto nivel que es ampliamente
utilizado en desarrollo web, ciencia de datos, automatización y más. Es popular
debido a su sintaxis clara y legible, su amplia biblioteca estándar y su comunidad
activa.
• En Python, una variable puede cambiar su valor durante la ejecución del
programa, mientras que una constante es un valor que no cambia durante la
ejecución. Aunque Python no tiene constantes reales, se suelen utilizar nombres
en mayúsculas para indicar que una variable se considera constante.
• Una lista es una estructura de datos que almacena una colección ordenada de
elementos, y los elementos pueden cambiar. Una tupla es similar a una lista, pero
sus elementos son inmutables, es decir, no pueden cambiar una vez que se
definen.
Estructuras de Control y Bucles:
• Una declaración "if" en Python se utiliza para tomar decisiones en un programa.
Si se cumple una condición, se ejecuta un bloque de código. Ejemplo:

if edad >= 18:

print("Eres mayor de edad.")


• Un bucle "for" en Python se utiliza para iterar sobre una secuencia (como una
lista, tupla o cadena) y ejecutar un bloque de código para cada elemento en la
secuencia. Ejemplo:

for numero in [1, 2, 3, 4, 5]:

print(numero)

• "break" se usa para salir de un bucle prematuramente, mientras que "continue"


se utiliza para saltar a la siguiente iteración de un bucle sin ejecutar el código
restante en la iteración actual.
Funciones y Módulos:
• Una función en Python es un bloque de código reutilizable que realiza una tarea
específica. Son útiles para dividir un programa en partes más pequeñas y
comprensibles. Se definen usando la palabra clave "def".
• Un módulo en Python es un archivo que contiene funciones, variables y clases
que pueden ser reutilizadas en otros programas. Se pueden importar utilizando
"import".
• Una variable local es una variable definida dentro de una función y solo es
accesible dentro de esa función. Una variable global es una variable definida
fuera de cualquier función y es accesible en todo el programa.
Estructuras de Datos:
• Algunos tipos de estructuras de datos en Python incluyen listas, tuplas,
diccionarios, conjuntos y cadenas. Ejemplos de uso se proporcionaron en las
respuestas anteriores.
• La comprensión de listas es una forma concisa de crear listas en Python
utilizando una sola línea de código. Permite la generación de listas basadas en
iteraciones y condiciones. Ejemplo:

numeros = [1, 2, 3, 4, 5]

cuadrados = [x**2 for x in numeros]

• Una lista es una colección ordenada de elementos, mientras que un diccionario


es una colección de pares clave-valor. Los elementos de una lista se acceden por
índices numéricos, mientras que los elementos de un diccionario se acceden por
claves únicas.

Con esto, cierramos este libro. Espero que hayas disfrutado explorando el mundo de la
programación en Python y que hayas adquirido valiosas habilidades a lo largo de este
viaje. Recuerda que la programación es un arte en constante evolución, y este libro es solo
el comienzo de tu viaje. Sigue explorando, sigue aprendiendo y, lo más importante, sigue
programando. El mundo digital está lleno de posibilidades emocionantes, y ahora tienes
las herramientas para aprovecharlas al máximo. Gracias por acompañarme en este viaje y
te deseo mucho éxito en tus futuros proyectos. ¡Adiós y hasta la próxima aventura en el
mundo de Python!

También podría gustarte