高頻彩開獎導航網 > 嵌入式技術 > 編程語言及工具 > 正文

平安赛车开奖结果-秒速牛牛注册平台

2020年11月23日 14:19 ? 次閱讀

眾所周知,我們可以通過索引值(或稱下標)來查找序列類型(如字符串、列表、元組…)中的單個元素,那麼,如果要獲取一個索引區間的元素該怎麼辦呢?

切片(slice)就是一種截取索引片段的技術,借助切片技術,我們可以十分靈活地處理序列類型的對象。通常來說,切片的作用就是截取序列對象,然而,它還有一些使用誤區與高級用法,都值得我們注意。所以,本文將主要跟大家一起來探討這些內容,希望你能學有所獲。

事先聲明,切片並非列表的專屬操作,但因為列表最具代表性,所以本文僅以列表為例作探討。

1、切片的基礎用法

列表是Python中極為基礎且重要的一種數據結構,我曾寫過一篇匯總文章(鏈接見文末)較全面地學習過它。文中詳細地總結了切片的基礎用法,現在回顧一下︰

切片的書寫形式︰[i:i+n:m];其中,i是切片的起始索引值,為列表首位時可省略;i+n是切片的結束位置,為列表末位時可省略;m可以不提供,默認值是1,不允許為0,當m為負數時,列表翻轉。注意︰這些值都可以大于列表長度,不會報越界。

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

li=[1,4,5,6,7,9,11,14,16]#以下寫法都可以表示整個列表,其中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間隔過濾li[-1:]==[16]#取倒數第一個元素li[-4:-2]==[9,11]#從倒數第四起,取-2-(-4)=2位元素li[:-2]==li[-len(li):-2]==[1,4,5,6,7,9,11]#從頭開始,取-2-(-len(li))=7位元素#步長為負數時,列表先翻轉,再截取li[::-1]==[16,14,11,9,7,6,5,4,1]#翻轉整個列表li[::-2]==[16,11,7,5,1]#翻轉整個列表,再按2間隔過濾li[:-5:-1]==[16,14,11,9]#翻轉整個列表,取-5-(-len(li))=4位元素li[:-5:-3]==[16,9]#翻轉整個列表,取-5-(-len(li))=4位元素,再按3間隔過濾#切片的步長不可以為0li[::0]#報錯(ValueError:slicestepcannotbezero)

上述的某些例子對于初學者(甚至很多老手)來說,可能還不好理解。我個人總結出兩條經驗︰

(1)牢牢記住公式[i:i+n:m],當出現缺省值時,通過想象把公式補全;

(2)索引為負且步長為正時,按倒數計算索引位置;索引為負且步長為負時,先翻轉列表,再按倒數計算索引位置。

2、切片是偽獨立對象

切片操作的返回結果是一個新的獨立的序列(PS︰也有例外,參見《Python是否支持復制字符串呢?》)。以列表為例,列表切片後得到的還是一個列表,佔用新的內存地址。

當取出切片的結果時,它是一個獨立對象,因此,可以將其用于賦值操作,也可以用于其它傳遞值的場景。但是,切片只是淺拷貝,它拷貝的是原列表中元素的引用,所以,當存在變長對象的元素時,新列表將受制于原列表。

li=[1,2,3,4]ls=li[::]li==ls#Trueid(li)==id(ls)#Falseli.append(li[2:4])#[1,2,3,4,[3,4]]ls.extend(ls[2:4])#[1,2,3,4,3,4]#下例等價于判斷li長度是否大于8if(li[8:]):print("notempty")else:print("empty")#切片列表受制于原列表lo=[1,[1,1],2,3]lp=lo[:2]#[1,[1,1]]lo[1].append(1)#[1,[1,1,1],2,3]lp#[1,[1,1,1]]

由于可見,將切片結果取出,它可以作為獨立對象使用,但是也要注意,是否取出了變長對象的元素。

3、切片可作為佔位符

切片既可以作為獨立對象被“取出”原序列,也可以留在原序列,作為一種佔位符使用。

在寫《詳解Python拼接字符串的七種方式》的時候,我介紹了幾種拼接字符串的方法,其中三種格式化類的拼接方法(即%、format()、template)就是使用了佔位符的思想。對于列表來說,使用切片作為佔位符,同樣能夠實現拼接列表的效果。特別需要注意的是,給切片賦值的必須是可迭代對象。

