Inicio > Python no muerde, yo sí
Python no muerde, yo sí
O: aprenda a programar en 3217 días
Autor:
Versión: 8e80f80bdea9
Roberto Alsina <
[email protected]>
Introducción
Requisitos
Éste es un libro sobre Python [1]. Es un libro que trata de explicar una manera posible de usarlo, una manera
de tomar una idea de tu cabeza y convertirla en un programa, que puedas usar y compartir.
[1] ¿Por qué Python? Porque es mi lenguaje favorito. ¿De qué otro lenguaje podría escribir?
¿Qué necesitás saber para poder leer este libro?
El libro no va a explicar la sintaxis de python, sino que va a asumir que la conocés. De todas formas, la primera
vez que aparezca algo nuevo, va a indicar dónde se puede aprender más sobre ello. Por ejemplo:
# Creamos una lista con los cuadrados de los números pares
cuadrados = [ x**2 for x in numeros if x%2 == 0 ]
Referencia
Eso es una comprensión de lista
En general esas referencias van a llevarte al Tutorial de Python en castellano. Ese libro contiene toda la
información acerca del lenguaje que se necesita para poder seguir éste.
Cuando una aplicación requiera una interfaz gráfica, vamos a utilizar PyQt [2]. No vamos a asumir ningún
conocimiento previo de PyQt pero tampoco se va a explicar en detalle, excepto cuando involucre un concepto
nuevo.
Por ejemplo, no voy a explicar el significado de setEnabled [3] pero sí el concepto de signals y slots cuando
haga falta.
[2] PyQt es software libre, es multiplataforma, y es muy potente y fácil de usar. Eso no quiere decir
que las alternativas no tengan las mismas características, pero quiero enfocarme en programar,
no en discutir, y yo prefiero PyQt. Si preferís una alternativa, este libro es libre: podés hacer una
versión propia!
[3] PyQt tiene una excelente documentación de referencia para esas cosas.
Convenciones
Las variables, funciones y palabras reservadas de python se mostrarán en el texto con letra monoespaciada.
Por ejemplo, for es una palabra reservada.
Los fragmentos de código fuente se va a mostrar así:
# Creamos una lista con los cuadrados de los números impares
cuadrados = [ x**2 for x in numeros if x%2 > 0 ]
Los listados extensos o programas completos se incluirán sin cajas, mostrarán números de líneas e indicarán
el nombre del mismo:
cuadrados.py
1 # Creamos una lista con los cuadrados de los números impares
2 cuadrados = [ x**2 for x in numeros if x%2 > 0 ]
En ese ejemplo, debería haber, en los ejemplos que acompañan al libro, un archivo
codigo/X/cuadrados.py donde X es el número del capítulo en el que el listado aparece.
Lenguaje
Las discusiones acerca de como escribir un libro técnico en castellano son eternas. Que en España se traduce
todo todo todo. Que en Argentina no. Que decir "cadena de caracteres" en lugar de string es malo para la
ecología.
Por suerte en este libro hay un único criterio superador que ojalá otros libros adopten: Está escrito como
escribo yo. Ni un poquito distinto. No creo que siquiera califique como castellano, como mucho está escrito en
argentino. Si a los lectores de la ex madre patria les molesta el estilo... tradúzcanlo.
Mapa
Dentro de lo posible, voy a intentar que cada capítulo sea autocontenido, explicando un tema sin depender
demasiado de los otros, y terminando con un ejemplo concreto y funcional.
Éstos son los capítulos del libro, con breves descripciones.
1. Introducción
2. Pensar en python
Programar en python, a veces, no es como programar en otros lenguajes. Acá vas a ver algunos
ejemplos. Si te gustan... python es para vos. Si no te gustan... bueno, el libro es barato... capaz que Java
es lo tuyo..
3. La vida es corta
Por eso, hay muchas cosas que no vale la pena hacer. Claro, yo estoy escribiendo un editor de textos así
que este capítulo es pura hipocresía...
4. Las capas de una aplicación
Batman, los alfajores santafesinos, el ozono... las mejores cosas tienen capas. Cómo organizar una
aplicación en capas.
5. Documentación y testing
Documentar es testear. Testear es documentar.
6. La GUI es la parte fácil
Lo difícil es saber que querés. Lamentablemente este capítulo te muestra lo fácil. Una introducción rápida
a PyQt.
7. Diseño de interfaz gráfica
Visto desde la mirada del programador. Cómo hacer para no meterse en un callejón sin salida. Cómo
hacerle caso a un diseñador.
8. Un programa útil
Integremos las cosas que vimos antes y usémoslas para algo.
9. Instalación, deployment y otras yerbas
Hacer que tu programa funcione en la computadora de otra gente
10. Cómo crear un proyecto de software libre
¿Cómo se hace? ¿Qué se necesita? ¿Me conviene? Las respuestas son "depende", "ganas" y "a
veces". O "así", "una idea" y "sí". O sea, no sé. Pero veamos.
11. Rebelión contra el Zen
Cuándo es mejor implícito que explícito? ¿Cuándo es algo lo suficientemente especial para ser,
realmente, especial?
12. Herramientas
Programar tiene más en común con la carpintería que con la arquitectura.
13. Conclusiones, caminos y rutas de escape
¿Y ahora qué?
Este es un diagrama de dependencias. Cada capítulo tiene flechas que lo conectan desde los capítulos que
necesitás haber leído anteriormente.
Con suerte será un grafo acíclico.
La línea de puntos significa 'no es realmente necesario, pero...'
Este libro se lee siguiendo las flechas.
Acerca del Autor
Habrá que pedirle a alguien que ponga algo no demasiado insultante.
Contenidos
Introducción
Requisitos
Convenciones
Lenguaje
Mapa
Acerca del Autor
Pensar en Python
Get/Set
Singletons
Loops y medios loops
Switches
Patos y Tipos
Genéricos
Decoradores
Claro pero corto pero claro
Lambdas vs alternativas
Ternarios vs ifs
Pedir perdón o pedir permiso
La vida es Corta
El Problema
Twill
Bottle
Autenticación
Storm
HTML / Templates
Backend
Conclusiones
Las Capas de una Aplicación
Proyecto
El Problema
Capa de Datos: Diseño
El Tablero
Las Fichas
El Jugador
Documentación y Testing
Docstrings
Doctests
Cobertura
Mocking
La Máquina Mágica
Documentos, por favor
La GUI es la Parte Fácil
Proyecto
Programación con Eventos
Ventanas / Diálogos
Mostrando una Ventana
¡Que haga algo!
Icono de Notificación
Acciones
Ruido
Diseño de Interfaz Gráfica
Proyecto
Corrigiendo la Interfaz Gráfica
¿Qué estamos haciendo?
Pulido
Nombres y Descripciones
Uso Desde el Teclado
Traducciones
Feedback
Un Programa Útil
Proyecto
Instalación, Deployment y Otras Yerbas
Cómo Crear un Proyecto de Software Libre
Rebelión Contra el Zen
Herramientas
Conclusiones, Caminos y Rutas de Escape
Licencia de este libro
Agradecimientos
El MetaLibro
Pensar en Python
Lo triste es que esta pobre gente trabajó mucho más de lo necesario,
para producir mucho más código del necesario, que funciona mucho más
lento que el código python idiomático correspondiente.
—Phillip J. Eby en Python no es
Java
Nuestra misión en este capítulo es pensar en qué quiere decir Eby con "código python idiomático" en esa cita.
Nunca nadie va a poder hacer un pythonómetro que te mida cuán idiomático es un fragmento de código, pero
es posible desarrollar un instinto, una "nariz" para sentir el "olor a python", así como un enófilo [4] aprende a
distinguir el aroma a clavos de hierroníquel número 7 ligeramente oxidados en un Cabernet Sauvignon. [5]
[4] En mi barrio los llamábamos curdas.
[5] Con la esperanza de ser un poco menos pretencioso y/o chanta, si Zeus quiere.
Y si la mejor forma de conocer el vino es tomar vino, la mejor forma de conocer el código es ver código. Este
capítulo no es exhaustivo, no muestra todas las maneras en que python es peculiar, ni todas las cosas que
hacen que tu código sea "pythonic" entre otros motivos porque no las conozco pero muestra varias. El
resto es cuestión de gustos.
Get/Set
Una instancia de una clase contiene valores. ¿Cómo se accede a ellos? Hay dos maneras. Una es con
"getters y setters", y estas son algunas de sus manifestaciones:
# Un getter te "toma" (get) un valor de adentro de un objeto y
# se puede ver así:
x1 = p.x()
x1 = p.get_x()
x1 = p.getX()
# Un setter "mete" un valor en un objeto y puede verse así:
p.set_x(x1)
p.setX(x1)
Otra manera es simplemente usar un miembro x de la clase:
p.x = x1
x1 = p.x
La ventaja de usar getters y setters es el "encapsulamiento". No dicta que la clase tenga un miembro x, tal vez
el valor que yo ingreso via setX es manipulado, validado, almacenado en una base de datos, o tatuado en el
estómago de policías retirados con problemas neurológicos, lo único que importa es que luego cuando lo saco
con el getter me dé lo que tenga que dar (que no quiere decir "me dé lo mismo que puse").
Muchas veces, los getters/setters se toman como un hecho de la vida, hago programación orientada a objetos
=> hago getters/setters.
Bueno, no.
Analogía rebuscada
En un almacén, para tener un paquete de yerba, hay que pedírselo al almacenero. En un
supermercado, para tener un paquete de yerba, hay que agarrar un paquete de yerba. En una
farmacia (de las grandes), para obtener un paquete de yerba hay que agarrar un paquete de
yerba, pero para tener un Lexotanil hay que pedirlo al farmacéutico.
En Java o C++, la costumbre es escribir programas como almacenes, porque la alternativa es
escribir supermercados donde chicos de 5 compran raticida.
En Python, la costumbre es escribir programas como supermercados, porque se pueden
convertir en farmacias apenas decidamos que tener raticida es buena idea.
Imaginemos que estamos escribiendo un programa que trabaja con "puntos" o sea coordenadas (X,Y), y que
queremos implementarlos con una clase. Por ejemplo:
Listado 1
1 class Punto(object):
2 def __init__(self, x=0, y=0):
3 self.set_x(x)
4 self.set_y(y)
5
6 def x(self):
7 return self._x
8
9 def y(self):
10 return self._y
11
12 def set_x(self,x):
13 self._x=x
14
15 def set_y(self,y):
16 self._y=y
Esa es una implementación perfectamente respetable de un punto. Guarda X, guarda Y, permite volver a
averiguar s
Comentarios de: Python no muede, yo si (0)
No hay comentarios