Iniciar prueba gratuita
Searching...
SoBrief
Español
EnglishEnglish
EspañolSpanish
简体中文Chinese
繁體中文Chinese (Traditional)
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Fluent Python

Fluent Python

Clear, Concise, and Effective Programming
por Luciano Ramalho 2015 850 páginas
4.62
1000+ valoraciones
Escuchar
Prueba el acceso completo por 3 días
¡Desbloquea la escucha y mucho más!
Continuar

Ideas clave

1. Decoradores: Mejorando Funciones con Azúcar Sintáctico

Un decorador es un callable que recibe otra función como argumento (la función decorada).

Elegancia sintáctica. Los decoradores ofrecen una forma limpia y legible de modificar o potenciar el comportamiento de las funciones sin alterar su lógica central. Se aplican usando la sintaxis "@", que es básicamente azúcar sintáctico para pasar una función como argumento a otra función. Esto permite técnicas poderosas de metaprogramación, donde se puede añadir funcionalidad como registro de eventos, medición de tiempo o control de acceso a funciones ya existentes.

Momento de ejecución. Un aspecto crucial de los decoradores es que se ejecutan inmediatamente cuando se carga un módulo, típicamente en el momento de la importación. Esto significa que pueden usarse para registrar funciones, modificar atributos de clases o funciones, o realizar otras tareas de configuración antes de que la función decorada sea llamada. Sin embargo, la función decorada en sí solo se ejecuta cuando se invoca explícitamente.

Usos comunes de los decoradores:

  • Registro y depuración
  • Medición de tiempo y análisis de rendimiento
  • Control de acceso y autenticación
  • Caché y memorización
  • Validación de entradas y comprobación de tipos

2. Clousures: Capturando y Preservando Estado en Funciones Anidadas

Un closure es una función que retiene las vinculaciones de las variables libres que existen cuando la función se define, para que puedan usarse más tarde cuando la función se invoque y el ámbito definitorio ya no esté disponible.

Preservando el contexto. Los closures son una característica poderosa en Python que permiten a las funciones internas capturar y recordar el estado de variables en su ámbito externo, incluso después de que la función externa haya terminado de ejecutarse. Esto posibilita la creación de fábricas de funciones y la implementación de ocultamiento de datos y encapsulación sin necesidad de usar clases.

Aplicaciones prácticas. Los closures son fundamentales en muchos patrones de programación en Python, incluyendo decoradores, callbacks y ciertas técnicas de programación funcional. Proporcionan una forma de crear funciones con "memoria", lo cual es especialmente útil para mantener estado entre llamadas o para crear funciones especializadas basadas en parámetros en tiempo de ejecución.

Puntos clave sobre los closures:

  • "Cierran" sobre variables en su ámbito léxico
  • Las variables encerradas se almacenan en el atributo closure de la función
  • Permiten la aplicación parcial de funciones y currying
  • Son la base de muchas características avanzadas y patrones de diseño en Python

3. Reglas de Ámbito de Variables: Entendiendo Variables Locales, Globales y Nonlocal

Si existe una declaración nonlocal x, x proviene y se asigna a la variable local x de la función envolvente más cercana donde x está definida.

Jerarquía de ámbitos. Las reglas de ámbito de variables en Python definen cómo se buscan los nombres en funciones anidadas. Comprender estas reglas es crucial para escribir código correcto y eficiente, especialmente al trabajar con closures y decoradores. El orden de búsqueda va desde el ámbito local, pasando por funciones envolventes, luego global y finalmente el ámbito incorporado.

La palabra clave nonlocal. Introducida en Python 3, nonlocal permite que las funciones internas asignen a variables en su ámbito envolvente. Esto es especialmente importante para closures que necesitan modificar el estado capturado de su ámbito externo. Sin nonlocal, intentar asignar a una variable del ámbito externo crearía una nueva variable local, lo que podría causar comportamientos inesperados.

Reglas de ámbito de variables en Python:

  1. Ámbito local (función)
  2. Funciones envolventes (nonlocal)
  3. Ámbito global (módulo)
  4. Ámbito incorporado (nombres incorporados de Python)
  • La palabra clave global se usa para indicar que un nombre se refiere a una variable global
  • nonlocal se usa para variables en ámbitos envolventes (pero no globales)

4. Implementando Decoradores: De Simples a Parametrizados

Para aceptar parámetros, el nuevo decorador register debe ser llamado como una función.

Funciones anidadas. Implementar decoradores generalmente implica definiciones de funciones anidadas. La función más externa (el decorador en sí) recibe como argumento la función a decorar. Luego define y devuelve una función interna que envuelve la función original, añadiendo la funcionalidad deseada.

Decoradores parametrizados. Para crear decoradores que acepten argumentos, es necesario añadir otra capa de anidamiento. La función más externa se convierte en una fábrica de decoradores que recibe los parámetros y devuelve el decorador real. Esto permite decoradores más flexibles y configurables, aunque también aumenta la complejidad.

Estructura de un decorador básico:

  1. Función decoradora (recibe la función a decorar)
  2. Función envolvente (añade funcionalidad y llama a la función original)

Estructura de un decorador parametrizado:

  1. Fábrica de decoradores (recibe parámetros del decorador)
  2. Función decoradora (recibe la función a decorar)
  3. Función envolvente (añade funcionalidad y llama a la función original)

5. Decoradores de la Biblioteca Estándar: Aprovechando Herramientas Integradas

functools.cache fue añadido en Python 3.9. Si necesitas ejecutar estos ejemplos en Python 3.8, reemplaza @cache por @lru_cache.

Soluciones listas para usar. La biblioteca estándar de Python ofrece varios decoradores potentes que resuelven problemas comunes de programación. Entre ellos están property para crear atributos gestionados, classmethod y staticmethod para modificar el comportamiento de métodos, y diversas herramientas en el módulo functools para optimización y manipulación de funciones.

Decoradores para optimización. El módulo functools ofrece decoradores especialmente útiles para optimizar el rendimiento. El decorador @cache (y su predecesor @lru_cache) proporciona memorización, almacenando resultados de funciones para evitar cálculos repetidos. El decorador @singledispatch permite crear funciones genéricas cuyo comportamiento varía según el tipo del primer argumento.

Decoradores clave de la biblioteca estándar:

  • @property: Crear atributos gestionados
  • @classmethod: Definir métodos que operan sobre la clase, no sobre instancias
  • @staticmethod: Definir métodos que no necesitan acceso a la clase ni a la instancia
  • @functools.cache: Memorización de resultados de funciones
  • @functools.lru_cache: Memorización con caché de tamaño limitado
  • @functools.singledispatch: Crear funciones con despacho basado en tipos

6. Funciones Genéricas con Despacho Simple: Polimorfismo en Python

La ventaja de @singledispatch es que soporta extensión modular: cada módulo puede registrar una función especializada para cada tipo que soporte.

Despacho basado en tipos. El decorador @singledispatch ofrece una forma de crear funciones que se comportan de manera diferente según el tipo de su primer argumento. Esto habilita una forma de sobrecarga de funciones o polimorfismo ad hoc en Python, muy útil cuando se necesitan operaciones que varían según los tipos.

Extensibilidad. Uno de los beneficios clave de @singledispatch es que permite código modular y extensible. Se pueden registrar nuevas implementaciones específicas para tipos en cualquier momento, incluso para tipos definidos en librerías externas. Esto facilita adaptar y ampliar funcionalidades sin modificar el código original.

Beneficios de @singledispatch:

  • Permite despacho de funciones basado en tipos
  • Facilita la extensión con nuevos tipos
  • Soporta registro de implementaciones para clases base abstractas
  • Mantiene una estructura de código limpia y modular

Patrón de uso:

  1. Decorar la función base con @singledispatch
  2. Registrar implementaciones específicas con @funcion_base.register(tipo)

7. Memorización y Caché: Optimizando el Rendimiento de Funciones

functools.cache implementa memorización: una técnica de optimización que funciona guardando los resultados de invocaciones previas de una función costosa, evitando cálculos repetidos con argumentos ya usados.

Impulso al rendimiento. La memorización es una técnica poderosa que puede mejorar dramáticamente el rendimiento de funciones con cálculos costosos, especialmente cuando se llaman repetidamente con los mismos argumentos. Los decoradores @functools.cache y @functools.lru_cache ofrecen implementaciones fáciles de usar de esta técnica.

Compensaciones. Aunque la caché puede proporcionar mejoras significativas en velocidad, implica un costo en uso de memoria. El decorador @cache almacena todos los resultados indefinidamente, lo que puede llevar a un alto consumo de memoria en procesos de larga duración. @lru_cache ofrece más control con su parámetro maxsize, permitiendo limitar el tamaño de la caché y eliminar automáticamente las entradas menos usadas.

Cuándo usar memorización:

  • Funciones con cálculos costosos
  • Funciones puras (mismo input siempre produce mismo output)
  • Funciones llamadas repetidamente con los mismos argumentos

Consideraciones:

  • Uso de memoria vs. tiempo de cálculo
  • Tamaño de caché y políticas de eliminación (@lru_cache)
  • Seguridad en entornos concurrentes

8. El Arte del Tipado Gradual: Equilibrando Flexibilidad y Seguridad

