關(guān)于 range 函數(shù)
Python
內(nèi)置的range
函數(shù)可以接收三個(gè)參數(shù):
class range(stop):
...
class range(start, stop[, step]):
...
標(biāo)準(zhǔn)庫(kù)中解釋為:range
構(gòu)造器的參數(shù)必須為整數(shù)(可以是內(nèi)置的 int
或任何實(shí)現(xiàn)了 __index__
特殊方法的對(duì)象)。如果省略 step
參數(shù)分唾,其默認(rèn)值為 1
;如果省略 start
參數(shù),其默認(rèn)值為 0
仁讨,如果 step
為零則會(huì)引發(fā) ValueError
。
range 的使用
range
函數(shù)返回的結(jié)果會(huì)包含 start
參數(shù)实昨,而不包含 stop
參數(shù)洞豁,當(dāng)接收到的參數(shù)只有 1 位時(shí),range
會(huì)把這位參數(shù)作為 stop
荒给,當(dāng)接受到的參數(shù)有 2 位時(shí)丈挟,則第 2 位參數(shù)會(huì)被視為 stop
,只有當(dāng)接收 3 位參數(shù)時(shí)志电,默認(rèn)的 step
才會(huì)被傳入的參數(shù)代替曙咽,也就是說(shuō),如果我們需要 0 到 5 之間的數(shù)字挑辆,每隔 2 個(gè)整數(shù)返回例朱,那么第一個(gè)參數(shù) start
就算為 0
,也必須顯示的指定才行鱼蝉,否則傳入的 2 個(gè)參數(shù)將被視為 start
和 stop
洒嗤,示例:
>>> list(range(0, 5, 2))
[0, 2, 4]
>>> list(range(5, 2))
[]
那么,按照 Python 定義函數(shù)的方式魁亦,這是怎么實(shí)現(xiàn)的呢渔隶?
range 參數(shù)的實(shí)現(xiàn)
很明顯,如果在 Python 中定義一個(gè)函數(shù)洁奈,要讓第二個(gè)參數(shù)為固定參數(shù)间唉,第一和第三個(gè)參數(shù)為默認(rèn)參數(shù)是會(huì)引發(fā)語(yǔ)法錯(cuò)誤的:
>>> def range(start=0, stop, step=1):
>>> pass
File "<ipython-input-23-876b8b222e30>", line 1
def range(start=0, stop, step=1):
^
SyntaxError: non-default argument follows default argument
那么怎樣才能用 Python 實(shí)現(xiàn)這樣的操作呢,有兩種方法可以參考:
1. 定義可變參數(shù)
判斷傳入?yún)?shù)的個(gè)數(shù)利术,如果是一個(gè)則作為 stop
參數(shù)终吼,如果是兩個(gè)則將第 1 個(gè)作為 start
參數(shù),同 range
一樣氯哮,該方法不接受關(guān)鍵字參數(shù)的傳入际跪,示例:
def range(*params):
if 3 < len(params) < 1:
raise ValueError('range takes 1 - 3 arguments')
elif len(params) == 1
b = params[0]
else:
a, b = params[:2]
c = params[2] if len(params) > 2 else 1
2. 交換參數(shù)
設(shè)置 stop
和 step
的默認(rèn)值商佛,該方法可以接收關(guān)鍵字參數(shù)的傳入。示例:
def range(start, stop=None, step=1):
if stop is None:
start, stop = 0, start