1. 程式人生 > >python3中的range()函式

python3中的range()函式

先介紹一下range()函式的用法:

>>> range(1,5) #代表從1到5(不包含5)
[1, 2, 3, 4]
>>> range(1,5,2) #代表從1到5,間隔2(不包含5)
[1, 3]
>>> range(5) #代表從0到5(不包含5)
[0, 1, 2, 3, 4]

在python3中,直接列印range()函式,如下:

print (range(1,100));
>>> range(1, 100)

而不是我們期望的輸出 [1, 2, 3, 4, 5, 6, 7, 8,......98, 99]

這是由於版本的問題,在python2中是可以輸出我們期望的結果。

根據官方的說明是:

在很多種情況下,range()函式返回的物件的行為都很像一個列表,但是它確實不是一個列表,它只是在迭代的情況下返回指定索引的值,但是它並不會在記憶體中真正產生一個列表物件,這樣也是為了節約記憶體空間。

我們稱這種物件是可迭代的,或者是可迭代物件,還有一種物件叫迭代器,它們需要從一個可迭代物件中連續獲取指定索引的值,一直到索引結束。list()函式就是這樣一個迭代器,它可以把range()函式返回的物件變成一個列表。

總結:

range() 函式返回的是一個可迭代物件(型別是物件),而不是列表型別, 所以列印的時候不會列印列表。

list() 函式是物件迭代器,把物件轉為一個列表。返回的變數型別為列表。

所以我們可以將range()函式放入list()函式物件迭代器裡面,就可以返回我們期望的結果。

print (list(range(1,10)));
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

類似的函式還有:filter()

'''
請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
'''
import math
def is_sqr(x):
    return math.sqrt(x) % 1 == 0

print ( list(filter(is_sqr, list(range(1,101)))) );

>>> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]