新手,據我所知,在可選引數之后不能有非可選引數,所以當我看到 range() 方法的檔案時,我很困惑。這是怎么回事,我錯過了什么嗎?
它說 start 引數是可選的,默認為 1,但第二個引數 stop 是強制性的。
鏈接到 range() 函式:https : //docs.python.org/3/library/stdtypes.html
uj5u.com熱心網友回復:
Range 最多需要三個(未命名的)引數 - start、end和step。
如果只傳遞一個引數,則假定start為零并且給定的引數為end。
因此,例如,range(5) 與 range(0,5) 完全相同。
但是,如果您想提供步長值,即使start旨在為零,您也必須傳遞所有三個引數- 例如,range(0, 10, 2)
uj5u.com熱心網友回復:
該檔案列出了兩種情況:
class range(stop)
class range(start, stop[, step])
因此,如果您只傳遞一個引數,則適用第一種情況;該函式將引數解釋為stop。
如果您傳遞多個引數,則屬于第二種情況;該函式將第一個引數解釋為start,依此類推。
在任何一種情況下,可選引數 ( [step]) 都在強制引數之后。只是“第一個論點”的解釋在兩種情況下是不同的。
uj5u.com熱心網友回復:
根據傳遞的引數范圍的數量,行為會發生變化。
- 如果傳遞了 1 個引數,它將開始視為隱式,唯一的引數視為停止值。
- 如果傳遞了 2 個引數,它會將第一個引數視為起始值,將第二個引數視為停止值。
- 如果傳遞了 3 個引數,它將第一個引數視為起始值,第二個引數視為停止值,第三個引數視為步長。
下面是一個人為的、可能有問題的例子,說明如何實作這樣的功能:
def myrange(arg1, arg2=None, arg3=None):
if not arg2:
return range(arg1)
if not arg3:
return range(arg2, arg1)
return range(arg2, arg1, arg3)
uj5u.com熱心網友回復:
確實,除非使用 kwargs,否則在可選引數之后不能有非可選引數,但是 range 是一個特殊的類,它是 Python 的內置類,它的源代碼實際上是用 C 撰寫的。所以 range 是一個特殊的類,如果您:
- 傳入一個引數它的停止(它假設從 0 開始,第 1 步)
- 傳入兩個引數,它是開始,停止(假設步驟 1)
- 傳入三個引數,它是開始、停止、步驟
在普通的 python 函式和類中,雖然 afaik 你不能像那樣覆寫順序。除非您使用跟蹤輸入的包裝函式。
uj5u.com熱心網友回復:
如果你想自己實作一個具有不同簽名的函式(比如 range()),你可以這樣做:
def myRange(*args):
if len(args) == 1: start,stop,step = 0,*args,1
elif len(args) == 2: start,stop,step = *args,1
else: start,stop,step,*_ = args
print(start,stop,step)
# ... work with start, stop, step ..
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325009.html
上一篇:如何將用戶輸入作為方法傳遞?