li=[1,2,3,4]#在頭部拼接li[:0]=[0]#[0,1,2,3,4]#在末尾拼接li[len(li):]=[5,7]#[0,1,2,3,4,5,7]#在中部拼接li[6:6]=[6]#[0,1,2,3,4,5,6,7]#給切片賦值的必須是可迭代對象li[-1:-1]=6#(報錯,TypeError:canonlyassignaniterable)li[:0]=(9,)#[9,0,1,2,3,4,5,6,7]li[:0]=range(3)#[0,1,2,9,0,1,2,3,4,5,6,7]

上述例子中,若將切片作為獨立對象取出,那你會發現它們都是空列表,即li[:0]==li[len(li):]==li[6:6]==[],我將這種佔位符稱為“純佔位符”,對純佔位符賦值,並不會破壞原有的元素,只會在特定的索引位置中拼接進新的元素。刪除純佔位符時,也不會影響列表中的元素。

與“純佔位符”相對應,“非純佔位符”的切片是非空列表,對它進行操作(賦值與刪除),將會影響原始列表。如果說純佔位符可以實現列表的拼接,那麼,非純佔位符可以實現列表的替換。

li=[1,2,3,4]#不同位置的替換li[:3]=[7,8,9]#[7,8,9,4]li[3:]=[5,6,7]#[7,8,9,5,6,7]li[2:4]=['a','b']#[7,8,'a','b',6,7]#非等長替換li[2:4]=[1,2,3,4]#[7,8,1,2,3,4,6,7]li[2:6]=['a']#[7,8,'a',6,7]#刪除元素delli[2:3]#[7,8,6,7]

切片佔位符可以帶步長,從而實現連續跨越性的替換或刪除效果。需要注意的是,這種用法只支持等長替換。

li=[1,2,3,4,5,6]li[::2]=['a','b','c']#['a',2,'b',4,'c',6]li[::2]=[0]*3#[0,2,0,4,0,6]li[::2]=['w']#報錯,attempttoassignsequenceofsize1toextendedsliceofsize3delli[::2]#[2,4,6]

4、更多思考

其它編程語言是否有類似于Python的切片操作呢?有什麼差異?

我在交流群里問了這個問題,小伙伴們紛紛說Java、Go、Ruby……在查看相關資料的時候,我發現Go語言的切片是挺奇怪的設計。首先,它是一種特殊類型,即對數組(array)做切片後,得到的竟然不是一個數組;其次,你可以創建和初始化一個切片,需要聲明長度(len)和容量(cap);再者,它還存在超出底層數組的界限而需要進行擴容的動態機制,這倒是跟Python列表的超額分配機制有一定相似性……

在我看來,無論是用意,還是寫法和用法,都是Python的切片操作更明了與好用。所以,本文就不再進行跨編程語言的比較了(唔,好吧我承認,其實是我不怎麼懂其它編程語言……)

最後,還有一個問題︰Python的切片操作有什麼底層原理呢?我們是否可以自定義切片操作呢?限于篇幅,我將在下次推文中跟大家一起學習,敬請期待。

編輯︰hfy

下載發燒友APP

打造屬于您的人脈電子圈

關注高頻彩開獎導航微信

有趣有料的資訊及技術干貨

關注發燒友課堂

鎖定最新課程活動及技術直播

高頻彩開獎導航觀察

一線報道 ? 深度觀察 ? 最新資訊
人收藏
分享︰

平安赛车开奖结果-秒速牛牛注册平台

相關推薦

發表于 2019-04-09 00:00? 0次閱讀

零基礎Python入門教程二

系統全面的介紹Sublime Text

Sublime Text 官方網站 提供了 Sublime Text 各系統各版本的下載,目前Sub....
發表于 2020-11-23 11:33? 45次閱讀
系統全面的介紹Sublime Text

Java第二名的位置已經被Python取代了

有人說Python的流行和數據挖掘、人工智能數值計算等領域的蓬勃發展息息相關,但是,TIOBE CE....
發表于 2020-11-23 11:12? 91次閱讀
Java第二名的位置已經被Python取代了

未來人工智能的人才在全球都是香餑餑

近日,國家工業信息安全發展研究中心發布了《人工智能與制造業融合發展白皮書2020》。白皮書指出,人工....
發表于 2020-11-23 09:35? 218次閱讀
未來人工智能的人才在全球都是香餑餑

C#良好兼容了值類型/引用類型

反觀歷史,C#也曾經因為 值類型/引用類型 保守詬病,“拆箱”和“裝箱”一直是個招黑的設計。但後來我....
發表于 2020-11-20 10:14? 92次閱讀
C#良好兼容了值類型/引用類型

Python逐漸失去魅力

