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.
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
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.
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
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.
Válido como "primer" lenguaje...
...y como último.
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.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).
cadena[1:-1] cadena.substring(1, cadena.length() - 1)
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
>>> print "¡ Hola mundo !"
>>> import this
>>> help
>>> help(5) Help on int object: ... >>> dir(5) ['__abs__', '__add__', ...] >>> abs.__doc__ 'abs(number) -> number\n\nReturn the absolute value of the argument.'
>>> 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
>>> w = 'texto' >>> "X vale %s, Y vale %s" % (x,y) 'X vale 0, Y vale 0'
>>> w * 3 'textotextotexto' >>> repe = (w + ' ') * 3 >>> repe 'texto texto texto '
>>> w[0:3] 'tex' >>> w[2:] 'xto' >>> repe[:-1] 'texto texto texto'
>>> 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')]
>>> 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']
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b
set(['r', 'd', 'b'])
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'
def mcd(a,b): "máximo común divisor" while a != 0: a, b = b%a, a return b
mcd(21,70)
import compileall
compileall.compile_dir(".")
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__: ...
p=Pila() p.pop()
try: p.pop() except: print "te has pasado"
p.__doc__ dir(p)
import Tkinter Tkinter._test( )
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
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
.-=-. .--.
__ .' '. / " )
_ .' '. / .-. \ / .-'\
( \ / .-. \ / / \ \ / / ^
\ `-` / \ `-' / \ `-` /
jgs`-.-` '.____.' `.____.'
Salvo el código de S5, de SyntaxHighlighter, y las imágenes, esta obra está bajo una licencia de Creative Commons.