Forma pythonica de escribir un bucle for que no usa el índice de bucle

Esto tiene que ver con el siguiente código, que utiliza un bucle for para generar una serie de compensaciones aleatorias para su uso en otras partes del progtwig.

El índice de este bucle for no se utiliza, y esto hace que el código “ofensivo” se resalte como una advertencia de Eclipse / PyDev

def RandomSample(count): pattern = [] for i in range(count): pattern.append( (random() - 0.5, random() - 0.5) ) return pattern 

Entonces, o bien necesito una mejor manera de escribir este bucle que no necesita un índice de bucle, o una forma de decirle a PyDev que ignore esta instancia particular de una variable no utilizada.

¿Alguien tiene alguna sugerencia?

 randomSample = [(random() - 0.5, random() - 0.5) for _ in range(count)] 

Salida de muestra, para count=10 y suponiendo que se refiere a la función random() biblioteca estándar:

 [(-0.07, -0.40), (0.39, 0.18), (0.13, 0.29), (-0.11, -0.15),\ (-0.49, 0.42), (-0.20, 0.21), (-0.44, 0.36), (0.22, -0.08),\ (0.21, 0.31), (0.33, 0.02)] 

Si realmente necesitas convertirla en una función, entonces puedes abreviar usando una lambda :

 f = lambda count: [(random() - 0.5, random() - 0.5) for _ in range(count)] 

De esta manera puedes llamarlo como:

 >>> f(1) f(1) [(0.03, -0.09)] >>> f(2) f(2) [(-0.13, 0.38), (0.10, -0.04)] >>> f(5) f(5) [(-0.38, -0.14), (0.31, -0.16), (-0.34, -0.46), (-0.45, 0.28), (-0.01, -0.18)] >>> f(10) f(10) [(0.01, -0.24), (0.39, -0.11), (-0.06, 0.09), (0.42, -0.26), (0.24, -0.44) , (-0.29, -0.30), (-0.27, 0.45), (0.10, -0.41), (0.36, -0.07), (0.00, -0.42)] >>> 

tienes la idea …

Solo como referencia para ignorar variables en PyDev

Por defecto, Pydev ignorará las siguientes variables.

 ['_', 'empty', 'unused', 'dummy'] 

Puedes agregar más pasando parámetros de supresión

 -E, --unusednames ignore unused locals/arguments if name is one of these values 

Ref: http://eclipse-pydev.sourcearchive.com/documentation/1.0.3/PyCheckerLauncher_8java-source.html

¿Qué hay de itertools.repeat

 import itertools count = 5 def make_pat(): return (random() - 0.5, random() - 0.5) list(x() for x in itertools.repeat(make_pat, count)) 

Salida de muestra:

 [(-0.056940506273799985, 0.27886450895662607), (-0.48772848046066863, 0.24359038079935535), (0.1523758626306998, 0.34423337290256517), (-0.018504578280469697, 0.33002406492294756), (0.052096928160727196, -0.49089780124549254)] 

Tarde a la fiesta, pero aquí hay una idea potencial:

 def RandomSample(count): f = lambda: random() - 0.5 r = range if count < 100 else xrange # or some other number return [(f(), f()) for _ in r(count)] 

Estrictamente hablando, esto es más o menos lo mismo que las otras respuestas, pero hace dos cosas que me parecen agradables.

Primero, elimina el código duplicado que tiene al escribir random() - 0.5 dos veces al colocarlo en un lambda.

Segundo, para un cierto rango de tamaño, elige usar xrange() lugar de range() para no generar innecesariamente una lista gigante de números que vas a tirar. Es posible que desee ajustar el número exacto, porque no he jugado con él en absoluto, solo pensé que podría ser un problema de eficiencia potencial.

Debería haber una manera de suprimir los errores de análisis de código en PyDev, de esta manera:

http://pydev.org/manual_adv_assistants.html

Además, PyDev ignorará las variables no utilizadas que comienzan con un guión bajo, como se muestra aquí:

http://pydev.org/manual_adv_code_analysis.html

Prueba esto:

 while count > 0: pattern.append((random() - 0.5, random() - 0.5)) count -= 1 
 import itertools, random def RandomSample2D(npoints, get_random=lambda: random.uniform(-.5, .5)): return ((r(), r()) for r in itertools.repeat(get_random, npoints)) 
  • usa random.uniform() explícitamente
  • devuelve un iterador en lugar de lista