自從20世紀90年代初發布以來,Python一直相當火爆,在這二十多年里,它的流行程度遠遠超過了C、....
發表于 2020-11-19 11:05? 205次閱讀
Python逐漸失去魅力

當能耗也成為了一個重要指標,我們要怎麼選擇編程語...

當能耗也成為了一個重要指標,我們要怎麼選擇編程語言?2017 年,由 6 名葡萄牙研究者組成的團隊決....
發表于 2020-11-16 15:40? 142次閱讀
當能耗也成為了一個重要指標,我們要怎麼選擇編程語...

Python20年來首次超越Java

根據 2020 年 11 月最新出爐的 TIOBE 編程語言排行榜,Python 以 12.12% ....
發表于 2020-11-16 11:28? 301次閱讀
python文件的操作步驟
發表于 2020-11-16 07:53? 0次閱讀
刪除字符串中的空白︰ 在程序中,額外的空白可能令人迷惑。對程序員來說,'python' 和'python ' 看起來幾乎沒什麼...
發表于 2020-11-14 11:24? 404次閱讀
將python3.7版本環境(圖中前兩個)上移到最上層,用戶變量和系統變量都要調。...
發表于 2020-11-14 00:03? 101次閱讀
出現ImportError: No module named PyQt4.QtGui的解決方法

Python 之父正式加入微軟

11月13日消息 去年 10 月, Python 創始人 Guido van Rossum 在 Dr....
發表于 2020-11-13 17:39? 349次閱讀
Python 之父正式加入微軟

Python之父退休後太無聊加入微軟

去年 10 月, Python 創始人 Guido van Rossum 在 Dropbox 公司工....
發表于 2020-11-13 15:12? 1917次閱讀
一直想在kindle電子書屏幕上作為樹莓派或者maaxboard開發板的顯示器,刷新速度雖然慢,但是編程調試夠用。 之前了解...
發表于 2020-11-13 15:09? 303次閱讀
【MaaXBoard開發板試用體驗】十運行python程序建立web網站

Python 創始人復出 宣布已加入微軟開發者部...

去年 10 月, Python 創始人 Guido van Rossum 在 Dropbox 公司工....
發表于 2020-11-13 11:41? 272次閱讀
Python 創始人復出 宣布已加入微軟開發者部...

Golang︰含著金湯匙出生,高並發性能堪比C+...

Python 是一種高級的面向對象的語言。它具有內置的數據結構,結合了動態綁定和類型,是快速開發的理....
發表于 2020-11-13 10:20? 237次閱讀
Golang︰含著金湯匙出生,高並發性能堪比C+...

各種編程語言的能耗對比

運行各種基準測試非常重要,因為它們的結果會由于所執行的測試而有所不同。例如,總體而言,C 語言被認為....
發表于 2020-11-13 10:14? 205次閱讀
各種編程語言的能耗對比

JavaScript是如何獲得突出地位的?

JavaScript的卑微起步始于 1995 年,是由當時在 Netscape 通信公司工作的 Br....
發表于 2020-11-13 09:50? 214次閱讀
JavaScript是如何獲得突出地位的?

人工智能行業,編程學習是Python還是C++好...

很多想要進入人工智能行業的開發者都會糾結于學習Python還是學習C++。有些人認為,Python目....
發表于 2020-11-13 09:29? 306次閱讀
字符串拼接 在編碼的過程很多時候都會用到字符串的拼接,例如,你可能想將姓和名存儲在不同的變量中,等要顯示姓名時...
發表于 2020-11-11 15:30? 303次閱讀
零基礎學python_03_字符串(拼接+換行+制表符)

不再低調,QuecPython橫空出世

移遠通信正式推出一套輕松上手、功能完善的嵌入式操作系統——QuecPython,可讓客戶基于移遠模組....
發表于 2020-11-11 11:49? 556次閱讀
用Python給頭像添加國旗的方法
發表于 2020-11-11 08:02? 0次閱讀
python小案例demo01
發表于 2020-11-10 07:18? 0次閱讀
求python小案例demo01?

Python仍是人工智能和機器學習的主導編程語言...

上世紀90年代初,Python面世了。近30年來,關于它的“炒作”一直沒有少過。當然,編程界花了至少....
發表于 2020-11-09 14:30? 475次閱讀
Python中的類方法、實例方法和靜態方法
發表于 2020-11-09 07:13? 0次閱讀
請問Python中的類方法、實例方法和靜態方法是什麼?

最新的編程語言排行說明Python沖上第二

本月的排行榜出現了自 TIOBE 榜單發布以來,近二十年從未見過的變化︰前兩名的位置首次出現了一個除....
發表于 2020-11-07 10:54? 389次閱讀
最新的編程語言排行說明Python沖上第二

怎樣使用Python創建詞雲

介紹從開始從事數據可視化工作的那一天起,我就愛上它了,我總是喜歡從數據中獲得有用的見解。在此之前,我....
發表于 2020-11-06 17:26? 311次閱讀
這是一本非常基礎的 AI 入門書籍。AI 的與會比傳統IT(信息)有趣的地方是,當今 AI 的基礎是︰機器學習(Machi...
發表于 2020-11-06 17:25? 909次閱讀
vlookup函數功能非常強大,那在Python中如何實現?...
發表于 2020-11-06 06:11? 0次閱讀
請問Python中如何實現vlookup函數的功能?

Python3.9的新特性必知圖

Python3.9,「千呼萬喚始出來」。 先來速看下此次發布版本的重點。 新語法特性︰ PEP 58....
發表于 2020-11-05 15:33? 347次閱讀
Python3.9的新特性必知圖

Python 在未來十年內仍是機器學習的首選語言

愚者多怨,仁者不言,生活中就是會有很多愛唱反調的人,但不管怎麼說Python 在接下來十年仍然會很重....
發表于 2020-11-05 14:38? 315次閱讀
Python 在未來十年內仍是機器學習的首選語言

能夠指揮AI機器的編程網紅Python,被譽為“...

在這樣的背景之下,我國也非常重視Python的教育︰浙江已經把Python列為中學生必修項目;山東、....
發表于 2020-11-05 14:09? 530次閱讀
能夠指揮AI機器的編程網紅Python,被譽為“...

20年來首次︰Java被編程語言 Python超...

日前,TIOBE公布了最新一期的編程語言排行榜(11月)。 接近20年來的首次,Java和C沒有分享....
發表于 2020-11-05 13:28? 321次閱讀
20年來首次︰Java被編程語言 Python超...

20年來首次。Java掉出全球最受歡迎的兩大編程...

日前,TIOBE公布了最新一期的編程語言排行榜(11月)。接近20年來的首次,Java和C沒有分享前....
發表于 2020-11-05 12:11? 214次閱讀
20年來首次。Java掉出全球最受歡迎的兩大編程...

什麼是自動化測試框架?

這些優勢可以是不同的形式,如易于編寫腳本、可伸縮性、模塊化、可理解性、過程定義、可重用性、成本、維護....
發表于 2020-11-03 10:33? 295次閱讀
什麼是自動化測試框架?

如何利用Python判斷統計每個月天數源

如何利用Python判斷統計每個月天數源。在日常的學習或是工作中會經常遇到需要統計日期數據的情況。特....
發表于 2020-11-02 09:41? 364次閱讀
如何利用Python判斷統計每個月天數源

如何基于 ES6 的 JavaScript 進行...

TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支持 GPU ....
發表于 2020-10-31 11:16? 586次閱讀
如何基于 ES6 的 JavaScript 進行...

在Python中實現異步編程(附源碼)

異步編程是並行編程的一種方式。單個工作單元獨立于主應用程序線程運行,並通知調用線程其完成、失敗情況或....
發表于 2020-10-27 14:36? 372次閱讀
在Python中實現異步編程(附源碼)

世界上最深奧的編程語言有哪些

當我們談論 c,c++ ,Java,Python的時候,有些語言不僅很難,而且對于大多數軟件開發者來....
發表于 2020-10-25 10:13? 331次閱讀
世界上最深奧的編程語言有哪些

TIOBE已公布2020年10月的編程語言排行榜

Python從去年開始就已經登上了TIOBE榜單的第三位,但它的受歡迎程度一直在上升,本月,該指數達....
發表于 2020-10-23 10:41? 5879次閱讀
TIOBE已公布2020年10月的編程語言排行榜

Python受歡迎程度直上升 即將超過Java

來自︰程序猿(ID︰imkuqin) TIOBE已公布2020年10月的編程語言排行榜。C語言依然排....
發表于 2020-10-23 10:41? 406次閱讀
Python受歡迎程度直上升 即將超過Java

Go為什麼是2020年最受歡迎的語言?

在接下來的幾年中,Python無疑還將繼續在這些領域佔據主導地位。但是,與一些新興語言相比,它存在一....
發表于 2020-10-23 10:37? 365次閱讀
Go為什麼是2020年最受歡迎的語言?

STM32的backtrace深度講解(cort...

STM32上的backtrace原理與分析 1.說明 2.cortex-m上的棧布局 2.1 cor....
發表于 2020-10-22 15:13? 595次閱讀
STM32的backtrace深度講解(cort...