Zen de Python

De vuelta a las bases

Javier Daza

  • Ingeniero Electrónico egresado de Uninorte
  • Desarrollador FullStack
  • Profesor de japonés en la Asociación Colombo Japonesa
  • Creador de las comunidades Kizuna Club y Python Barranquilla
  • Co-organizador de PyCon Colombia y Django Girls Colombia

Aplica a PyCon 2019

Aplica como ponente o tallerista para el próximo evento PyCon Colombia 2019.

¡Va a ser sensacional!

Django Girls  Barranquilla

Taller de programación gratuito para mujeres.

 

Invita a tus amigas, compañeras, primas y/o conocidas.

De vuelta a las bases

2 charlas de 40 minutos

  • Estilo conferencias tipo PyCon
  • Nivel básico y nivel intermedio/avanzado
  • Temas relacionados
  • Preparación para charlas internacionales

Aplica como ponente en PyBAQ

  • Envía un mensaje en meetup.com/pythonbaq
  • Envía un mensaje directo al team PyBAQ
  • Envíanos un correo a djangoquilla@gmail.com
  • Escribir en el Slack de la comunidad

¿Qué es Zen?

Una escuela de budismo

La palabra zen es la abreviación de zenna que es la pronunciación en japonés de la palabra china 禪那 chánnà, que a su vez deriva de la palabra sánscrita ध्यान dhiana, que significa ‘meditación’.

El zen busca la experiencia de la sabiduría por medio de la iluminación.

¿Qué es el Zen de Python?

Son un listado de 20 principios de diseño para Python escritos por Tim Peters en junio de 1999

¿Dónde encontrarlo?

  • Página oficial de Python como el PEP20
  • Huevo de Pascua (easter egg) en la consola

import this

Curiosidades

Solo hay 19!

  • Se redactaron 19 principios para que el 20vo lo hiciera el mismo Guido. Hasta la fecha aún lo esperamos.

this.py

  • A partir de la versión 2.2.1 se incorpora el modulo this.py que imprime el Zen

IPC

  • "import this" fue el originalmente el eslogan de la Conferencia Internacional de Python ( IPC International Python Conference, predecesor de PyCon)

Foto de Mark Hawkins

El Zen Ofuscado

  • Antes de implementar el módulo this.py se utilizó el algoritmo ROT13, para ofuscar el Zen dentro del código.
s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)
print "".join([d.get(c, c) for c in s])

Los principios

Bello es mejor que feo

En vez de usar && o || como operadores logicos, considera usar and, or.

 

Aunque es subjetivo, el código parece más legible y hermoso de esta manera.

