2012-01-02 2 views

risposta

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, perché l'hai cancellato? Io uso questo e sembra funzionare. C'è un potenziale problema con questo? : O –

+1

@JoanVenge Pensavo di aver visto un problema, quindi di ricontrollarlo un minuto fa e ho scoperto che non c'erano problemi, quindi l'ho annullato. –

+0

Grazie amico, mi piace questo tipo di trucchi semplici e divertenti. –

11

Non c'è una soluzione integrata, ma probabilmente un buon modo per risolverlo è quello di definire il proprio range funzione:

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

E si può utilizzare in un ciclo for:

>>> 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: Come suggerito @NiklasBaumstark, se la nuova funzione my_range sta per gestire una grande quantità di numeri che è probabilmente una buona idea usare generators. A tal fine, faremo solo una piccola modifica:

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

Si dovrebbe utilizzare un generatore di lì, invece di creare un elenco temporaneo. –

+0

@NiklasBaumstark: hai perfettamente ragione, lo aggiungerò alla mia risposta – juliomalegria

11

Se è OK per utilizzare numpy, questo funziona bene:

import numpy as np 
n = 21 

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

vorrei andare con

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

Due cose di interesse: xrange è più efficiente di range, e non c'è ne ed avere due variabili iteratore separate.

Si potrebbe avvolgere questo in una funzione se lo trovi spesso utile:

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

anche se si sarebbe probabilmente vuole fare i parametri limiti inferiore e superiore, nonché, come in risposta di julio.alegria.

2

Hai detto di avere la tua risposta, ma ritengo che questa sia una soluzione elegante. Elimina anche la possibilità di strani problemi in virgola mobile (almeno, nell'intervallo definito). Combina la potenza e la flessibilità dei generatori con la formattazione delle stringhe e i valori in virgola mobile. In alternativa, è possibile evitare molto di ciò se si sceglie di utilizzare il modulo Decimal, ma ciò richiederebbe un ulteriore miglioramento.

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

Un esempio di esecuzione:

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

quali uscite:

-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