Learning python, 4th Edition

image0Learning Python de Mark Lutz, ha sido, desde su primera versión en 1999, uno de los libros de cabecera para aprender Python.

Hace unos días salió la 4ta edición, adaptada a las versiones 2.6 y 3.1 de Python y ampliada en varios capítulos.

Lamentablemente, tardará mucho en llegar a la librerías argentinas, pero podés ir leyendo la versión en PDF.

Project Euler, Problema #2

El problema nº 2 pide obtener la suma de todos los números impares pertenencientes a la sucesión de Fibonacci menores a 4 millones.

El código con el que lo resolví es este:

def fibo(max):
        a, b = 0, 1
           n = a + b
           while n < max:
                yield n
                a, b = b, n
                n = a + b

sum([i for i in fibo(4000000) if i%2 == 0])

El resultado es 4613732.

Explicación

Fibonacci es el "hola mundo matemático" y Python luce su elegancia con este problema.

El aspecto interesante de la función fibo() definida en el código de arriba es que no se trata de una función común sino de un generador. Sintácticamente la diferencia está en que no utiliza la sentencia return sino `yield <http://docs.python.org/reference/simple_stmts.html#the-yield-statement>`_ .

La definición de `yield <http://www.wordreference.com/definition/yield>`_. en su acepción de verbo, dice «end resistance, especially under pressure or force;». Ceder, no oponer resistencia.

La diferencia sustancial entre un yield y un return es que el yield devuelve el resultado parcial de cada iteración y hace una "marca de entrada" desde donde se comenzará a ejecutar la próxima vez que la función (el generador) sea invocado.

Esto permite una recursividad con "evaluación perezosa", mucho más eficiente en términos computacionales.

Resolviendo Project Euler con python

A través del blog de Juanjo Conti descubrí Project Euler, una serie de desafíos matemáticos de enunciación sencilla para resolver con computadoras.

Juanjo estuvo resolviendo los primeros problemas, y yo quise hacer mi intento. El primero plantea obtener la suma de todos los multiplos de 3 o de 5 menores a 1000.

Lo resolví con esta pythonica (lo es?) línea:

sum([i for i in range(1000) if (i % 3 == 0 or i % 5==0)])

El resultado es 233168.

Breve explicación

Se basa en el uso de list comprehensions, una de las "joyas de la corona" de las características de Python.

Es una manera de generar listas de una manera concisa, compuesta por una expresión seguida de uno a más for y una condicionalidad al final

La lista ** [i for i in range(1000) if (i % 3 == 0 or i % 5==0)]** se lee así: crear una lista con todos los elementos (expresión i) en el rango de 0 a 999 (for) cuyo resto de dividirlo por 3 o 5 sea 0 (if).

Principios para un "freelancear" exitosamente

The principle of successful freelancing, de Miles Burke, es el libro (digital) que estoy leyendo.

This book is intended as a guide to approaching the decision to be your own boss, effecting a smooth transition into a freelance career, and making it a success once you’re there. The book’s holistic approach ensures that it not only covers how to make your freelancing journey a financial success, but also how to do it without risking your health and sanity.

Ser tu propio jefe. No está mal para este mundo donde ese rol tiene connotación negativa.

Quienes quieran chusmear, acá tienen.