2011-09-23 26 views
17

Digamos que quiero hacer un ciclo de 0 a 100 pero con un paso de 1/2. Si pruebaFunción de rango Python

for i in range(0, 100, 0.5): 
    whatever 

llama un error que indica que el paso no debe ser 0. ¿Hay alguna manera incorporada de hacer algo como esto?

Estoy usando Python 2.algo por cierto.

Gracias

+0

En cuanto a algunas de las respuestas, esto sería una excelente pregunta de golf de código reverso ... – ktdrv

Respuesta

21
In [1]: for i in range(0, int(100/0.5)): 
    ...:  print 0.5 * i 
    ...:  
    ...:  
0.0 
0.5 
1.0 
1.5 
... 
98.0 
98.5 
99.0 
99.5 

Si puede utilizar numpy, entonces numpy.arange(0, 100, 0.5) también haría el truco.

+0

Enfoque interesante, pero me gusta. :) –

+0

@NPE ¿Me estoy perdiendo algo aquí? Aquí está el resultado 'TypeError: range() entero end argument esperado, got float. – gongzhitaao

+0

@gongzhitaao: Tiene toda la razón, esto necesita una conversión explícita a' int' (ver la edición). Dado que la respuesta fue escrita hace más de dos años, no puedo recordar por qué la escribí tal como es. – NPE

3

Vas a tener que crear el bucle sea manualmente, o definir su propia función de rango personalizado. El built-in requiere un valor de paso entero.

4

Tiene que usar pasos enteros para range() y xrange(). Es por eso que su 0.5 paso se convierte internamente a 0 y obtiene ese error. Trate for i in [j/2.0 for j in xrange(100 * 2)]:

+0

El truncamiento de enteros ocurre con esto, por lo que simplemente repite cada número entero dos veces. –

+0

Solucionado, gracias. – ktdrv

0
for x in map(lambda i: i * 0.5, range(0,200)): 
    #Do something with x 
+0

'map' y una función lambda para un simple iterable? Parece una programación genial y funcional, pero, en realidad, solo agregaría complejidad computacional innecesaria. – ktdrv

9

Si tiene numpy, aquí hay dos maneras de hacerlo:

numpy.arange(0, 100, 0.5) 

numpy.linspace(0, 100, 200, endpoint=False) 
0

Para grandes rangos, es mejor utilizar una expresión generador de construir una lista explícita:

for k in (i*0.5 for i in range(200)): 
    print k 

Esto no consume mucha memoria extra, es rápido y fácil de leer. Ver http://docs.python.org/tutorial/classes.html#generator-expressions

+3

En Python 2, estarías derrotando los ahorros de memoria de una expresión de generador ya que range() produce una lista; use xrange() en su lugar. En Python 3, xrange() reemplaza el rango(). –

Cuestiones relacionadas