貝斯狸的 Python 之旅 -- 深刻切片操做及原理

我首先經過 input() 函數,接收了外部輸入字符串,而後經過 list 函數的切片,實現了迴文數,代碼真的好簡潔,我本身都佩服我本身,我也不知道小組長會問我切片原理,我好無奈呀。

s = input()
if s == s[::-1]:
    print("True")
else:
    print("False")

>>> abcba
True
複製代碼

什麼是列表切片?

切片操做不是列表特有的,python 中的有序序列都支持切片,如字符串,元組。python

切片的返回結果類型和切片對象類型一致,返回的是切片對象的子序列,如:對一個列表切片返回一個列表,程序員

字符串切片返回字符串。數組

切片生成的子序列元素是源版的拷貝。所以切片是一種淺拷貝。網絡

切片的圖示分析

li=["A","B","C","D"]
# 格式:li[start : end : step] 
# start 是切片起點索引,end 是切片終點索引,但切片結果不包括終點索引的值。step 是步長默認是 1。
# [start : end : step) 左開右閉
t=li[0:3]        ["A","B","C"]       #起點的0索引能夠省略,t=li[:3]
t=li[2: ]        ["C","D"]           #省略end,則切到末尾
t=li[1:3]        ["B","C"]
t=li[0:4:2]      ["A","C"]       	 #從li[0]到li[3],設定步長爲2。 
複製代碼

在 step 的符號必定的狀況下,start 和 end 能夠混合使用正向和反向索引,不管怎樣,你都要保證app

start 和 end 之間有和 step 方向一致元素間隔,不然會切出空列表。機器學習

Case 1

t=li[0:2] t=li[0:-2] t=li[-4:-2] t=li[-4:2]函數

上面的結果都是同樣的:t 爲 ["A","B"]。學習

Case 2

t=li[-1:-3:-1] t=li[-1:1:-1] t=li[3:1:-1] t=li[3:-3:-1]人工智能

上面的結果都是同樣的:t 爲 ["D","C"]。spa

Case 3

t=li[-1:-3] t=li[-1:1] t=li[3:1] t=li[3:-3]

都切出空列表。

同時,step 的正負決定了切片結果的元素採集的前後。

省略 start 和 end 表示以原列表所有爲目標。

t=li[::-1] t--->["C","B","A"] #反向切,切出所有。

t=li[:] t--->["A","B","C","D"] #正向切所有。

切片原理

小狸,學習一件事物,先學習它的表象,而後分析它的內在實現,最後查看源代碼仔細推敲它究竟是怎麼實現的。

須要注意的是,列表切片產生的是列表的副本,與原列表不是同一份空間。

x=[1,2,3]
y=x[:]
x[0]=-1
print(y) #輸出[1,2,3]
複製代碼

切片寫操做

在2後面插入若干個元素,應該用列表

#case 1
>>> x=[1,2,3,4,5]
>>> x[2:0]=100  #在2後面插入若干個元素,應該用列表
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> x[2:0]=[100]
>>> x
[1, 2, 100, 3, 4, 5]

#case 2
>>> x[2:4]=None
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> x[2:4]=[None]
>>> x
[1, 2, None, 5]
複製代碼

刪除切片

>>> del x[2:3]  #刪除切片
>>> x
[1, 2, 3, 4, 5]
複製代碼

對於切片x[from:to],會進行預處理to=max(from+1,to)

>>> x=[1,2,3,4,5]
>>> x[2:1]=[100] #對於切片x[from:to],會進行預處理to=max(from+1,to)
>>> x
[1, 2, 100, 3, 4, 5]
複製代碼

對於切片del操做,若是from>to,不執行任何操做

>>> del x[2:0] 
>>> x
[1, 2, 100, 3, 4, 5]
>>> del x[2:1]
>>> x
[1, 2, 100, 3, 4, 5]
>>> del x[2:3]
>>> x
[1, 2, 3, 4, 5]
複製代碼

切片原理解析

經過指定下標的方式來得到某一個數據元素,或者經過指定下標範圍來得到一組序列的元素,這種訪問序列的方式叫作切片。有些地方也把它稱之爲分片。

先從底層分析切片運算:

list 的切片,內部是調用 __getitem____setitem____delitem__ 和 slice 函數。而 slice 函數又是和 range() 函數相關的。

給切片傳遞的鍵是一個特殊的 slice 對象。該對象擁有可描述所請求切片方位的屬性。

a = [1,2,3,4,5,6]
x = a [ 1 : 5 ]                # x = a.__getitem__(slice( 1, 5, None))
a [ 1 : 3 ] = [10, 11, 12 ]    # a.__setitem__(slice(1, 3, None), [ 10, 11, 12 ])
del a [ 1 : 4 ]                # a.__delitem__(slice(1, 4, None))
複製代碼

看看代碼具體實現

def between(beg, end, mid):
	# 判斷mid是否位於begin和end之間
	return end > mid >= beg or end < mid <= beg
 
def get_slice(a, beg, end, delta=1):
 	# 數組切片get方式
 	if delta == 0: 
        raise ValueError("slice step cannot be 0")
 	# 將負數下標轉化一下
 	if beg < 0: 
        beg += len(a)
 	if end < 0: 
        end += len(a)
 	# 若是轉化完成以後依然不在合法範圍內,則返回空列表
 	if beg < 0 and end < 0 or beg >= len(a) and end >= len(a): 
        return []
 	# 若是方向不一樣,則返回空列表
 	if (end - beg) * delta <= 0: 
        return []
 	# 將越界的部分進行裁剪
 	beg = max(0, min(beg, len(a) - 1))
 	end = max(-1, min(end, len(a)))
 	ans = []
 	i = beg
 	while between(beg, end, i):
  		ans.append(a[i])
  		i += delta
 	return ans
 
def set_slice(a, li, beg, end, delta=1):
 	if delta == 0: 
        raise ValueError("slice step cannot be 0")
 	if delta == 1:
  	# 若是delta==1,那麼li的長度能夠隨意
  	if beg < 0: 
        beg += len(a)
  	if end < 0: 
        end += len(a)
  	beg = max(0, min(beg, len(a) - 1))
  	end = max(-1, min(end, len(a)))
  	for i in range(beg, end):
   		del a[beg]
  	for i in reversed(li):
   		a.insert(beg, i)
	else:
  	# delta!=1,至關於替換
  	if len(get_slice(a, beg, end, delta)) != len(li): 
        raise ValueError("array don't match")
  	if len(li) == 0: 
        return
  	if beg < 0: 
        beg += len(a)
  	if end < 0: 
    	end += len(a)
  	beg = max(0, min(beg, len(a) - 1))
  	# 用li中的所有元素逐一替換
  	for ind, value in enumerate(li):
   		a[ind * delta + beg] = value
複製代碼

總結

一、本次貝斯狸的 Python 學習之旅是一次嘗試,想讓程序員學習生活變得更加有樂趣,也算知足了個人願望,重拾 PhotoShop,後面還會更新更多有趣可愛的對話,輕鬆實現學習生活兩不誤。

二、學習知識是一個按部就班的過程,正如小狸同樣,學會了使用,可是卻沒有深刻,小組長隨機抽查便中了招,因此咱們要時刻保持好奇心,凡事多問個爲何?這樣才能進步。

推薦閱讀

牆裂推薦 Anaconda | 安利 Python IDE

Python 學習筆記之類與實例

Python 學習筆記之類「面向對象,超類,抽象」

好書推薦

機器學習

近期正準備研究機器學習,周志華老師的西瓜書已經入手,簡明而深入,是入門機器學習必讀之物,通俗易懂,書在內容上比較全面的介紹機器學習的各個分支,以及重要而經常使用的方法應該算一本國內本科生適合看的中文機器學習書籍。

豆瓣簡介

機器學習是計算機科學與人工智能的重要分支領域,本書做爲該領域的入門教材,在內容上儘量涵蓋機器學習基礎知識的各方面。

全書共 16 章,大體分爲 3 個部分:

第 1 部分(第1~3 章)介紹機器學習的基礎知識;

第 2 部分(第4~10 章)討論一些經典而經常使用的機器學習方法(決策樹、神經網絡、支持向量機、貝葉斯分類器、集成學習、聚類、降維與度量學習);

第 3 部分(第11~16 章)爲進階知識,內容涉及特徵選擇與稀疏學習、計算學習理論、半監督學習、機率圖模型、規則學習以及強化學習等。

我不害怕成爲這樣「強硬」的姑娘

這又是我曾經讀過的一本書,從超級演說家看劉媛媛的演講,到看她的書,講述了劉媛媛從大學一直到考研,最後進入超級演說家,最後到創業的心路歷程,她的愛折騰,不服輸的韌勁感染了不少人,還講述了她是如何在 3 個月考上北大的,她的學習方法頗有效,想要提升學習效率拿高分的能夠看看。

豆瓣簡介

這是一本寫給千萬年輕人的成長激勵之書。

書中集結做者親歷、親聞之事,它們如同一個個不一樣的瞬間,把成長的困惑,生活的現實、功利、殘酷拆開來給你看。當你在逆襲路上懷疑本身的堅持的時候——你要相信命運給你一個比別人低的起點,是但願你用你的一輩子去奮鬥出一個絕地反擊的故事。

《寒門貴子》一我的做到極致把本身做到死路無路可走的時候,騰空而起死裏逃生,這就是奇蹟。

《不做死就不會死》當你猶豫是否要不顧一切一往無前的時候——只要還有能夠努力的地方,就無須絕望;只要有能夠去的方向,就要走過去。

《看我如何對付這操蛋的生活》不逼着本身跟命運死磕到底,不逼着本身跟這殘酷的世界討個說法,你就永遠不知道本身到底有多強大。

《如何面對不成功的人生》

《我不害怕成爲這樣「強硬」的姑娘》用熱血激昂的文字告訴你——當別人還在沉睡的時候,你就出發吧。當別人還在掙扎的時候,你就到達吧。由於有一大把去努力的理由,卻找不出任何一個理由不努力。

不懼生活,始終向上,在逆境中活出豐盛耀眼的本身。

相關文章
相關標籤/搜索