El lenguaje Python

Qué es Python y por qué me debería interesar.

Jose Ramón Palacios

jotarp.org/var/lenguajePython

Objetivo y sumario

Objetivo

Mostrar el atractivo de Python

Sumario

"""

El objetivo de esta charla, más que ofrecer una introducción a Python y que los asistentes se lleven unos mínimos conocimientos del lenguaje, es ofrecer una perspectiva de qué es Python y por qué un programador debería estar interesado. Más que con "conocimientos de Python", espero que los asistentes salgan con "ganas de conocimiento de Python". Que salgan corriendo a comprarse un libro de Python (o a leerse la amplia documentación existente en Internet).

Para ello haré una descripción del lenguaje, primero de manera formal, hablando estrictamente de sus características (lo que te podrías encontrar en un libro), luego de manera informal (lo que un compañero te diría de él), y finalmente comparándolo con otros lenguajes.

Ni que decir tiene que la "descripción informal" y la "comparativa" estarán cargadas de subjetividad y limitadas por mis propios conocimientos.

Tras este vistazo a Python, y a tenor de lo visto, plantearé qué es lo que nos hace elegir un determinado lenguaje y cuando y por qué deberíamos elegir Python.

Finalmente veremos que pinta tiene Python y practicaremos un poco con él.

¿Qué es Python? I

python.org: Lenguaje de programación multipropósito, dinámico, orientado a objetos.
Origen: 1991, Guido van Rossum en CWI (Paises Bajos). Lenguaje ABC. Monty Python.

Características

¿Qué es Python? II

"""

En otros lenguajes (C, por ejemplo), la sintaxis y la indentación deben coincidir. Si no, puede haber errores. En Python, sintaxis e indentación es todo uno. Ejemplo:
x = 8;
if (x < 10)
	printf ("Es menor de 10.");
	if (x < 0) printf ("Es negativo.");
else
	printf ("Es 10 ó mayor de 10.");
Strong Typing vs. Strong Testing

"Otras" características I

Legibilidad del código

El código se lee muchas más veces de las que se escribe:

El principal objetivo que persigue este lenguaje es la facilidad, tanto de lectura, como de diseño.

Prácticamente, se lee como "pseudo-código".

Zen de Python: Bello es mejor que feo. La legibilidad cuenta.

"""

Hasta aquí las características formales de Python. Pero hay otras características a tener en cuenta en dónde Python se distingue especialmente. Por ejemplo, en la legibilidad del código.

¿La facilidad de aprendizaje a jugado en contra de Python?. Entre eso y ser un lenguaje de script, puede que muchos lo hallan tomado durante mucho tiempo por un lenguaje "de juguete". Aún más que otros lenguajes exitosos como PHP.

Aspecto de Python

def initial_color(s, colordb):
    # function called on every color
    def scan_color(s, colordb=colordb):
        try:
            r, g, b = colordb.find_byname(s)
        except ColorDB.BadColor:
            try:
                r, g, b = ColorDB.rrggbb_to_triplet(s)
            except ColorDB.BadColor:
                return None, None, None
        return r, g, b
    #
    # First try the passed in color
    r, g, b = scan_color(s)
    if r is None:
        # try the same color with '#' prepended, since some shells require
        # this to be escaped, which is a pain
        r, g, b = scan_color('#' + s)
    if r is None:
        print 'Bad initial color, using gray50:', s
        r, g, b = scan_color('gray50')
    if r is None:
        usage(1, 'Cannot find an initial color to use')
        # does not return
    return r, g, b

"""

El carácter más raro es el que inicia un comentario: "#".

"Otras" características II

Lenguajes de programación: teoría


Python: multiparadigma, práctico.
Influido por:
ABC, ALGOL 68, C, Haskell, Icon, Lisp, Modula-3, Perl, Java

Zen de Python: Aunque lo práctico gana a la pureza.

"""

A diferencia de otros lenguajes, Python se puede contener en gran medida en la cabeza. -> Menos consultas a documentación. Esto se revela también en que para programar en Python no sea imprescindible un buen IDE.
Ha ido cogiendo buenas ideas de todos los lenguajes (y lo sigue haciendo).

"Otras" características III

¿Velocidad?

No es el más rápido, pero:

"""

¿La elección de un lenguaje por su velocidad como un caso de optimización temprana?.

"Otras" características IV

Pero... ¿lo usa alguien?


Python, el lenguaje del 2007
Proyecto Python de Nokia
Google App Engine
Ayuda de Google hecha en Python

"Otras" características V

Pero... ¿para que se usa/puedo usar?

Válido como "primer" lenguaje...
...y como último.