Las anotaciones de tipo son opcionales en todos los niveles: puedes tener paquetes enteros sin anotaciones, silenciar el verificador de tipos al importar esos paquetes en módulos con anotaciones, y añadir comentarios especiales para que el verificador ignore líneas específicas.

Herramientas mejoradas. El sistema de tipado gradual de Python, introducido con PEP 484, permite a los desarrolladores añadir anotaciones de tipo de forma incremental. Estas anotaciones son usadas por verificadores estáticos y entornos de desarrollo para detectar errores temprano y mejorar la autocompletación y refactorización. Sin embargo, no afectan el comportamiento en tiempo de ejecución.

Flexibilidad preservada. La naturaleza gradual del sistema de tipos de Python permite añadir anotaciones donde aporten más valor, sin obligar a anotar todo el código. Esto mantiene la flexibilidad y facilidad de uso de Python, mientras se incrementa la seguridad y soporte de herramientas en áreas críticas o complejas.

Beneficios del tipado gradual:

  • Detectar errores más temprano en el desarrollo
  • Mejorar la legibilidad y auto-documentación del código
  • Facilitar mejor soporte en IDEs y herramientas
  • Hacer más sencilla la refactorización y mantenimiento

Retos y consideraciones:

  • Curva de aprendizaje para la sintaxis y conceptos de tipos
  • Riesgo de complicar scripts simples
  • Necesidad de balancear flexibilidad y rigor
  • Compatibilidad con librerías externas

Última actualización:

Report Issue

Resumen de reseñas

4.62 de 5
Promedio de 1000+ valoraciones de Goodreads y Amazon.

Fluent Python ha recibido críticas abrumadoramente positivas, elogiado por su cobertura profunda de temas avanzados de Python. Los lectores valoran sus explicaciones claras, ejemplos prácticos y las perspectivas que ofrece sobre la filosofía de diseño de Python. Muchos lo consideran imprescindible para programadores de nivel intermedio a avanzado que desean profundizar en el conocimiento del lenguaje. El libro destaca por su enfoque integral, abordando temas como modelos de datos, concurrencia y metaprogramación. Aunque algunos lo encontraron desafiante, la mayoría coincide en que es un recurso valioso para dominar las complejidades de Python y escribir código idiomático.

Your rating:
4.71
234 valoraciones
Want to read the full book?

Preguntas frecuentes

What's Fluent Python about?

  • Comprehensive Guide: Fluent Python by Luciano Ramalho is a deep dive into Python programming, focusing on writing clear, concise, and effective code.
  • Advanced Topics: It covers advanced features such as data models, decorators, generators, and concurrency, making it suitable for experienced developers.
  • Practical Approach: The book includes practical examples and exercises to help readers apply Python's features effectively in real-world scenarios.

Why should I read Fluent Python?

  • Enhance Your Skills: Reading Fluent Python will help you become a more proficient Python programmer by exposing you to advanced concepts and best practices.
  • Idiomatic Python: The book teaches you how to write Pythonic code, which is not only efficient but also easier to read and maintain.
  • Real-World Applications: The examples and exercises are designed to reflect real-world programming challenges, making the learning experience relevant and applicable.

What are the key takeaways of Fluent Python?

  • Understanding Python's Data Model: A major takeaway is the importance of understanding Python's data model, which underpins how objects and classes work.
  • Emphasis on Functions: The book highlights the significance of first-class functions and higher-order functions, which allow for more flexible and reusable code.
  • Asynchronous Programming: It covers asynchronous programming in detail, explaining how to write concurrent code using the asyncio library.

What are the best quotes from Fluent Python and what do they mean?

  • "Python is an easy to learn, powerful programming language.": This quote highlights Python's accessibility for beginners while emphasizing its robustness for experienced developers.
  • "Premature abstraction is as bad as premature optimization.": This warns against overcomplicating code before necessary, encouraging clear and functional code first.
  • "Knowing what is ready to use can save you from reinventing the wheel.": This underscores the importance of utilizing Python's extensive standard library and built-in features.

How does Fluent Python explain the Python Data Model?

  • Core Concept: The Python Data Model is a framework that formalizes the interfaces of Python's building blocks, such as sequences, functions, and classes.
  • Special Methods: It includes special methods (often called "dunder" methods) that allow objects to interact with Python's syntax and built-in functions.
  • Consistency in Behavior: By adhering to the data model, programmers can ensure that their custom objects behave consistently with Python's built-in types.

What is the significance of decorators in Fluent Python?

  • Decorator Basics: Decorators are functions that modify the behavior of other functions or methods, applied using the @decorator syntax.
  • Closure and Scope: Understanding closures is crucial for decorators, as they often need to access variables from their enclosing scope.
  • Practical Examples: The book provides practical examples of decorators, including how to create parameterized decorators that accept arguments.

