Estilo y flexibilidad en python

lasizoillo lasizoillo en gmail.com
Vie Abr 3 12:21:54 CEST 2009


El día 3 de abril de 2009 1:50, kalith kalith <kalith.9 en gmail.com> escribió:
> Buenas..
> Cada vez me sorprendo mas del poder de la flexibilidad y el estilo que usan
> los que programan en python, ultimamente he visto mucho codigo en python y
> pues me soprenden los ciclos y condiciones y funciones que meten por ejemplo
> dentro de una lista o las cosas tan pues que no se ven en otros lenguajes
> Por ejemplo me encontre este codigo siguiendo un link de esta misma lista
>
> def quicksort(array):
>   if array == []:
>       return []
>   else:
>       pivot = array[int(len(array)/2)]
>       for i in array:
>           less = quicksort([x for x in array[:] if x < pivot])
>           equal = [x for x in array[:] if x == pivot]
>           more = quicksort([x for x in array[:] if x > pivot])
>       return less+equal+more
>
>
>
> me llama sobre manera esta linea, que aun no entiendo a ciencia cierta lo
> que hace
>
> less = quicksort([x for x in array[:] if x < pivot])
>

Como te decia otro contertulio, es muy facil de entender si comprendes
el quicksort. Basicamente es un algoritmo "divide y venceras" en el
que en cada iteración eligen un numero de la lista (pivote) y generas
dos listas a partir de el (los elementos mayores al pivote y en otra
los menores).

Vista la linea por partes:

array[:] #Con array tienes una referencia, con array[:] (un slice de
todo el) tienes una copia del array.
[x for x in array[:]] #http://es.diveintopython.org/odbchelper_map.html
[x for x in array[:] if x < pivot] # Genera una lista con los
elementos x (los copiados de array) cuyo valor sea menor que el
pivote.
quicksort([...]) # Ahora ya tienes una lista desordenada más pequeña
que en un principio, pero has dado un pequeño paso en la ordenación.
Tienes que repetir esos pasos hasta que la cadena esté ordenada del
todo.

>
> ahora bien.. porque digo todo esto preguntaran? pues me gustaria que se
> hablase un poco de este tipo de estilos y pues hasta que nivel llega la
> flexibilidad en python para hacer estas cosas, que no es muy normal ver.
> --

Python es muy flexible y te permite hacer las cosas de diferentes
formas. El ejemplo que tu pones es tipico de programación funcional.
Por desgracia, aunque ese codigo es ideal para haskell, no te
recomiendo que lo uses en python. Python permite programación
funcional, pero no tienes las optimizaciones de otros lenguajes. Te
explico los problemas:

* Cada vez que haces una llamada a una función tienes que guardar el
retorno en una zona de memoria llamada pila. En la mayoria de
lenguajes funcionales, la recursividad de cola es optimizada para
evitar este problema, python no te resuelve esto. ¿Cuantos retornos de
la función quicksort tienes en la pila? Ten en cuenta que la pila está
limitada y no vas a poder ordenar numeros grandes. Otras
implementaciones (menos concisas) hacen la tarea con iteraciones en
bucles.
* En cada iteración copias un trozo de cadena que sigue en memoria
hasta que se acaba el ciclo de recursión. ¿Cuantas veces tienes
copiada en memoria la lista que estas ordenando? Otras
implementaciones de quicksort intercambian elementos de la lista para
no tener que copiarla.

Como ves, esa forma de programar es muy concisa e incluso didactica,
pero no siempre es eficiente (aunque a veces la podras usar para
optimizar tu codio python). Te paso un enlace para que te introduzcas
un poco en el tema y sepas sacarle el jugo sin caer en las trampas que
esconde la programación funcional en python ;-)

http://www.amk.ca/python/writing/functional

Un saludo:
Javi

> Seamos realistas y hagamos lo imposible
> Linux Counter User #487374
>
> ---
> Nosotros los complacientes, guiados por lo desconocido, estamos haciendo lo
> imposible para los ingratos, y hemos estado haciendo tanto por tanto tiempo
> con tan poco, que ahora estamos capacitados a hacer cualquier cosa con nada
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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