2012-01-02 30 views
5

Về cơ bản tôi muốn đi từ -1 đến 1 trong n bước, bao gồm -1 và 1:Cách thanh lịch nhất để viết điều này cho vòng lặp trong Python là gì?

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 

Làm thế nào tôi có thể viết này trong, cách đơn giản nhất thanh lịch nhất cho giá trị bất kỳ n?

+2

câu hỏi liên quan: http://stackoverflow.com/questions/8652006 – juliomalegria

Trả lời

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, tại sao bạn xóa cái này? Tôi sử dụng cái này và nó có vẻ hoạt động. Có vấn đề gì với vấn đề này không? : O –

+1

@JoanVenge Tôi nghĩ rằng tôi đã thấy một vấn đề, và sau đó kiểm tra lại nó một phút trước và thấy không có vấn đề gì, vì vậy tôi đã hủy xóa nó. –

+0

Cảm ơn người đàn ông, tôi thích loại thủ thuật đơn giản này. –

11

Không có sẵn trong dung dịch, nhưng có lẽ là một cách tốt để giải quyết nó là xác định riêng range chức năng của bạ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)] 

Và bạn có thể sử dụng nó trong một cho vòng lặp:

>>> 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: Như @NiklasBaumstark đã đề xuất, nếu chức năng mới của bạn my_range sẽ xử lý một số lượng lớn các số, có thể là ý tưởng hay khi sử dụng generators. Vì mục đích đó, chúng tôi sẽ làm chỉ là một chút thay đổi:

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

Bạn thực sự nên sử dụng một máy phát điện có thay tạo danh sách tạm thời. –

+0

@NiklasBaumstark: bạn hoàn toàn đúng, tôi sẽ thêm nó vào câu trả lời của tôi – juliomalegria

11

Nếu đó là OK để sử dụng numpy, điều này hoạt động tốt:

import numpy as np 
n = 21 

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

tôi sẽ đi với

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

Hai điều quan tâm: xrange hiệu quả hơn range và không có ed có hai biến lặp riêng biệt.

Bạn có thể bọc này trong một chức năng nếu bạn tìm thấy nó thường xuyên hữu ích:

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

mặc dù bạn có thể muốn làm cho các thông số giới hạn dưới và trên là tốt, như trong câu trả lời của julio.alegria.

2

Bạn nói bạn đã có câu trả lời, nhưng tôi cảm thấy rằng đây là một giải pháp thanh lịch. Nó cũng loại bỏ khả năng các vấn đề dấu phẩy động lạ (ít nhất, từ phạm vi được xác định). Nó kết hợp sức mạnh và tính linh hoạt của máy phát điện cùng với định dạng chuỗi và giá trị dấu phẩy động. Ngoài ra, bạn có thể tránh được nhiều điều này nếu bạn chọn sử dụng mô-đun Decimal - nhưng điều đó sẽ yêu cầu tinh chỉnh nhiều hơn một chút.

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

Một ví dụ chạy:

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

Những kết quả đầu ra:

-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 
Các vấn đề liên quan