2012-01-02 17 views

Respuesta

5
startValue = -1.0 
intervalLength = 2.0 
numberOfSteps = 14 
increasePerStep = intervalLength/numberOfSteps 

print startValue 

x = startValue 
for i in range (numberOfSteps): 
    x += increasePerStep 
    print x 


-1.0 
-0.857142857143 
-0.714285714286 
-0.571428571429 
-0.428571428571 
-0.285714285714 
-0.142857142857 
-2.22044604925e-16 
0.142857142857 
0.285714285714 
0.428571428571 
0.571428571429 
0.714285714286 
0.857142857143 
1.0 
+0

Michael, ¿por qué eliminaste este? Yo uso este y parece funcionar. ¿Hay un problema potencial con este? : O –

+1

@JoanVenge Creí haber visto un problema y lo volví a comprobar hace un minuto y descubrí que no había ningún problema, así que lo recuperé. –

+0

Gracias, hombre, me gusta este tipo de trucos sencillos y geniales. –

11

No hay una solución integrada, pero probablemente una buena manera de resolverlo es definir su propia range función:

def my_range(start, end, how_many): 
    incr = float(end - start)/(how_many - 1) 
    return [start + i*incr for i in range(how_many)] 

Y se puede usar en un bucle para:

>>> for i in my_range(-1, 1, 10): 
... print i 
... 
-1.0 
-0.777777777778 
-0.555555555556 
-0.333333333333 
-0.111111111111 
0.111111111111 
0.333333333333 
0.555555555556 
0.777777777778 
1 

EDIT: Como sugirió @NiklasBaumstark, si su nueva función my_range va a manejar una gran cantidad de números que es probablemente una buena idea utilizar generators. Para ese propósito, lo haremos sólo una pequeña modificación:

def my_xrange(start, end, how_many): 
     incr = float(end - start)/(how_many - 1) 
     return (start + i*incr for i in xrange(how_many)) 
+6

que realmente debe utilizar un generador de allí en vez de crear una lista temporal. –

+0

@NiklasBaumstark: tienes toda la razón, lo agregaré a mi respuesta – juliomalegria

11

Si bien usar numpy, esto funciona bien:

import numpy as np 
n = 21 

for i in np.linspace(-1, 1, n): 
    print i 
3

Me gustaría ir con

for x in xrange(n): 
    print float(2*x)/(n-1) - 1 

Dos cosas de interés: xrange es más eficiente que range, y no hay ne ed para tener dos variables de iterador separadas.

Usted podría terminar con esto de una función, si lo encuentra con frecuencia útil:

def linspace1(n): 
    for x in xrange(n): 
     yield float(2*x)/(n-1) - 1 

aunque probablemente querrá hacer que los parámetros de límites inferior y superior, así como en la respuesta de julio.alegria.

2

Dijiste que tenías tu respuesta, pero creo que esta es una solución elegante. También elimina la posibilidad de problemas de coma flotante extraños (al menos, desde el rango definido). Combina la potencia y la flexibilidad de los generadores junto con el formato de cadenas y los valores de coma flotante. Alternativamente, puede evitar mucho de esto si elige ir con el módulo Decimal, pero eso requeriría un poco más de ajuste.

def decimal_stepper(start, end, step=0.1): 
    while start <= end: 
     yield float(start) 
     start = float(('%' + str(step) + 'f') % (start+step)) 

Un ejemplo de ejecución:

myVals = decimal_stepper(-1, 1) 
for x in myVals: 
    print x 

que da salida:

-1.0 
-0.9 
-0.8 
-0.7 
-0.6 
-0.5 
-0.4 
-0.3 
-0.2 
-0.1 
0.0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1.0 
Cuestiones relacionadas