10.04 Python range()的解釋和可視化

Python range()的解釋和可視化

在Python中用示例解釋和可視化range()函數

我們將繼續深入研究各種Python函數、模塊和庫的內部工作方式。在研究了enumerate()之後,我們現在來研究另一個重要的函數——range()。

在本文中,我們將探討range()的功能並突出研究它的用例——您將瞭解如何在Python中有效地使用range(),瞭解它的強大的方面和侷限性。與range()相關的問題經常會在技術面試中出現——你查看過我們的Python面試問題了嗎?

(與往常一樣,本文中的代碼來自Python 3)

那麼range()在Python中到底是做什麼呢?

range()是一個內置函數,這意味著Python是預先打包了它的。這個函數可以創建一個數字序列(稱為range對象)並返回它。當然,您可以將這組數字用於各種目的: 如下所示,range()實際上能很好地與循環一起使用。

下面是Python help()模塊提供的一個更專業的解釋:

" 返回一個對象,該對象會從開始數字(包括)到停止數字(不包括)按步長生成一個整數序列。range(i, j)會產生i, i+1, i+2,…,j-1。開始數字默認為0,停止數字被省略!range(4)會產生0,1,2,3。這些正是一個4元素列表的有效索引。當給定一個步長時,它指定了遞增數(或遞減數)。

Python中range()的語法

讓我們設想最簡單的場景: range(5)

Python range()的解釋和可視化

生成序列……

range()函數的語法很簡單——我們調用函數並輸入參數:

Python range()的解釋和可視化

讓我們仔細看看每個參數的作用:

  1. start是一個可選參數,它定義了序列的起始點。如果未指定,則默認為0。
  2. stop是定義序列終止點的必需參數。
  3. step是一個可選參數,它定義了步長大小(即序列中各個整數之間被忽略的整數數量)。如果未指定,則默認為0。

在Python中組合range()和List()

Python range()的解釋和可視化

range和list的使用過程

假設參數為5時,我們可能想要展示序列中實際使用了哪些數字。要做到這一點,我們可以使用另一個Python內置函數——list——來創建一個由函數調用range(5)將產生的數字組成的列表:

Python range()的解釋和可視化

這將輸出:

Python range()的解釋和可視化

在Python中將Range()與for循環組合

Python range()的解釋和可視化

循環和range的使用過程

或者,我們可以使用一個for循環——它允許我們多次執行給定的命令。這個過程稱為迭代,我們可以使用各種數據結構(如字符串或列表)來指定“重複”的確切數量。當然,我們也可以使用range()函數來實現這個目的——它基本上會運行該命令N次。

Python range()的解釋和可視化

由於Python清晰的語法,我們很容易記住for循環是如何工作的:“對於某個東西中的每個元素/部分/項,這樣做。”然而,它的輸出將是垂直的(每個print調用將以一個新行結束)——一些開發人員可能會發現它不方便或可讀性不強。要水平打印輸出,我們可以在print函數中添加end參數:

Python range()的解釋和可視化

這樣,結果會更容易閱讀:

Python range()的解釋和可視化

關於range()的“Stop”參數的說明(在Python中也稱為包含範圍)

現在,我們需要重申索引在幾乎所有編程語言中的工作方式。因為我們沒有指定start參數,它默認被指定為0,我們的序列就變成了0 - 5。你可能會想,如果我們把這個序列放入一個列表並打印出來,這個列表應該是這樣的:

Python range()的解釋和可視化

但是,最後一個索引(即stop參數)不包含在此操作中,因此將其公式記為range(從數字X到——但是不包括——數字Z )是很有用的。

當我們想使用所有的三個參數時,我們可以來查看一個更復雜的情形:

Python range()的解釋和可視化

range的使用過程和停止位置

前面小節(range(5))中的代碼實際上接收了3個參數,儘管我們只輸入了一個參數。

在Python中創建一個反轉的range()對象

到目前為止,我們只使用了正整數來構建遵循正常(即升序)順序的range對象——但是如果我們想要以相反的順序(即降序)使用range()呢?為了實現這個想法,我們需要將第三個range()參數——stop——設置為負數。讓我們想象一下,現在是12月31日,離新年只有10秒了,一個倒數計時器可以幫助我們倒數這10秒,就像它的名稱所表明的:

Python range()的解釋和可視化

這將輸出:

Python range()的解釋和可視化

注意:要連接(比如組合兩段數據)整數和省略號(‘.....’符號),我們必須對它們調用str()函數,以便將整數轉換為字符串——在我們的例子中是str(i)。否則,我們會遇到一個TypeError:

Python range()的解釋和可視化

Python中的range() : 應用列表操作

由於range()會返回一個列表,因此,我們可以對它應用各種列表操作,包括切片;而xrange()則不提供此功能。

Python range()的解釋和可視化

這將輸出:

Python range()的解釋和可視化

Python中的range() 與 xrange(): 有什麼不同?

Python range()的解釋和可視化

使用range和… 使用x-range?

Python 3帶來了許多改進,但是其中一些變化背後的原因不是很清楚。一個很好的例子是從xrange() (Python2)到range() (Python3)的過渡,新的語言特性通常比它們的前輩要好,但是xrange()在某些方面仍然佔上風。讓我們來看看它們比較的結果如何:

Python中的range() 與 xrange(): 這些函數返回什麼

雖然它們具有相同的功能,但它們返回值是其主要的區別。

  • range()返回一個列表。
  • xrange()返回一個xrange對象。

儘管它們的輸出是相同的,但是它們返回值的差異是需要考慮的一個重要方面——它影響了這些函數的執行方式和它們的使用方式。

Python中的range() 與 xrange(): 這些函數的執行速度如何

當我們比較技術A和技術B時,性能可以說是最重要的因素。當然,在處理較小的數據集時,range()和xrange()的速度都非常快;然而,當涉及到更大的數字時,其速度上的差異就變得明顯了。從xrange()切換到range()的一種可能的解釋是性能——但是性能真的提高了嗎?

內置的Python模塊timeit對於測試小代碼段的性能來說是最佳的。讓我們用它來比較range()和xrange()(注意,我們是從命令行中運行這些命令的,而不是從Python解釋器):

Python range()的解釋和可視化

雖然這些指標可能會因計算機而異,但是平均速度差異大約是100%!這是可能的,因為xrange()會返回一個生成器對象——它只允許處理用戶需要的數字範圍,從而節省了時間和資源。(有趣的事實:這個過程稱為“惰性求值”)。

Python中的range() 與 xrange(): 這些函數使用了多少內存

與timeit類似,另一個名為sys的內置Python模塊可以幫助我們查看這兩個函數使用了多少內存。為此,我們將使用sys模塊中的getsizeof()函數:

Python range()的解釋和可視化

這將輸出:

Python range()的解釋和可視化

譯者注:第二行應該是range()

結論

Python中有用的模塊、庫和函數的數量有時可能看起來非常多。然而,現在您已經掌握了另一個非常棒的函數——range(),並且它將永遠是您編程會話中的一個忠實夥伴。


英文原文:https://blog.soshace.com/en/python/python-range-explained-and-visualized/ 譯者:野生大熊貓


分享到:


相關文章: