當前位置:
首頁 > 知識 > Python的Range()函數(指南)

Python的Range()函數(指南)

Python的Range()函數(指南)

當需要執行特定次數的操作時,Python內置的range函數十分方便。

讀罷本文,你將:

  • 理解Python的range函數是如何工作的

  • 了解Python 2和Python 3中的實現方式有何不同

  • 看過了不少range函數操作實例

  • 有能力解決它的一些局限性

讓我們開始吧!

range函數的歷史

雖然Python 2的range和Python3中的range共享了一個名字,但它們是完全不同的傢伙。事實上,Python 3中的range只是Python 2中被稱為xrange的函數的重命名版本。

最初range和xrange都生成可以用for循環迭代的數字,但是前者同時生成這些數字的列表,而後者則懶洋洋地生成數字,這意味著後者只能在需要時一次返回一個數字。

巨大的列表會佔用內存,所以xrange取代range的名稱和一切都不奇怪。您可以在PEP 3100中了解更多關於這個決定和xrange vs range的背景信息。

註:PEP代表Python改善提議。PEPs是涵蓋廣泛主題的文檔,其主題包括提出的新特性、風格、管理和哲學。

他們有很多。PEP 1解釋了它們是如何工作的,並且是一個入門的好地方。

在本文其餘部分中,您將使用Python 3中的range函數。

讓我們開始吧!

讓我們來循環

在深入研究range如何工作之前,我們需要先看看循環是如何工作的。循環是計算機科學中的一個重要概念。掌握循環是成為一名優秀程序員的第一步。

下面是Python中for循環的一個例子:

Python的Range()函數(指南)

輸出如下:

Python的Range()函數(指南)

正如你所見,for循環使您可以執行特定的代碼塊,多少次都沒問題。在這種情況下,我們遍歷一個船長艦長名單,列印他們的名字。

雖然《星際迷航》很棒,但你可能想做的不僅僅是簡單的圈出艦長的名單。有時,您只希望執行特定次數的代碼塊。循環可以幫助你做到這一點!

試運行下面的代碼,其中的數字可以被3整除:

Python的Range()函數(指南)

該循環的輸出如下:

Python的Range()函數(指南)

這是我們想要的輸出,所以循環充分地完成了工作,但是還有另一種方法通過使用range獲得相同的結果。

註:最後一個代碼示例有一些字元串格式化。更多相關內容參見: Python String Formatting Best Practices 和 Python 3』s f-Strings: An Improved String Formatting Syntax (Guide)

到此你已對循環更熟悉了,接下來讓我們看看如何使用range來簡化。

從range開始

那麼Python的range函數是如何工作的呢?簡單地說,range允許你在給定範圍內生成一系列數字。你可以根據傳遞給函數的參數數量決定該系列數字的開始和結束位置,以及該系列數字與下一個數字之間的步長。

讓我們在操作中先睹為快:

Python的Range()函數(指南)

在這個for循環中,你可以輕鬆地創建可被3整除的一系列數字,而不必自己提供每個數字。

註:儘管這個例子適當的使用了range,但通常不喜歡在for循環里中頻繁使用range。

例如,下面的range用例,一般不被認為是Python風格的:

Python的Range()函數(指南)

range非常適合創建數字的迭代,但是當你需要迭代可用in操作符完成循環的數據時,它不是最佳選擇。

更多詳情參見: How to Make Your Python Loops More Pythonic.

你可用下述三種方式調用range:

  1. range(stop)需要一個參數

  2. range(start, stop)需要兩個參數

  3. range(start, stop, step)需要三個參數

range(stop)

當使用一個參數調用range時,您將得到一系列數字,這些數字從0開始,包括直到(但不包括)stop的每個整數。

以下是實踐中的情況:

Python的Range()函數(指南)

循環的輸出如下

Python的Range()函數(指南)

結果顯示:輸出的所有數字都在0到3之間,但不包括提供的3。

range(start, stop)

當你用兩個參數調用range時,你不僅要決定一系列數字停止的位置,而且還要決定它從哪裡開始,所以你不必總是在0點開始。可以使用range來使用範圍(A,B)生成從A到B的一系列數字。讓我們來看看如何生成一個從1開始的範圍。

嘗試用兩個參數調用range:

Python的Range()函數(指南)

輸出如下:

Python的Range()函數(指南)

到目前為止,非常好:您擁有從1(作為開始提供的數字)到但不包括8(作為停止提供的數字)的所有整數。

但是如果您再添加一個參數,那麼您就能夠重現前面使用number_divisible_by_three列表時得到的輸出。

range(start, stop, step)

當使用三個參數調用range時,您不僅可以選擇數字序列的開始和停止位置,還可以選擇一個數字與下一個數字之間的步長。如果不提供step,那麼range將自動取step=1。

註:step可以是正數也可以是負數,但不能為0:

Python的Range()函數(指南)

若以0為步長,將報錯。

現在你知道如何使用step,可以回到我們之前看到的循環除以3。

自己試試看:

Python的Range()函數(指南)

輸出將完全類似於本文前面看到的使用名為number_divisible_by_three的列表時的for循環的輸出:

正如你在這個例子中看到的,你可以使用step參數增加到一個更高的數值。這叫做遞增

用range實現遞增

如果你想實現遞增,那麼你需要將step設為正數。為了解這個的現實意義,鍵入以下代碼:

Python的Range()函數(指南)

如果step取25,那麼循環的輸出將是這樣的

Python的Range()函數(指南)

你得到的數字比前一個數字大25——你提供的step。

現在,你已經看到了如何向前邁進一個距離,現在是時候看看你如何向後遞減。

用range實現遞減

如果你的step是正數,那麼你會得到一系列不斷遞增的數字。如果你的step為負數,那麼你會得到一系列遞減的數字。這可以讓你從數字中倒退過來。

在下面的示例中,step取-2。這意味著每個循環的遞減步長為2

Python的Range()函數(指南)

遞減循環的輸出如下:

Python的Range()函數(指南)

你有一串數字,每一個都比前一個數字小2,這是你提供的step的絕對值。

創建一個遞減範圍的最快速的方法是使用range(start,stop,step)。但是Python確實有一個內置的反函數。如果在reversed中包裝range,則可以以相反的順序列印整數

試試看:

Python的Range()函數(指南)

你將得到如下結果:

Python的Range()函數(指南)

range使迭代遞減的數序列成為可能,而reversed通常用於以相反的順序對序列進行循環。

註:reversed也與字元串一起工作。你可以在 How to Reverse a String in Python中了解更多關於字元串的reversed的功能。

更深入使用range

現在你知道了如何使用range的基礎知識,是時候深入挖掘一下了。

range主要用於兩個目的:

  1. 重複執行for循環的循環體指定次數

  2. 創建比使用列表或元組完成的更高效的整數迭代演算法

第一種用法可能是最常用的,並且你可以找到一種比利用range更高效的利用迭代工具的方法來構造迭代器。

下面是使用range時要記住的幾個要點。

Python中range是一種類型:

Python的Range()函數(指南)

你可以按索引訪問range中的項,就像列表中的那樣:

Python的Range()函數(指南)

您甚至可以在range上使用切片標記,但是REPL中的輸出在一開始可能看起來有點奇怪:

Python的Range()函數(指南)

儘管這個輸出看起來很奇怪,對一個range切片,又返回另一個range。

可以通過索引和切片來訪問range的元素,這一事實突出了一個重要事實:range與列表不同,是惰性的,但不是迭代器。

Floatrange

您可能已經注意到,到目前為止我們所處理的所有數字都是整數,也稱為整數。這是因為range只能以整數作為參數。

浮點一詞:

在Python中,如果一個數字不是整數,那麼它就是一個浮點。整數和浮點之間有一些區別。

整數(int數據類型):

· 是整數

· 不包括小數點

· 可以是正數、負數或0

浮點數(浮點數據類型):

· 可以是包含小數點的任何數字

· 可以是正的也可以是負的

嘗試用浮點調用range,看看會發生什麼:

Python的Range()函數(指南)

你應得到如下錯誤信息:

Python的Range()函數(指南)

如果你需要找到一個可以讓你使用浮點的解決方案,那麼你可以使用NumPy。

使用NumPy

NumPy是第三方Python庫。如果你要使用NumPy,第一步是檢查你是否安裝了它。

以下是你在REPL做到這一點的方法:

Python的Range()函數(指南)

如果你得到了一個 ModuleNotFoundError,那麼你需要安裝它。為此,請轉到命令行並輸入pip install numpy。

一旦安裝完畢,請輸入以下內容:

Python的Range()函數(指南)

它的返回如下:

Python的Range()函數(指南)

如果要換行列印每個數字,可以執行以下操作:

Python的Range()函數(指南)

輸出如下:

Python的Range()函數(指南)

0.8999999999999999從哪來的?

計算機在二進位浮點數字中保存十進位浮點數字是困難的。這導致了各種意想不到的數字表示。

註:為了了解為什麼有小數的問題,你可以看看這篇文章和Python文檔。

您可能還想看一下十進位庫,它在性能和可讀性方面略有下降,但是允許您準確地表示十進位數。

另一個選擇是使用round,您可以在 How to Round Numbers in Python中了解更多相關內容。請記住,round有自己的 怪癖,可能會產生一些令人驚訝的結果!

這些浮點錯誤是否對你來說是個問題,取決於你正在解決的問題。誤差將存在於第十六位小數處,絕大多數時候這是微不足道的。它們太小了,除非你正在計算衛星軌道或其他東西,否則你不必擔心它。

或者,您也可以使用 np.linspace。它本質上是相同的,但是使用不同的參數。使用np.linspace,可以指定start和end(包含兩者)以及數組的長度(而不是step)。

例如,np.linspace(1, 4, 20)給出了20個等距的數字:1.0, ..., 4.0. 另一方面,np.linspace(0, 0.5, 51)給出0.00, 0.01, 0.02, 0.03, ..., 0.49, 0.50.

註:為了了解更多,您可以閱讀 Look Ma, No For-Loops: Array Programming With NumPy and this handy和 NumPy reference.。

循環前行

現在,你已了解如何使用range並處理其局限性。您還可以了解Python 2和Python 3之間的這個重要功能是如何演變的。

下一次你需要執行一個特定的次數,胸有成竹!

祝你Python編程玩得開心!


英文原文:https://realpython.com/python-range/
譯者:盈韜

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python語言中字元串的拆分,連接及拼接
簡介Python3中的元組

TAG:Python部落 |