欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?切片為什么不會(huì)索引越界?

 更新時(shí)間:2021年12月31日 11:23:54   作者:遲業(yè)  
這篇文章主要介紹了Python?切片為什么不會(huì)索引越界?切片(slice)是?Python?中一種很有特色的特性,在正式開(kāi)始之前,我們先來(lái)從關(guān)于切片的相關(guān)知識(shí)開(kāi)始介紹,感興趣的小伙伴一起參考參考呀</P><P>

切片主要用于序列對(duì)象中,按照索引區(qū)間截取出一段索引的內(nèi)容。

切片的書(shū)寫(xiě)形式:[i : i+n : m] ;其中,i 是切片的起始索引值,為列表首位時(shí)可省略;i+n 是切片的結(jié)束位置,為列表末位時(shí)可省略;m 可以不提供,默認(rèn)值是 1,不允許為 0,當(dāng) m 為負(fù)數(shù)時(shí),列表翻轉(zhuǎn)。

切片的基本含義是:從序列的第 i 位索引起,向右取到后 n 位元素為止,按 m 間隔過(guò)濾 。

下面是一些很有代表性的例子,基本涵蓋了切片語(yǔ)法的使用要點(diǎn):

# @Python貓
li = [1, 4, 5, 6, 7, 9, 11, 14, 16]

# 以下寫(xiě)法都可以表示整個(gè)列表,其中 X >= len(li)
li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]

li[1:5] == [4,5,6,7] # 從1起,取5-1位元素
li[1:5:2] == [4,6] # 從1起,取5-1位元素,按2間隔過(guò)濾
li[-1:] == [16] # 取倒數(shù)第一個(gè)元素
li[-4:-2] == [9, 11] # 從倒數(shù)第四起,取-2-(-4)=2位元素
li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 從頭開(kāi)始,取-2-(-len(li))=7位元素

# 步長(zhǎng)為負(fù)數(shù)時(shí),列表先翻轉(zhuǎn),再截取
li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻轉(zhuǎn)整個(gè)列表
li[::-2] == [16,11,7,5,1] # 翻轉(zhuǎn)整個(gè)列表,再按2間隔過(guò)濾
li[:-5:-1] == [16,14,11,9] # 翻轉(zhuǎn)整個(gè)列表,取-5-(-len(li))=4位元素
li[:-5:-3] == [16,9] # 翻轉(zhuǎn)整個(gè)列表,取-5-(-len(li))=4位元素,再按3間隔過(guò)濾

# 切片的步長(zhǎng)不可以為0
li[::0]  # 報(bào)錯(cuò)(ValueError: slice step cannot be zero)

C/C++ 、Java JavaScript 等語(yǔ)言,雖然也支持某些“切片”功能,例如截取數(shù)組或字符串的片段,但是,它們并沒(méi)有一種在語(yǔ)法層面上的通用性支持。

根據(jù)維基百科資料,F(xiàn)ortran 是最早支持切片語(yǔ)法的語(yǔ)言(1966),而 Python 則是最具代表性的語(yǔ)言之一。

主要編程語(yǔ)言對(duì)切片的支持

另外,像 Perl、RubyGo Rust 等語(yǔ)言,雖然也有切片,但都不及 Python 那樣靈活和自由(因?yàn)樗С?step、負(fù)數(shù)索引、缺省索引)。

編程語(yǔ)言中切片語(yǔ)法的形式

切片的基本用法就能夠滿足大部分的需求,但是,Python 切片還有一些進(jìn)階的用法,例如:切片占位符用法(可實(shí)現(xiàn)列表的賦值、刪除與拼接操作)、自定義對(duì)象實(shí)現(xiàn)切片功能、迭代器切片(itertools.islice())、文件對(duì)象切片等等。關(guān)聯(lián)閱讀:Python全面解讀高級(jí)特性切片

關(guān)于切片的介紹與溫習(xí),就到這里了。

下面進(jìn)入文章標(biāo)題的問(wèn)題:Python 的切片語(yǔ)法為什么不會(huì)出現(xiàn)索引越界呢?

當(dāng)我們根據(jù)單個(gè)索引進(jìn)行取值時(shí),如果索引越界,就會(huì)得到報(bào)錯(cuò):“IndexError: list index out of range”。

>>> li = [1, 2]
>>> li[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range


對(duì)于一個(gè)非空的序列對(duì)象,假設(shè)其長(zhǎng)度為 length,則它有效的索引值是從 0 到(length - 1)。如果把負(fù)數(shù)索引也考慮進(jìn)去,則單個(gè)索引值的有效區(qū)間是 [-length, length - 1] 閉區(qū)間。

但是,當(dāng) Python 切片中的索引超出這個(gè)范圍時(shí),程序并不會(huì)報(bào)錯(cuò)。

>>> li = [1, 2]
>>> li[1:5]  # 右索引超出
[2]
>>> li[5:6]  # 左右索引都超出
[]


其實(shí),對(duì)于這種現(xiàn)象,官方文檔中有所介紹:

The slice of s from i to j is defined as the sequence of items with index k such that i <= k < j. If i or j is greater than len(s), use len(s). If i is omitted or None, use 0. If j is omitted or None, use len(s). If i is greater than or equal to j, the slice is empty.

也就是說(shuō):

  • 當(dāng)左或右索引值大于序列的長(zhǎng)度值時(shí),就用長(zhǎng)度值作為該索引值;
  • 當(dāng)左索引值缺省或者為 None 時(shí),就用 0 作為左索引值;
  • 當(dāng)右索引值缺省或者為 None 時(shí),就用序列長(zhǎng)度值作為右索引值;
  • 當(dāng)左索引值大于等于右索引值時(shí),切片結(jié)果為空對(duì)象。

對(duì)照上面的例子,可以得到:

>>> li = [1, 2]
>>> li[1:5]  # 等價(jià)于 li[1:2]
[2]
>>> li[5:6]  # 等價(jià)于 li[2:2]
[]


歸結(jié)起來(lái)一句話:Python 解釋器把可能導(dǎo)致索引越界的操作給屏蔽了,你的寫(xiě)法可以很自由,但是最終的結(jié)果會(huì)被死死限制在合法的索引區(qū)間內(nèi)。

對(duì)于這個(gè)現(xiàn)象,我其實(shí)是有點(diǎn)疑惑的,為什么 Python 不直接報(bào)索引越界呢,為什么要修正切片的邊界值,為什么一定要返回一個(gè)值呢,即便這個(gè)值可能是個(gè)空序列?

當(dāng)我們使用“l(fā)i[5:6]”時(shí),至少在字面意義上想表達(dá)的是“取出索引從 5 到 6 所對(duì)應(yīng)的值”,就像是在說(shuō)“取出書(shū)架上從左往右數(shù)的第 6 和 7 本書(shū)”。

如果程序是如實(shí)地遵照我們的指令的話,它就應(yīng)該報(bào)錯(cuò),就應(yīng)該說(shuō):對(duì)不起,書(shū)架上的書(shū)不夠數(shù)。

實(shí)話說(shuō),我并沒(méi)有查到這方面的解釋?zhuān)@篇文章也不是要給大家科普 Python? 在設(shè)計(jì)上有什么獨(dú)到的見(jiàn)解。恰恰相反,這篇文章的主要目的之一是希望得到大家的回復(fù)解答。

在 Go 語(yǔ)言中,遇到同樣的場(chǎng)景時(shí),它的做法是報(bào)錯(cuò)“runtime error: slice bounds out of range”。

在 Rust 語(yǔ)言中,遇到同樣的場(chǎng)景時(shí),它的做法是報(bào)錯(cuò)“byte index 5 is out of bounds of ......”。

在其它支持切片語(yǔ)法的語(yǔ)言中,也許還有跟 Python 一樣的設(shè)計(jì)。但是,我還不知道有沒(méi)有(學(xué)識(shí)淺?。?/p>

最后,繼續(xù)回到標(biāo)題中的問(wèn)題“Python 的切片為什么不會(huì)索引越界”。我其實(shí)想問(wèn)的問(wèn)題有兩個(gè):

當(dāng)切片語(yǔ)法中的索引超出邊界時(shí),為什么 Python 還能返回結(jié)果,返回結(jié)果的計(jì)算原理是什么?
為什么 Python 的切片語(yǔ)法要允許索引超出邊界呢,為什么不設(shè)計(jì)成拋出索引錯(cuò)誤?
對(duì)于第一個(gè)問(wèn)題的回答,官方文檔已經(jīng)寫(xiě)得很明白了。

到此這篇關(guān)于Python 切片為什么不會(huì)索引越界?的文章就介紹到這了,更多相關(guān)Python 切片為什么不會(huì)索引越界??jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python實(shí)現(xiàn)快遞信息提取

    基于Python實(shí)現(xiàn)快遞信息提取

    這篇文章主要為大家介紹了如何利用Python實(shí)現(xiàn)提取快遞信息,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-03-03
  • python 隨機(jī)打亂 圖片和對(duì)應(yīng)的標(biāo)簽方法

    python 隨機(jī)打亂 圖片和對(duì)應(yīng)的標(biāo)簽方法

    今天小編就為大家分享一篇python 隨機(jī)打亂 圖片和對(duì)應(yīng)的標(biāo)簽方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 使用turtle繪制五角星、分形樹(shù)

    使用turtle繪制五角星、分形樹(shù)

    這篇文章主要為大家詳細(xì)介紹了使用turtle繪制五角星、分形樹(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python中pylint使用方法(pylint代碼檢查)

    python中pylint使用方法(pylint代碼檢查)

    Pylint 提供了簡(jiǎn)單的方式來(lái)分析 Python 代碼,其高可配置性很容易使一個(gè)部門(mén)的人員使用統(tǒng)一的代碼風(fēng)格。 本文將通過(guò)理論介紹和示例分析闡述如何 Pylint 來(lái)規(guī)范 Python 代碼
    2018-04-04
  • Python unittest基本使用方法代碼實(shí)例

    Python unittest基本使用方法代碼實(shí)例

    這篇文章主要介紹了Python unittest基本使用方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python中pip安裝非PyPI官網(wǎng)第三方庫(kù)的方法

    Python中pip安裝非PyPI官網(wǎng)第三方庫(kù)的方法

    這篇文章主要介紹了Python中pip安裝非PyPI官網(wǎng)第三方庫(kù)的方法,pip最新的版本(1.5以上的版本), 出于安全的考 慮,pip不允許安裝非PyPI的URL,本文就給出兩種解決方法,需要的朋友可以參考下
    2015-06-06
  • Python實(shí)戰(zhàn)練習(xí)之終于對(duì)肯德基下手

    Python實(shí)戰(zhàn)練習(xí)之終于對(duì)肯德基下手

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你爬下肯德基的官網(wǎng),大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣
    2021-10-10
  • 使用Python的toolz庫(kù)開(kāi)始函數(shù)式編程的方法

    使用Python的toolz庫(kù)開(kāi)始函數(shù)式編程的方法

    這篇文章主要介紹了使用Python的toolz庫(kù)開(kāi)始函數(shù)式編程的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 簡(jiǎn)單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理

    簡(jiǎn)單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理

    這篇文章主要介紹了簡(jiǎn)單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理,作者基于Python的生成器講述了Tornado異步的特點(diǎn),需要的朋友可以參考下
    2015-04-04
  • pyEcharts安裝及詳細(xì)使用指南(最新)

    pyEcharts安裝及詳細(xì)使用指南(最新)

    這篇文章主要介紹了pyEcharts安裝及詳細(xì)使用指南(最新),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論