2017-07-09 49 views
1

我對某個特定用例中range()函數的行爲有些困惑。Python3,範圍(a,b)函數行爲和空列表

當我測試一些使用嵌套FOR循環寫入的代碼時,在某些情況下,某些循環中的語句似乎永遠不會執行。我終於意識到,我在一些情況下,供給範圍()調用與像輸入:

range(i,2) # where i is 2, giving range(2,2)

...它扔了錯誤,但顯然從未執行for循環的內容。在Python3的實施一些閱讀後,我再補充說:「還有:」語句我的循環:

for i in range(a,b): # where a=b, i.e. range(2,2) 
    [skipped code] 
else: 
    [other code] 

...和其他情況下的代碼執行罰款,因爲我想所有可能的迭代器給定的範圍值(已經)已經耗盡,並且for-else的情況被觸發,因爲它被設計爲當這種情況發生時。

從我在range()的文檔中可以看到的,我發現:「如果r [0]不符合值約束,則範圍對象將爲空。 (https://docs.python.org/3/library/stdtypes.html#range)。我不太清楚在這種情況下「價值約束」是什麼,但如果我理解正確,「範圍(a,b)」將返回一個空列表,如果a> = b。

我的問題是,我的理解是否正確關於何時range()返回[]?另外,還有其他種類的範圍(a,b)返回[]的輸入情況,或者我應該注意的其他不明顯的邊界情況行爲?謝謝。

回答

1

範圍(n)的產生一個迭代進步的整數從0開始,並與第(n-1)結束。

參考你的FOR循環,它沒有被執行,因爲結尾數字(即n - 1 = 2 - 1 = 1)小於起始數字2,因爲FOR循環中省略了step參數,它默認爲1.該步驟既可以是負數也可以是正數,但不能爲零。

語法:
       範圍(開始,結束[步驟])

實例:
兩個例子都低於會產生空列表。

  • 名單(範圍(0))
  • 名單(範圍(2,2))

enter image description here

+0

感謝您的概述和示例,這有助於澄清行爲。 –

1

正如您在this文檔中所看到的,當您使用range(a,b)時,您正在設置其啓動和停止參數。

你需要知道的是停止參數總是被排除在外,就像列表切片一樣。

另一個要點是,你可以設置step,所以如果你設置你實際上可以在這種情況下使用a >= b像負步:

range(10,4,-1) 

也請注意,所有參數都必須爲整數。

我建議您訪問上面提供的文檔,這很有幫助。

+1

這是一個更好的文檔基準比我能發現,當我搜索, 謝謝!這看起來很有幫助。 –

相關問題