eclipse - vanimir - Manera pitónica de escribir un bucle for que no usa el índice de bucle
pierce the heaven elsword (7)
Esto tiene que ver con el siguiente código, que usa un bucle for para generar una serie de compensaciones aleatorias para usar en cualquier otro lugar del programa.
El índice de este bucle for no se usa, y esto está provocando que el código "ofensivo" se destaque 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 necesito una forma mejor de escribir este ciclo que no necesita un índice de bucle, o una manera de decirle a PyDev que ignore esta instancia particular de una variable no utilizada.
¿Alguien tiene alguna sugerencia?
¿Qué tal 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))
Muestra de salida:
[(-0.056940506273799985, 0.27886450895662607),
(-0.48772848046066863, 0.24359038079935535),
(0.1523758626306998, 0.34423337290256517),
(-0.018504578280469697, 0.33002406492294756),
(0.052096928160727196, -0.49089780124549254)]
Debería haber una forma de suprimir los errores de análisis de código en PyDev, como este:
http://pydev.org/manual_adv_assistants.html
Además, PyDev ignorará las variables no utilizadas que comiencen con un guión bajo, como se muestra aquí:
Prueba esto:
while count > 0:
pattern.append((random() - 0.5, random() - 0.5))
count -= 1
Solo como referencia para ignorar variables en PyDev
Por defecto, pydev ignorará las siguientes variables
[''_'', ''empty'', ''unused'', ''dummy'']
Puede 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
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 ese código duplicado que tienes al escribir random() - 0.5
dos veces al ponerlo en una lambda.
En segundo lugar, para un cierto rango de tamaño, elige usar xrange()
lugar de range()
para no generar innecesariamente una lista gigante de números que va 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 una cuestión de eficiencia potencial.
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 una lista
randomSample = [(random() - 0.5, random() - 0.5) for _ in range(count)]
Ejemplo de salida, para count=10
y suponiendo que se refiere a la función Standard Library random()
:
[(-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 necesita hacer una función, puede abreviar usando una lambda
:
f = lambda count: [(random() - 0.5, random() - 0.5) for _ in range(count)]
De esta manera puedes llamarlo así:
>>> 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)]
>>>
entiendes la idea ...