2013-08-12 32 views
5

Bất cứ khi nào tôi cố gắng gán một phạm vi cho một biến như sau:Gán một phạm vi cho một biến (Python)

Var1 = range(10, 50) 

Sau đó thử để in các biến:

Var1 = range(10, 50) 
print(Var1) 

Nó chỉ đơn giản in ' phạm vi (10, 50) 'thay vì tất cả các số trong danh sách. Tại sao điều này?

+0

Đây có phải là Python 3 không? –

+0

@David Z Có. Nó là. – Justin

Trả lời

11

Thats vì range trả về một đối tượng phạm vi bằng Python 3. Đặt nó trong list để làm cho nó làm những gì bạn muốn:

>>> Var1 = range(10, 50) 
>>> print(list(Var1)) 
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] 
>>> 
+0

Ok. Cảm ơn. Những công việc này. Vì vậy, tôi đoán bạn phải đại diện cho phạm vi của các số như là một danh sách cho nó để có thể in đúng cách. – Justin

+0

Có. Trong Python 2.x, 'range' trả về một danh sách như bạn muốn. Trong 3.x, chúng làm cho nó trả về một đối tượng phạm vi. – iCodez

-1

Đây là điều mà đã được thay đổi bằng Python 3.0. Bạn có thể tạo lại một chức năng tương tự trong Python 2.7 như vậy,

def range(low, high=None): 
    if high == None: 
    low, high = 0, low 
    i = low 
    while i < high: 
    yield i 
    i += 1 

Lợi ích của việc này là danh sách không phải được tạo trước khi sử dụng.

for i in range(1,999999): 
    text = raw_input("{}: ".format(i)) 
    print "You said {}".format(text) 

Những công trình như thế này:

1: something 
You said something 
2: something else 
You said something else 
3: another thing 
You said another thing 

Trong Python 3.x, nếu chúng ta không bao giờ có được đến cuối vòng lặp của chúng tôi (999.997 lặp), nó sẽ không bao giờ tính toán tất cả các mục. Trong Python 2.7 nó phải xây dựng toàn bộ phạm vi ban đầu. Trong một số triển khai Python cũ hơn, điều này rất chậm.

7

Bạn có lẽ nên hiểu một chút về những gì đang xảy ra dưới mui xe.

Trong python 3, range trả về đối tượng range, không phải danh sách như bạn mong đợi. (N.b. python 3 của range là python 2 của xrange)

#python 2 
>>> type(range(5)) 
<type 'list'> 

#python 3 
>>> type(range(5)) 
<class 'range'> 

Điều đó có nghĩa gì? Vâng, đối tượng phạm vi chỉ đơn giản là một trình lặp - bạn cần ép buộc nó lặp lại để lấy nội dung của nó. Điều đó có thể gây khó chịu cho trẻ sơ sinh, nhưng hóa ra lại khá hữu ích.

>>> import sys 
>>> sys.getsizeof(range(5)) 
24 
>>> sys.getsizeof(range(1000000)) 
24 

Lợi thế lớn nhất khi thực hiện theo cách này: dấu chân bộ nhớ không đổi (nhỏ). Vì lý do này, nhiều thứ những thứ trong thư viện chuẩn chỉ cần trả về trình lặp. Sự cân bằng là nếu bạn chỉ muốn xem phạm vi lặp lại, bạn phải ép buộc nó lặp lại. Thành ngữ phổ biến nhất để làm điều đó là list(range(n)). Ngoài ra còn có sự hiểu biết, các vòng for và nhiều phương pháp bí truyền hơn. Iterator là một phần rất lớn của việc học python để làm quen với chúng!