Sintaxis práctica.

Ernesto Revilla erny en sicem.biz
Sab Jun 5 02:19:04 CEST 2004


Hola,

Pepe Aracil escribió:

>Hola.
>
>Como adivinareis, llevo poco tiempo con python ( 4 ó 5 meses). Vengo de 
>programar en object pascal (delphi) y hay veces que dudo si podría sacar mas 
>partido a la "plasticidad" de python.
>
>Por Ej.
>
>if a > b : 
>	c = 25
>else:
>	c = 50
>
>se podría substituir por:
>
>c=(50,25)[a>b]
>
>  
>
Esto me parece bastante poco legible. Durante un tiempo se hablaba de 
introducir un nuevo operador ternario en Python, que funciona como en 
C:   c = a>b ? 25 : 50    pero al final creo que no se pusieron de 
acuerdo en la sintaxis.

>otro Ej.
>
>if a == 25 or a == 50 or a ==75 :
>	pass
>
>se podría substituir por:
>
>if a in (25,50,75):
>	pass
>
>
>Lo que para los programadores experimentados en python puede resultar obvio, 
>los que empezamos y venimos de otros lenguajes de más bajo nivel, no lo es 
>tanto.
>
>¿Sabéis más casos prácticos en los que se pueda extraer más jugo a la sintaxis 
>de python?
>
>  
>
Supongo que hay cientos de cosas:

if a> 10 and a< 20: ....    ->      if 10 < a < 20: ....

muy matemático, pero pocos programadores de Python lo saben.

Valores por defecto:
supon que hay una variable que puede contener un valor (!= 0) o None:
valor = variable or valorPorDefecto (atención, no distingue 0 te None)

a += 1  # incremento por uno  a++  no existe, eso es C.

una de mis expresiones favoritas son las comprehension list:

[a*a   for  a in range(100) if a % 2 == 0]

Los cuadrados de todos los númeres pares del conjunto [0,100)

La  versión explícita es la siguiente:
res=[]
for a in range(100):
    if a % 2 == 0:
        res.append(a*a)

así que son 4 líneas en una.

si trabajas con diccionarios

for clave in diccionario:  ....

o:

for clave, valor in diccionario.items()

algunas veces, en concreto en la programación con bases de datos, tienes 
por una parte los nombres de los campos y por otra los valores y te hace 
falta convertirlo en un diccionario o mapping de tuplas:
cur.description    # lista de campos
fila = res[0]         # recupera primera fila
dicc = dict( zip( [descrCampo[0] for descrCampo in cur.description], fila))

la comprehension list sacar el primer elemento de la tupla de la 
descripción de cada campo, es decir, el nombre. zip convierte dos listas 
separadas en una lista de tuplas: [ (a1, b1), (a2, b2), (a3, b3), ... ]

y así miles de cosas.




Más información sobre la lista de distribución Python-es