varnimyr vanimir titulos titles the power pierce heaven elwiki elsword elrianode elianod eclipse for-loop python

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)]



Prueba esto:

while count > 0: pattern.append((random() - 0.5, random() - 0.5)) count -= 1



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 ...