2012-01-02 25 views
5

Temelde ben dahil n adımda 1'e -1 den gitmek istiyorum -1 ve 1:Python'da bu döngü için yazmanın en zarif yolu nedir?

x = -1.0 
n = 21 

for i in range(n): 
    print x 
    x += 0.01 

-1.0 -0.9 -0.8 ... 0.8 0.9 1.0 

Nasıl herhangi n değeri için en şık, en basit şekilde bu yazabilirim?

+2

ilgili soru: http://stackoverflow.com/questions/8652006 Gerçekten yerine oraya bir jeneratör kullanmalıdır – juliomalegria

cevap

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'a ekleyeceğim, neden bunu sildiniz? Bunu kullanıyorum ve işe yarıyor. Bu konuda potansiyel bir sorun var mı? : O –

+1

@JoanVenge Bir sorun gördüğümü düşündüm ve bir dakika önce tekrar kontrol ettim ve bir sorun olmadığını gördüm, bu yüzden geri aldım. –

+0

Teşekkürler adamım, bu tür basit basit hileleri seviyorum. –

11

yerleşik bir çözüm, ama muhtemelen bu kendi range fonksiyonunu tanımlamaktır çözmek için iyi bir yol yoktur:

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

Ve bir for döngüsü içinde kullanabilirsiniz:

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

DÜZENLEME: @NiklasBaumstark önerilen olarak yepyeni my_range fonksiyon numaralarının büyük miktarda işlemek için gidiyor eğer, muhtemelen generators kullanmak için iyi bir fikirdir. Bu amaçla, sadece biraz değişiklik yapacağız:

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

geçici liste oluşturma. –

+0

@NiklasBaumstark: Tamamen haklısın, cevabımı – juliomalegria

11

o numpy kullanmak için sorun yoksa, bu iyi çalışır:

import numpy as np 
n = 21 

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

Ben

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

İlgilendiğiniz iki şey: xrangerange'den daha verimlidir, ve ne yok ne iki ayrı yineleyici değişkenine sahip olmak.

Sen sıklıkla yararlı bulursanız bir fonksiyon içerisine sarabilirdiniz:

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

muhtemelen julio.alegria yanıtında olduğu gibi, hem alt ve üst limitler parametrelerini yapmak isterdim rağmen.

2

Cevabınızı aldığını söylemiştiniz, ama bunun güzel bir çözüm olduğunu düşünüyorum. Ayrıca, garip kayan nokta sorunları olasılığını ortadan kaldırır (en azından tanımlanmış aralıktan). Jeneratörlerin güç ve esnekliğini, dize biçimlendirmesi ve kayan nokta değerleri ile birleştirir. Alternatif olarak, Decimal modülüyle devam etmeyi seçtiyseniz, bunun çoğundan kaçınabilirsiniz, ancak bu biraz daha fazla değişiklik gerektirebilir.

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

bir örnek çalışma:

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

verir:

-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 
İlgili konular