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
Foto de Patrick Vierthaler
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
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
- http://www.itsmycodeblog.com/the-zen-of-python/
- http://thepythondjango.com/meaning-different-aphorism-zen-python/
- http://pyconar.blogspot.com.co/2011/09/el-zen-de-pycon-plano-es-mejor-que.html
- https://www.pythoniza.me/el-zen-de-python/
- https://medium.com/@Pythonidaer/a-brief-analysis-of-the-zen-of-python-2bfd3b76edbf
- https://www.quora.com/What-do-different-aphorisms-in-The-Zen-of-Python-mean
- https://es.slideshare.net/doughellmann/an-introduction-to-the-zen-of-python
- https://legacy.python.org/dev/peps/pep-0020/
- https://recursospython.com/guias-y-manuales/zen-de-python-tim-peters/
- https://www.programiz.com/python-programming/namespace
Zen de Python
By Javier D
Zen de Python
- 1,412