How does Fluent Python address asynchronous programming?

  • Asyncio Library: The book provides a comprehensive overview of the asyncio library, essential for writing concurrent code in Python.
  • Async/Await Syntax: It introduces the async/await syntax, explaining how it simplifies writing asynchronous code and improves readability.
  • Practical Examples: Readers are provided with practical examples of using asyncio to handle I/O-bound tasks efficiently.

What are generators and how are they used in Fluent Python?

  • Definition of Generators: Generators are a type of iterable, defined using functions that yield values instead of returning them, allowing for lazy evaluation.
  • Memory Efficiency: They are memory efficient because they generate items on-the-fly and do not require the entire dataset to be stored in memory.
  • Use Cases: The book illustrates various use cases for generators, including data processing pipelines and asynchronous programming.

How does Fluent Python explain the use of type hints?

  • Gradual Typing: The book introduces the concept of gradual typing, allowing developers to add type hints without enforcing strict type checking.
  • Type Hinting Syntax: It covers the syntax for type hints, including how to annotate function parameters and return types.
  • Benefits of Type Hints: Type hints improve code readability and help catch type-related errors during static analysis.

What is the role of metaclasses in Fluent Python?

  • Class Factories: Metaclasses are described as class factories that control the creation and behavior of classes.
  • Dynamic Class Creation: They allow for customization of class attributes and methods at the time of class creation.
  • Advanced Usage: While powerful, metaclasses are best suited for library and framework development rather than everyday application code.

How does Fluent Python address the concept of context managers?

  • Context Manager Basics: Context managers are used to manage resources, ensuring they are properly acquired and released.
  • Using the with Statement: The book emphasizes the use of the with statement to simplify resource management.
  • Custom Context Managers: Readers learn how to create custom context managers by implementing the __enter__ and __exit__ methods.

What are the differences between classmethod and staticmethod in Fluent Python?

  • Purpose of classmethod: A classmethod receives the class as its first argument, allowing it to access class-level attributes and methods.
  • Purpose of staticmethod: A staticmethod does not receive any special first argument and behaves like a regular function within a class.
  • Use Cases: classmethod is useful for methods that need to interact with the class itself, while staticmethod is suitable for utility functions related to the class.

Sobre el autor

Luciano Ramalho es un experto en Python de gran prestigio y autor reconocido. Su profundo conocimiento del lenguaje le ha permitido realizar aportes significativos a la comunidad de Python. Su estilo de escritura se destaca por ser claro, ameno y pedagógicamente efectivo. Los lectores valoran su capacidad para explicar conceptos complejos mediante ejemplos bien elaborados, así como sus reflexiones sobre los principios de diseño de Python. La experiencia de Ramalho va más allá de la sintaxis, abarcando la filosofía del lenguaje y las mejores prácticas. Su obra suele incluir contexto histórico y comparaciones con otros lenguajes de programación, brindando así una comprensión completa del lugar que ocupa Python en el mundo de la programación.

Follow
Escuchar
Now playing
Fluent Python
0:00
-0:00
Now playing
Fluent Python
0:00
-0:00
1x
Queue
Home
Swipe
Library
Get App
Try Full Access for 3 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
Read unlimited summaries. Free users get 3 per month
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 26,000+ books. That's 12,000+ hours of audio!
Day 2: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 3: Your subscription begins
You'll be charged on Jun 9,
cancel anytime before.
Consume 2.8× More Books
2.8× more books Listening Reading
Our users love us
600,000+ readers
Trustpilot Rating
TrustPilot
4.6 Excellent
This site is a total game-changer. I've been flying through book summaries like never before. Highly, highly recommend.
— Dave G
Worth my money and time, and really well made. I've never seen this quality of summaries on other websites. Very helpful!
— Em
Highly recommended!! Fantastic service. Perfect for those that want a little more than a teaser but not all the intricate details of a full audio book.
— Greg M
Save 62%
Yearly
$119.88 $44.99/year/yr
$3.75/mo
Monthly
$9.99/mo
Start a 3-Day Free Trial
3 days free, then $44.99/year. Cancel anytime.
Unlock a world of fiction & nonfiction books
26,000+ books for the price of 2 books
Read any book in 10 minutes
Discover new books like Tinder
Request any book if it's not summarized
Read more books than anyone you know
#1 app for book lovers
Lifelike & immersive summaries
30-day money-back guarantee
Download summaries in EPUBs or PDFs
Cancel anytime in a few clicks
Scanner
Find a barcode to scan

We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel
Settings
General
Widget
Loading...
We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel