电竞比分网-中国电竞赛事及体育赛事平台

分享

Python range()的解釋和可視化

 西北望msm66g9f 2019-10-04

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

我們將繼續(xù)深入研究各種Python函數(shù)、模塊和庫(kù)的內(nèi)部工作方式。在研究了enumerate()之后,我們現(xiàn)在來(lái)研究另一個(gè)重要的函數(shù)——range()。

在本文中,我們將探討range()的功能并突出研究它的用例——您將了解如何在Python中有效地使用range(),了解它的強(qiáng)大的方面和局限性。與range()相關(guān)的問(wèn)題經(jīng)常會(huì)在技術(shù)面試中出現(xiàn)——你查看過(guò)我們的Python面試問(wèn)題了嗎?

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

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

range()是一個(gè)內(nèi)置函數(shù),這意味著Python是預(yù)先打包了它的。這個(gè)函數(shù)可以創(chuàng)建一個(gè)數(shù)字序列(稱為range對(duì)象)并返回它。當(dāng)然,您可以將這組數(shù)字用于各種目的: 如下所示,range()實(shí)際上能很好地與循環(huán)一起使用。

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

' 返回一個(gè)對(duì)象,該對(duì)象會(huì)從開(kāi)始數(shù)字(包括)到停止數(shù)字(不包括)按步長(zhǎng)生成一個(gè)整數(shù)序列。range(i, j)會(huì)產(chǎn)生i, i+1, i+2,…,j-1。開(kāi)始數(shù)字默認(rèn)為0,停止數(shù)字被省略!range(4)會(huì)產(chǎn)生0,1,2,3。這些正是一個(gè)4元素列表的有效索引。當(dāng)給定一個(gè)步長(zhǎng)時(shí),它指定了遞增數(shù)(或遞減數(shù))。

Python中range()的語(yǔ)法

讓我們?cè)O(shè)想最簡(jiǎn)單的場(chǎng)景: range(5)

生成序列……

range()函數(shù)的語(yǔ)法很簡(jiǎn)單——我們調(diào)用函數(shù)并輸入?yún)?shù):

讓我們仔細(xì)看看每個(gè)參數(shù)的作用:

  1. start是一個(gè)可選參數(shù),它定義了序列的起始點(diǎn)。如果未指定,則默認(rèn)為0。

  2. stop是定義序列終止點(diǎn)的必需參數(shù)。

  3. step是一個(gè)可選參數(shù),它定義了步長(zhǎng)大小(即序列中各個(gè)整數(shù)之間被忽略的整數(shù)數(shù)量)。如果未指定,則默認(rèn)為0。

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

range和list的使用過(guò)程

假設(shè)參數(shù)為5時(shí),我們可能想要展示序列中實(shí)際使用了哪些數(shù)字。要做到這一點(diǎn),我們可以使用另一個(gè)Python內(nèi)置函數(shù)——list——來(lái)創(chuàng)建一個(gè)由函數(shù)調(diào)用range(5)將產(chǎn)生的數(shù)字組成的列表:

這將輸出:

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

循環(huán)和range的使用過(guò)程

或者,我們可以使用一個(gè)for循環(huán)——它允許我們多次執(zhí)行給定的命令。這個(gè)過(guò)程稱為迭代,我們可以使用各種數(shù)據(jù)結(jié)構(gòu)(如字符串或列表)來(lái)指定“重復(fù)”的確切數(shù)量。當(dāng)然,我們也可以使用range()函數(shù)來(lái)實(shí)現(xiàn)這個(gè)目的——它基本上會(huì)運(yùn)行該命令N次。

由于Python清晰的語(yǔ)法,我們很容易記住for循環(huán)是如何工作的:“對(duì)于某個(gè)東西中的每個(gè)元素/部分/項(xiàng),這樣做?!比欢?,它的輸出將是垂直的(每個(gè)print調(diào)用將以一個(gè)新行結(jié)束)——一些開(kāi)發(fā)人員可能會(huì)發(fā)現(xiàn)它不方便或可讀性不強(qiáng)。要水平打印輸出,我們可以在print函數(shù)中添加end參數(shù):

這樣,結(jié)果會(huì)更容易閱讀:

關(guān)于range()的“Stop”參數(shù)的說(shuō)明(在Python中也稱為包含范圍)

現(xiàn)在,我們需要重申索引在幾乎所有編程語(yǔ)言中的工作方式。因?yàn)槲覀儧](méi)有指定start參數(shù),它默認(rèn)被指定為0,我們的序列就變成了0 - 5。你可能會(huì)想,如果我們把這個(gè)序列放入一個(gè)列表并打印出來(lái),這個(gè)列表應(yīng)該是這樣的:

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

當(dāng)我們想使用所有的三個(gè)參數(shù)時(shí),我們可以來(lái)查看一個(gè)更復(fù)雜的情形:

range的使用過(guò)程和停止位置

前面小節(jié)(range(5))中的代碼實(shí)際上接收了3個(gè)參數(shù),盡管我們只輸入了一個(gè)參數(shù)。

在Python中創(chuàng)建一個(gè)反轉(zhuǎn)的range()對(duì)象

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

這將輸出:

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

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

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

這將輸出:

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

使用range和… 使用x-range?

Python 3帶來(lái)了許多改進(jìn),但是其中一些變化背后的原因不是很清楚。一個(gè)很好的例子是從xrange() (Python2)到range() (Python3)的過(guò)渡,新的語(yǔ)言特性通常比它們的前輩要好,但是xrange()在某些方面仍然占上風(fēng)。讓我們來(lái)看看它們比較的結(jié)果如何:

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

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

  • range()返回一個(gè)列表。

  • xrange()返回一個(gè)xrange對(duì)象。

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

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

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

內(nèi)置的Python模塊timeit對(duì)于測(cè)試小代碼段的性能來(lái)說(shuō)是最佳的。讓我們用它來(lái)比較range()和xrange()(注意,我們是從命令行中運(yùn)行這些命令的,而不是從Python解釋器):

雖然這些指標(biāo)可能會(huì)因計(jì)算機(jī)而異,但是平均速度差異大約是100%!這是可能的,因?yàn)閤range()會(huì)返回一個(gè)生成器對(duì)象——它只允許處理用戶需要的數(shù)字范圍,從而節(jié)省了時(shí)間和資源。(有趣的事實(shí):這個(gè)過(guò)程稱為“惰性求值”)。

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

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

這將輸出:

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

結(jié)論

Python中有用的模塊、庫(kù)和函數(shù)的數(shù)量有時(shí)可能看起來(lái)非常多。然而,現(xiàn)在您已經(jīng)掌握了另一個(gè)非常棒的函數(shù)——range(),并且它將永遠(yuǎn)是您編程會(huì)話中的一個(gè)忠實(shí)伙伴。

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多