"""

Todas sus características llevan a poder considerar a Python como un buen primer candidato para resolver cualquier problema (prototipo). Si luego necesitamos más o cambiar de lenguaje, siempre podremos ampliarlo, empotrarlo, trasponer la programación a otro lenguaje, etc, y no habremos empleado demasiado tiempo. E incluso quizá no necesitemos todo eso y nos podamos quedar con la solución Python.

Comparativa: Perl

Frente al "esparadrapo de Internet", Python es:

Perl: Hay más de una forma de hacerlo.

Zen de Python: Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.

"""

Comenzamos con las comparativas... y quizá con las "guerras santas". Aunque es una manera práctica de conocer un lenguaje (el compararlo con otros) facilmente se puede caer en una defensa a ultranza de "mi lenguaje". Creo que Python es especialmente dado a ser comparado con otros lenguajes (Perl, Java, ...)

LanguageComparisons: Comparativa con otros lenguajes.
PLEAC - Programming Language Examples Alike Cookbook: Programas comunes en distintos lenguajes.

Perl

Python es casi tan "denso" como Perl, pero manteniendo la legibilidad.
Perl es dificil de leer
Perl para jeroglíficos

Comparativa: Ruby

Frente a uno de los "lenguajes de moda":

Asked about Ruby, Guido thought that it "seems like an accident attempt in cleaning up Perl".

"""

Ruby cogió bastante auge a partir de "Ruby on Rails". Cuando yo lo conocí, eché un vistazo a ver que pinta tenía el código y lo primero que pensé fue, precisamente, lo mismo que esa cita de Guido (la cita no está comprobada y hay quien dice que no es cierta).

Comparativa: Java

Frente al "COBOL del siglo XXI", Python es:

"""

Por qué 10 años después, los proyectos Java aún son riesgosos
Python & Java. A Side-by-Side Comparison

Un ejemplo de código Python frente a Java:
cadena[1:-1]
cadena.substring(1, cadena.length() - 1)

Comparativa: C#

Frente al heredero, de Microsoft, de:

¿?

Uso de .NET ó Mono: CLI
  • IronPython
  • Boo

Comparativa: otros lenguajes

Elección de un lenguaje

Ponderación de factores:


(para cada problema)

"""

Elección de Python

Factores de Python:

"""

Si se considerasen y ponderasen adecuadamente todos los factores, Python sería el mejor candidato en multitud de casos. Salvo que halla un factor "sine qua non" que nos haga decantarnos por otro.

Hay quien postula que un programador debería aprender un lenguaje al año. Quizá sea exagerado, pero sí debería conocer más de uno ó dos. Python debería ser uno de ellos. Si finalmente no resulta útil o no se usa, al menos la inversión en tiempo no será muy grande.

Python práctico: instalación

Descarga de Python: python.org/download

Ejecución:


Probar Python en línea: trypython
Shell más interactivo: IPython
Documentación Python
Documentación en español

Práctica I: primeros pasos

¡ Hola mundo !:
>>> print "¡ Hola mundo !"
The Zen of Python:
>>> import this
Ayuda:
>>> help
>>> help(5)
Help on int object:
...
>>> dir(5)
['__abs__', '__add__', ...]
>>> abs.__doc__
'abs(number) -> number\n\nReturn the absolute value of the argument.'

Práctica II: Números

Python como calculadora:
>>> 2+2
4
>>> 1/2 # División entera
0
>>> anchura, altura = 3, 5*9
>>> anchura, altura = altura, anchura
>>> altura
3
>>> anchura * altura
135
>>> _ / 2.
67.5
>>> sup = float(anchura * altura) / 2
>>> sup
67.5
>>> x = y = z = 0

Práctica III: Cadenas

Asignación, sustitución:
>>> w = 'texto'
>>>  "X vale %s, Y vale %s" % (x,y)
'X vale 0, Y vale 0'
Concatenado y repetición:
>>> w * 3
'textotextotexto'
>>> repe = (w + ' ') * 3
>>> repe
'texto texto texto '
Subcadenas:
>>> w[0:3]
'tex'
>>> w[2:]
'xto'
>>> repe[:-1]
'texto texto texto'

Práctica IV: Tuplas, Listas y Diccionarios

>>> mitupla = ("una", "tupla")
>>> milista = [8, 5, ["otra", "lista"], mitupla]
>>> midict = {"clave 1": "Valor 1", 2: milista, "pi": 3.14}
>>> milista[3]
('una', 'tupla')
>>> milista[0] = 7
>>> milista
[7, 5, ['otra', 'lista'], ('una', 'tupla')]
>>> milista[3][0] = "error"
>>> midict["pi"] = 3.1415
>>> longitud = len
>>> longitud(midict)
>>> milista[2] = milista  # recursión
>>> milista
[7, 5, [...], ('una', 'tupla')]

