2011-09-23 41 views
17

Giả sử tôi muốn lặp từ 0 đến 100 nhưng với một bước 1/2. Nếu bạn thửChức năng phạm vi Python

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

gọi là lỗi nói rằng bước này không được 0. Có cách nào được xây dựng để làm điều gì đó như thế này không?

Tôi đang sử dụng Python 2.một cái gì đó bằng cách này.

Cảm ơn

+0

Nhìn vào một số câu trả lời này sẽ tạo ra một câu hỏi đảo ngược mã tuyệt vời ... – ktdrv

Trả lời

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 

Nếu bạn có thể sử dụng numpy, thì numpy.arange(0, 100, 0.5) cũng sẽ thực hiện thủ thuật.

+0

Cách tiếp cận thú vị, nhưng tôi thích nó. :) –

+0

@NPE Tôi có thiếu gì đó ở đây không? Đây là kết quả 'TypeError: range() đối số kết thúc số nguyên dự kiến, có float.' – gongzhitaao

+0

@gongzhitaao: Bạn hoàn toàn đúng, điều này cần chuyển đổi rõ ràng thành' int' (xem phần chỉnh sửa). Vì câu trả lời đã được viết cách đây hơn hai năm, tôi không thể nhớ tại sao tôi lại viết nó như thế. – NPE

3

Bạn sẽ phải tạo vòng lặp theo cách thủ công hoặc xác định chức năng phạm vi tùy chỉnh của riêng bạn. Việc xây dựng trong đòi hỏi một giá trị bước số nguyên.

4

Bạn phải sử dụng các bước số nguyên cho range() và xrange(). Đó là lý do tại sao bước 0.5 của bạn được chuyển đổi nội bộ thành 0 và bạn nhận được lỗi đó. Hãy thử for i in [j/2.0 for j in xrange(100 * 2)]:

+0

Cắt ngang số nguyên xảy ra với điều này, vì vậy bạn chỉ cần lặp lại mỗi số nguyên hai lần. –

+0

Đã sửa lỗi, cảm ơn. – ktdrv

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

'map' và hàm lambda cho một lần lặp đơn giản? Có vẻ lập trình mát mẻ và chức năng nhưng trong thực tế, nó sẽ chỉ thêm độ phức tạp tính toán không cần thiết. – ktdrv

9

Nếu bạn có numpy, đây là hai cách để làm điều đó:

numpy.arange(0, 100, 0.5) 

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

Đối với các khoảng lớn nó là tốt hơn để sử dụng một biểu thức máy phát điện so với việc xây dựng một danh sách rõ ràng:

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

Điều này tiêu thụ không nhiều bộ nhớ bổ sung, nhanh chóng không dễ đọc. Xem http://docs.python.org/tutorial/classes.html#generator-expressions

+3

Trong Python 2, bạn sẽ đánh bại sự tiết kiệm bộ nhớ của một biểu thức máy phát vì phạm vi() tạo ra một danh sách; sử dụng xrange() để thay thế. Trong Python 3, xrange() thay thế dải ô(). –

Các vấn đề liên quan