if (is_valid(a) && b == 0 || s == 'yes') {

# vs

if is_valid(a) and b == 0 or s == 'yes':

Explícito es mejor que implícito.

Esto puede referirse a "nombrar explícitamente módulos al invocarlos en funciones".

import os 
print os.getcwd()

# en vez de

from os import *
print getcwd()

Simple es mejor que complejo.

Según el desarrollador brasileño Vitor Freitas, "Steve Jobs declaró una vez que "simple puede ser más difícil que complejo". Y eso es verdad. Requiere mucho trabajo arduo para que su forma de pensar esté limpia, para llegar a una solución simple.

Complejo es mejor que complicado

Digamos que mi novia imaginaria me pide que le haga una comida de tres platos para su cumpleaños (: complejo). A continuación, digamos que me pide que la lleve a un restaurante del que disfrutará (: complicado). Piensa en la diferencia principal entre Data Analytics y Data Science: en x tienes las preguntas pero no las respuestas, mientras que en y no tienes las preguntas ni las respuestas.

Plano es mejor que anidado

El anidamiento es muchas veces sinónimo de complejidad extra, de dependencias que a veces incomodan, de tener que mirar con cuidado. Lo plano es más directo, más claro. Y así debe ser tu decisión, directo al grano, sin vueltas.

if something:
    if something_again:
        if something_here:

# VS

if something:
    do this
if somthing_again:
    do this

Disperso es mejor que denso

No intentes pegar demasiado código en una línea

if i>0: return sqrt(i)

elif i==0: return 0

else: return 1j * sqrt(-i)


# vs


if i > 0:
    return sqrt(i)
elif i == 0:
    return 0
else:
    return 1j * sqrt(-i)

La legibilidad cuenta

Compare C:

#include <stdio.h>

int main(void)
{ 
    printf("Hello, world!\n");
    return(0); 
} 
print "Hello world!

VS Python:

Los casos especiales no son tan especiales como para quebrantar las reglas.

Los idiomas y las bibliotecas deberían aspirar a la coherencia y deberían apoyar el caso general.

 

Aunque lo práctico gana a la pureza.

Con respecto a la Regla anterior, siempre puede haber una excepción a la regla.

Los errores nunca deberían dejarse pasar silenciosamente.

Nunca permita que los errores, que pueden ocurrir, confundan al lector. Esto se puede resolver fácilmente imprimiendo una cadena cuando ocurre un error.

try:
    import this
except ImportError:
    print 'this is not available'

A menos que hayan sido silenciados explícitamente

try:
    v = d[k]
except KeyError:
    v = d[k] = default

Frente a la ambigüedad, rechaza la tentación de adivinar.

#Considere 

if not a and b: do something

'''
¿Qué une más estrechamente 'not' o 'and'? La sintaxis no es ambigua, pero mi memoria no. 
¿Podría ser? (no):
'''

if not (a and b): do something

# y que tal:

if b and not a: do something

#Tal vez un poco mas feo pero sirve: 

if (not a) and b: do something

Esto es subjetivo porque alguien puede argumentar que debe esperar que el lector de su código conozca Python y las prioridades para 'not' y 'and'

Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo

Piense por qué sería que Python se describe como un lenguaje de programación fácil de aprender.
¿No sería más difícil si tuvieras que aprender múltiples formas de hacer cada cosa?

El ejemplo mas claro es al iterar sobre una lista. En Python solo debes aprender:

for element in sequence:

Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.

Esta es una referencia al creador de Python, Guido van Rossum.

Ahora es mejor que nunca

No dedique demasiado tiempo a planificar y preoptimizar; obtenga algo que haga el trabajo y mejorelo con el tiempo.

Aunque nunca es a menudo mejor que ya mismo

Es a menudo mejor planear que empezar en un camino del cual no hay marcha atrás

Si la implementación es difícil de explicar, es una mala idea

Si la implementación es complicada, definitivamente no es simple, lo que significa que no está cerca de un borrador final, lo que significa que no es bueno publicarlo como tal.

Si la implementación es fácil de explicar, puede que sea una buena idea.

Algunas ideas son simplemente malas, independientemente de si son fáciles de implementar o no.

Los 'namespaces' son una gran idea

Conjuntos de símbolos, y varios objetos a los que se hace referencia por nombre. Supongo que en lenguaje general, una palabra se define con otras palabras. Una vez aprendido, solo necesitamos una palabra, ¿o namespace? - para dar sentido a algo, simplificando la vida en el proceso.

 

¿Que es un nombre?

Nombre son los identificadores de un objeto dado. Como todo es un objeto en Python, nombre es una forma de acceder a ese objeto.

a = 2

# 2 es el objeto guardado en memoria

# a es el nombre asociado a el

¿Qué es un namespace?

Para ponerlo simple, un namespace es una colección de nombres.

 

Diferentes namespaces pueden co-existir en un determinado momento y son aislados.

Python Variable Scope

Aunque existan varios namespaces no podemos acceder a todos desde cualquier parte del programa. Ahi es donde el concepto de scope entra a jugar.

 

Scope es una porción del programa desde donde un namespace puede ser accedido directamente sin prefijo.

def outer_function():
    b = 20
    def inner_func():
        c = 30

a = 10

# La varibale a esta en namespace global
# b esta en el namespace local de outer_function()
# c esta en el namespace local anidado de 
inner_function()

'''
Cuando estamos en inner_function(), c es local 
para nosotros, b no es local y a es global
'''

Gracias

Fuentes