Práctica V: List Comprenhensions, Sets

Listas autodefinidas:
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [str(round(355/113.0, i)) for i in range(1,6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
Conjuntos:
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b
set(['r', 'd', 'b'])

Práctica VI: Estructuras de control

for n in range(10):
    print n
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'es igual a', x, '*', n/x
            break
        else:
            print n, 'es primo'

Práctica VII: Funciones, módulos

Ejemplo de función:
def mcd(a,b):
	"máximo común divisor"
	while a != 0:
		a, b = b%a, a
	return b
mcd(21,70)
Compilación de un directorio:
import compileall
compileall.compile_dir(".")
Ejemplo extraido de: una presentación de Python.

Práctica VIII: Ejemplo de clase

class Pila:
	"nueva estructura de datos"
	def __init__(self):	# constructor
		self.items = []
	def push(self, x):
		self.items.append(x)
	def pop(self):
		x = self.items[-1]
		del self.items[-1]
		return None
	def empty(self):
		return len(self.items) == 0
>>> Pila.__doc__
'nueva estructura de datos'
>>> help(Pila)
Help on class Pila in module __main__:
...

Práctica IX: Creación de objeto

p=Pila()
p.pop()
try:
	p.pop()
except:
	print "te has pasado"
p.__doc__
dir(p)

Práctica X: Tkinter, Pygame

Prueba de Tkinter

import Tkinter
Tkinter._test( )

Prueba de Pygame

Descargar Pygame

Windows: Inicio -> Pygame -> Examples:

Práctica XI: Python ofuscado

import random,pygame;R=range;L=len;W=10;Q=H=20;P=pygame;G=255;v=lambda b:['0'*W
]*(H-L(b))+b;a=p=x=y=c=d=0;D=P.display;T=P.USEREVENT;m=lambda i,j:j-y in R(L(p)
)and i-x in R(L(p[0]))and'0'!=p[j-y][i-x]and`d+1`or b[j][i];S=D.set_mode((W*Q,H
*Q));k=lambda p,x,y:1-max(p[i][j]!='0'and(y+i>=H or x+j<0or x+j>=W or'0'!=b[i+y
][j+x])for j in R(L(p[0]))for i in R(L(p)));n=E=b=v([]);P.time.set_timer(T,100)
exec("while E!=P.QUIT:\n E=P.event.wait().type;K=P.key.get_pressed()\n if n:d="
"random.randrange(7);q='111';p=[['1'*4],['010',q],['110','011'],['011','110'],"
"[q,'100'],['11','11'],[q,'001']][d];x=W/2-L(p[0])/2;y=n=0\n if E==T:\n  [P.dr"
"aw.rect(S,[(h,g,f)for f in(0,G)for g in(0,G)for h in(0,G)][int(m(i/H,i%H))],("
"(i/H*Q,i%H*Q),(Q,Q)))for i in R(W*H)];t=''.join;z=[t([p[L(p)-1-i][j]for i in "
"R(L(p))])for j in R(L(p[0]))];p,x,y=[p,z][K[P.K_UP]*k(z,x,y)],x-(K[P.K_LEFT]*"
"k(p,x-1,y))+(K[P.K_RIGHT]*k(p,x+1,y)),y+(K[P.K_DOWN]*k(p,x,y+1));B=[t([m(i,j)"
"for i in R(W)])for j in R(H)];e=sum(r.find('0')<0for r in B);D.flip();c+=1\n "
" if c%5<1:\n   if k(p,x,y+1)<1:\n    if y<1:break\n    a+=e and 2**e;n=b=v([r"
" for r in B if~r.find('0')])\n   else:y+=1\n");print 'GAME OVER: score %i'%a

Práctica XII: Extensiones para Windows

Prueba de pywin32

Descargar pywin32

from win32com.client import Dispatch
xApp = Dispatch("Excel.Application")
# xApp.Visible = 1
# xApp.Visible = 0
xApp.Workbooks.Add()
xApp.ActiveSheet.Cells(1,1).Value = '¡ Python Mola !'
xApp.ActiveWorkbook.SaveAs(Filename='C:\\pruebapy.xls')
xApp.Quit()
del xApp

Para saber más

Eso es todo

                      .-=-.          .--.
          __        .'     '.       /  " )
  _     .'  '.     /   .-.   \     /  .-'\
 ( \   / .-.  \   /   /   \   \   /  /    ^
  \ `-` /   \  `-'   /     \   `-`  /
jgs`-.-`     '.____.'       `.____.'

Creative Commons License Salvo el código de S5, de SyntaxHighlighter, y las imágenes, esta obra está bajo una licencia de Creative Commons.