[Python-es] namespaces y variables globales

Chema Cortes pych3m4 en gmail.com
Dom Nov 7 02:39:34 CET 2010


El día 5 de noviembre de 2010 13:35, jordi torrents
<jtorrents en milnou.net> escribió:

> En mi defensa tengo que decir que no soy programador (soy sociólogo) y
> utilizo python básicamente para hacer análisis de redes complejas. Así
> que algunas cosas se me escapan y las voy aprendiendo sobre la marcha.
> Sin duda hoy he aprendido algo ;)

Pienso que no tienes nada de qué disculparte. Este código es muy
bueno, vengas de la disciplina que vengas.

Una cosa que puedes mejorar es en el uso de "generadores" en lugar de
comprensión de listas, apropiados sobre todo en cálculos repetitivos.
Por ejemplo:

> def sum_primes(n):
>    """Calculates sum of all primes below given integer n"""
>    return sum([x for x in xrange(2,n) if isprime(x)])

Mejor hacerlo así:

  return sum(x for x in xrange(2,n) if isprime(x))

Al no necesitar crear la lista, se ahorra tiempo y memoria. Tal vez no
sea mucho el ahorro, pero en este otro caso puede ser más claro:

>    jobs = [(input, job_server.submit(sum_primes,(input,),\
>        (isprime,), ("math",))) for input in inputs]
>    for input, job in jobs:
>        print "Sum of primes below", input, "is", job()

jobs= ( (input, job_server.submit(sum_primes,(input,),(isprime,), ("math",)))
            for input in inputs )
for input, job in jobs:
   print "Sum of primes below", input, "is", job()

De este modo sólo existirá un job_server, el que se ejecuta, en contra
de como lo tenías donde estaban todos los job_servers previamente
creados como elementos de una lista. Al usar un generador, los
job_server se crean (y se destruyen) a medida que se van ejecutando.

(NOTA: cuando estés enumerando elementos de una secuencia no hace
falta el indicador "\" de continuación de línea)


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