Skip to content

Latest commit

 

History

History
261 lines (207 loc) · 10.3 KB

File metadata and controls

261 lines (207 loc) · 10.3 KB

Introducción al curso

Martial artists do not all agree about the best martial art, or the best technique within a martial art. Often, martial artist will form their own schools of thought and gather students to learn from them [...].

[...]

None of these different schools is absolutely right. Yet within a particular school we act as though the teachings and techniques are right. [...] But this rightness within a school does not invalidate the teachings of a different school.

Robert C. Martin (Uncle Bob) from Clean Code

Bienvenidos a la primera edición del Máster de Programación con Python de la escuela Fictizia.

"Programar y desarrollar software" es como "saber escribir y ser redactor": sin duda la primera habilidad es básica para la segunda, pero la segunda suele integrar una metodología que aporta ciertas garantías al texto producido. Con la primera entrenas la técnica y con la segunda, las estrategias para una ejecución eficaz y duradera.

Programar consiste en automatizar tareas mientras que el desarrollo de software guía estos esfuerzos para hacer del código fuente un artefacto duradero, mantenible y fácil de cambiar.

El objetivo de este curso es enseñar programación en Python, desde la óptica del desarrollo de software, intentando en todo momento producir código legible y mantenible.

Python

Del Zen de Python:

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than right now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

Python es un lenguaje de programación creado en a comienzos de los 90 por Guido van Rossum. Es un sucesor del lenguage ABC, del que toma la sintáxis de anidamiento basada en el sangrado del código fuente, entre otras características. Además, a lo largo de su historia, Python ha influenciado a otros lenguajes muy populares como JavaScript, Ruby, Go o Kotlin. Entre las compañías que utilizan Python, se encuentran: Instagram, Uber, Spotify, Dropbox, Netflix...

Python es también una referencia y existen diversas implementaciones siendo CPython la implementación de referencia, hecha en C. Existen implementaciones en .Net y Java pero se quedaron estancadas en Python 2. La implementación alternativa más prometedora es PyPy, enfocada en velocidad y escrita en RPython.

Python es un lenguaje fuertemente y dinámicamente tipado, multiparadigma y con sólidos modelos de ejecución y memoria. Su librería estándar es una de las más completas incluyendo sistemas de logging, bibliotecas de red, un frameworks de testing, herramientas de empaquetado y distribución, virtualización de entornos, etc.

La comunidad de Python se organiza alrededor de la Python Software Foundation. En España existe la asociación Python España que facilita las organización de los esfuerzos relacionados con Python dentro del territorio.

Python evoluciona gracias a las "proposiciones de mejoras de Python" o PEP (Python Enhancement Proposal), en inglés. Los PEP se definen en el PEP1 y se listan en el PEP0. A verces los PEP no son implementables como características del lenguaje sino que recogen recomendaciones.

Python se encuentra en su versión 3.7.2 y los planes de cada versión se detallan en PEPs. El plan para la publicación de Python 3.8 se encuentra en el PEP569.

Las librerías de Python se organizan en torno al Python Package Index, que es un repositorio de paquetes instalables en los entornos Python. La interfaz de línea de comandos para gestionar paquetes python es pip.

Puedes encontrar más información sobre Python en los siguientes recursos:

Temario

  1. Entorno de trabajo y herramientas

    1. Introducción al curso
    2. La terminal
    3. PyCharm: edición y depuración
    4. Git y GitHub
  2. Pinceladas acerca del desarrollo de software

    1. Interfaces, contratos y APIs
    2. SOLID
    3. Olores del código y refactorización
  3. Características de Python

    1. La jerarquía estándar de tipos
    2. Unicode, cadenas de texto y bytes
    3. Otros tipos ampliamente utilizados
    4. Funciones, closures y decoradores
    5. Sentencias y estructuras de control
    6. Organización del código: paquetes y módulos
    7. Instalación de Python y entornos virtuales
    8. Excepciones y gestión de errores
    9. Manejo de archivos y entrada y salida
    10. Interfaces de línea de comandos
    11. Publicación de software
  4. Tipos personalizados

    1. Clases, atributos y métodos
    2. Herencia y linearización de jerarquías (MRO)
    3. Métodos mágicos y clases base abstractas
    4. Simulación de tipos, y protocolos
  5. Desarrollo de software

    1. Pruebas (testing)
    2. Patrones de diseño
    3. Tipado progresivo
    4. Registro de eventos o logging
    5. El patrón MV* de la mano de Django
    6. Documentación
  6. Otros aspectos de Python

    1. Python al servicio de la ciencia
    2. Python de alto rendimiento
  7. Programación asíncrona

    1. Modelos de asincronía
    2. Asincronía en Python
    3. Caso de uso: publicador/consumidor

Cómo seguir el curso

Este curso contiene documentos escritos en markdown, (uno por tema de cada bloque) en la carpeta teoría. El nombre b01t01.md indica que nos encontramos en el Bloque 1, Tema 1. En el README.md del repositorio encontrarás la planificación clase a clase conforme vayamos avanzando.

La teoría es un guión de clase. Con él deberías ser capaz de reproducir los contenidos de la clase de forma autónoma aunque no es un reemplazo de la misma. En clase ahondaremos en conceptos, exploraremos vías alternativas, contaremos experiencias profesionales y personales y realizaremos ejercicios y ejemplos improvisados que no estarán en el repositorio (al menos a priori).

Los documentos con la teoría suelen incluir recursos al final de cada sección. Aquellos especialmente relevantes están marcados con un asterisco *.

El directorio fuentes contiene el código fuente de los ejercicios y prácticas. No se trata de un módulo de Python, sino de código fuente suelto en distintos estadíos (enunciado, tras el paso 1, ..., solucionado) que usarás durante las prácticas.

El directorio alumni sí es un módulo de Python. Está pensado para que puedas abrir este repositorio como un proyecto de Python o ejecutar un intérprete interactivo y acceder al código; no sólo al tuyo sino también al de tus compañeros, como si fueran bibliotecas de funciones.

Contribuyendo al curso

A lo largo del curso utilizaremos GitHub como herramienta de colaboración y durante el tema dedicado a Git y GitHub veremos cómo utilizar GitHub para colaborar. Baste indicar aquí qué clase de colaboraciones y contribuciones se esperan de tí, como alumno y cuáles caben esperar de mi, como mentor:

Del alumno:

  • Corrección de typos.
  • Sugerencias de mejores textos: más claros, mejor traducidos, más inclusivos...
  • Informe de bugs.
  • Corrección de bugs en su código.
  • Preguntas.
  • Aportación de recursos.

Del mentor:

  • Las mismas que las del alumno.
  • Corrección de bugs en el código del curso.
  • Evaluación e implementación de las propuestas de mejoras en el texto.
  • Respuesta a las preguntas formuladas.

El punto de entrada para colaborar con el curso es el panel issues de GitHub y el de pull requests:

Libros recomendados

Sobre las buenas prácticas

Rules are for the guidance of the wise and the obedience of fools.

Douglas Bader

Awesome Python

Una lista curada de las mejores bibliotecas de Python.