【Python從入門到精通】(五)Python內(nèi)置的數(shù)據(jù)類型-序列和字符串,沒有女友,不是保姆,只有拿來(lái)就能用的干貨

您好,我是碼農(nóng)飛哥,感謝您閱讀本文,歡迎一鍵三連哦。
本文主要介紹Python數(shù)據(jù)類型中序列和字符串,文末有彩蛋哦
干貨滿滿,建議收藏,用到時(shí)??闯P?。 小伙伴們?nèi)缬袉栴}及需要,請(qǐng)留言告訴我哦~ ~ ~。

前言

上一篇文章我們介紹了Python內(nèi)置數(shù)據(jù)類型中幾個(gè)屬于數(shù)字的數(shù)據(jù)類型。這篇文章就開始介紹序列類型。本文首先會(huì)介紹序列的基本概念和通用的方法,接著會(huì)介紹Python中的字符串的概念和基本用法。

序列

序列是什么?

序列(sequence)指的是一塊可存放多個(gè)元素的內(nèi)存空間,這些元素按照一定的順序排列。每個(gè)元素都有自己的位置(索引),可以通過這些位置(索引)來(lái)找到指定的元素。如果將序列想象成一個(gè)酒店,那么酒店里的每個(gè)房間就相當(dāng)于序列中的每個(gè)元素,房間的編號(hào)就相當(dāng)于元素的索引,可以通過編號(hào)(索引)找到指定的房間(元素)。

有哪些序列類型呢?

了解完了序列的基本概念,那么在Python中一共有哪些序列類型呢?如下圖所示:


在這里插入圖片描述

從圖中可以看出在Python中共有7種序列類型,分別是文本序列類型(str);二進(jìn)制序列類型 bytes和bytearray;列表(list);元組(tuple);集合類型(set和frozenset);范圍類型(range)以及字典類型(dict)。

1. 按照能存儲(chǔ)的元素劃分

按照能存儲(chǔ)的元素可以將序列類型劃分為兩大類:分別是:容器序列和扁平序列
容器序列:即可容納不同數(shù)據(jù)類型的元素的序列;有 list;tuple;set;dict
舉個(gè)栗子:

list=['runoob',786,2.23,'john',70.2]

這里的list保存的元素有多種數(shù)據(jù)類型,既有字符串,也有小數(shù)和整數(shù)。
扁平序列:即只能容納相同數(shù)據(jù)類型的元素的序列;有bytes;str;bytearray,以str為例,同一個(gè)str只能都存儲(chǔ)字符。

2. 按照是否可變劃分

按照序列是否可變,又可分為可變序列和不可變序列。
這里的可變的意思是:序列創(chuàng)建成功之后,還能不能進(jìn)行修改操作,比如插入,修改等等,如果可以的話則是可變的序列,如果不可以的話則是不可變序列。
可變序列有列表( list);字典(dict)等,
不可變的序列有元祖(tuple),后面的文章會(huì)詳細(xì)的對(duì)這些數(shù)據(jù)類型做詳細(xì)介紹。

序列都有哪些方法以及特性呢?

序列的索引

在介紹序列概念的時(shí)候,說(shuō)到了序列中元素的索引,那么什么是序列的索引呢?其實(shí)就是位置的下標(biāo)。 如果對(duì)C語(yǔ)言中的數(shù)組有所了解的話,我們知道數(shù)組的索引下標(biāo)都是從0開始依次遞增的正數(shù),即第一個(gè)元素的索引下標(biāo)是0,第n個(gè)元素的索引下標(biāo)是n-1。序列的索引也是同理,默認(rèn)情況下都是從左向右記錄索引,索引值從0開始遞增,即第一個(gè)元素的元素的索引值是0,第n個(gè)元素的索引值是n-1。如下圖所示:

在這里插入圖片描述

當(dāng)然與C語(yǔ)言中數(shù)組不同的是,Python還支持索引值是負(fù)數(shù),該類的索引是從右向左計(jì)數(shù)。換句話說(shuō),就是從最后一個(gè)元素開始計(jì)數(shù),從索引值-1開始遞減,即第n個(gè)元素的索引值是-1,第1個(gè)元素的索引值是-n,如下圖所示:
在這里插入圖片描述

序列切片

切片操作是訪問序列元素的另一種方式,它可以訪問一定范圍內(nèi)的元素,通過切片操作,可以生成一個(gè)新的序列。切片操作的語(yǔ)法格式是:

sname[start : end : step]

各個(gè)參數(shù)的含義分別是:

  1. sname: 表示序列的名稱
  2. start:表示切片的開始索引位置(包括該位置),此參數(shù)也可以不指定,不指定的情況下會(huì)默認(rèn)為0,也就是從序列的開頭開始切片。
  3. end:表示切片的結(jié)束索引位置(不包括該位置),如果不指定,則默認(rèn)為序列的長(zhǎng)度。
  4. step: 表示步長(zhǎng),即在切片過程中,隔幾個(gè)存儲(chǔ)位置(包括當(dāng)前位置)取一次元素,也就是說(shuō),如果step的值大于1,比如step為3時(shí),則在切片取元素時(shí),會(huì)隔2個(gè)位置去取下一個(gè)元素。
    還是舉個(gè)栗子說(shuō)明下吧:
str1='好好學(xué)習(xí),天天向上'
# 取出索引下標(biāo)為7的值
print(str1[7])
# 從下標(biāo)0開始取值,一直取到下標(biāo)為7(不包括)的索引值
print(str1[0:7])
# 從下標(biāo)1開始取值,一直取到下標(biāo)為4(不包括)的索引值,因?yàn)閟tep等于2,所以會(huì)隔1個(gè)元素取值
print(str1[1:4:2])
# 取出最后一個(gè)元素
print(str1[-1])
# 從下標(biāo)-9開始取值,一直取到下標(biāo)為-2(不包括)的索引值
print(str1[-9:-2])

運(yùn)行的結(jié)果是:

向
好好學(xué)習(xí),天天
好習(xí)
上
好好學(xué)習(xí),天天

序列相加

Python支持類型相同的兩個(gè)序列使用"+"運(yùn)算符做想加操作,它會(huì)將兩個(gè)序列進(jìn)行連接,但是不會(huì)去除重復(fù)的元素,即只做一個(gè)簡(jiǎn)單的拼接。

str='他叫小明'
str1='他很聰明'
print(str+str1)

運(yùn)行結(jié)果是:他叫小明他很聰明

序列相乘

Python支持使用數(shù)字n乘以一個(gè)序列,其會(huì)生成一個(gè)新的序列,新序列的內(nèi)容是原序列被重復(fù)了n次的結(jié)果。

str2='你好呀'
print(str2*3)

運(yùn)行結(jié)果是:你好呀你好呀你好呀 ,原序列的內(nèi)容重復(fù)了3次。

檢查元素是否包含在序列中

Python中可以使用in關(guān)鍵字檢查某個(gè)元素是否為序列中的成員,其語(yǔ)法格式為:

value in sequence

其中,value表示要檢查的元素,sequence表示指定的序列。
舉個(gè)栗子:查找字是否在字符串str1中。

str1='好好學(xué)習(xí),天天向上'
print('天' in str1)

運(yùn)行結(jié)果是:True

序列相關(guān)的內(nèi)置函數(shù)

函數(shù) 功能 適用場(chǎng)景
len() 計(jì)算序列的長(zhǎng)度,即返回序列中包含了多少個(gè)元素 適用于列表,元組、字典、集合、字符串等
max() 找出序列中的最大元素,針對(duì)序列中元素是數(shù)字的情況 。 適用于列表,元組、字典、集合、range等
min() 找出序列中的最小元素,針對(duì)序列中元素是數(shù)字的情況 適用于列表,元組、字典、集合、range等
list() 將序列轉(zhuǎn)換為列表 適用于字符串
str() 將序列轉(zhuǎn)換為字符串 適用于列表,元組,數(shù)字
sum() 對(duì)序列中的元素求和,注意,對(duì)序列使用sum()函數(shù)時(shí),做加和操作的必須全部是數(shù)字,不能是字符或者字符串,因?yàn)榻忉屍鳠o(wú)法判定事要做連接操作,還是做加和操作 適用于列表,元組、集合、range等
sorted() 對(duì)元素進(jìn)行排序 適用于列表,元組、字典、集合、range,字符串等
reversed() 反向序列中的元素 適用于列表,元組、字典、集合、range,字符串等
enumerate() 枚舉列表元素,返回枚舉對(duì)象,其中每個(gè)元素包含下標(biāo)和值的元組。該函數(shù)對(duì)元組/字符串同樣有效。 適用于列表,元組、字典、集合、range,字符串等

依然是舉例說(shuō)明:

str3='碼農(nóng)飛哥'
print('字符串的長(zhǎng)度=',len(str3))
print('轉(zhuǎn)成列表=',list(str3))
print('調(diào)用enumerate函數(shù)',enumerate(str3))
print('遍歷enumerate函數(shù)的結(jié)果:')
for item in enumerate(str3):
    print(item)

print('遍歷reversed函數(shù)的結(jié)果:')
for item in reversed(str3):
    print(item)

list2=['碼農(nóng)','飛哥']
print('列表轉(zhuǎn)字符串=',str(list2))
list1=[12,20,5,8,1]
print('最大值=',max(list1))
print('最小值=',min(list1))
print('求和結(jié)果=',sum(list1))
print('排序結(jié)果=',sorted(list1))

運(yùn)行結(jié)果是:

字符串的長(zhǎng)度= 4
轉(zhuǎn)成列表= ['碼', '農(nóng)', '飛', '哥']
調(diào)用enumerate函數(shù) <enumerate object at 0x7f90818cd540>
遍歷enumerate函數(shù)的結(jié)果:
(0, '碼')
(1, '農(nóng)')
(2, '飛')
(3, '哥')
遍歷reversed函數(shù)的結(jié)果:
哥
飛
農(nóng)
碼
列表轉(zhuǎn)字符串= ['碼農(nóng)', '飛哥']
最大值= 20
最小值= 1
求和結(jié)果= 46
排序結(jié)果= [1, 5, 8, 12, 20]

字符串

前面介紹序列時(shí),大部分例子都是用字符串來(lái)表示的,那么就來(lái)認(rèn)識(shí)一下字符串吧!

字符串的定義

由若干個(gè)字符組成的集合就是一個(gè)字符串(str),Python中的字符串必須由雙引號(hào)""或者單引號(hào)''包圍。其語(yǔ)法格式是:

"字符串內(nèi)容"
'字符串內(nèi)容'

如果字符串中包含了單引號(hào)需要做特殊處理。比如現(xiàn)在有這樣一個(gè)字符串
str4='I'm a greate coder' 直接這樣寫有問題的。
處理的方式有兩種:

  1. 對(duì)引號(hào)進(jìn)行轉(zhuǎn)義,通過轉(zhuǎn)義符號(hào)\進(jìn)行轉(zhuǎn)義即可:
str4='I\'m a greate coder'
  1. 使用不同的引號(hào)包圍字符串
str4="I'm a greate coder"

這里外層用雙引號(hào),包裹字符串里的單引號(hào)。

原始字符串的處理

有時(shí)候我們并不想字符串被轉(zhuǎn)義,這種情況下可以使用在字符串的開頭加上r前綴,就變成了原始字符串,具體格式是:

str1 = r'原始字符串內(nèi)容'
str2 = r"原始字符串內(nèi)容"

舉個(gè)例子吧:

str4=r'碼農(nóng)\'飛哥真棒'
str5=r"碼農(nóng)\'飛哥真棒"
print(str4)
print(str5)

運(yùn)行結(jié)果是:

碼農(nóng)\'飛哥真棒
碼農(nóng)\'飛哥真棒

字符串的分割方法

在實(shí)際開發(fā)中,我們經(jīng)常要根據(jù)文件名獲取文件的后綴名,這該如何處理呢?

path = "test_user_info.py"

現(xiàn)在要提取后綴名py,其實(shí)可以通過split方法,將字符串分割成列表(list),然后從列表中取值,就像下面這樣:

suffix = path.split(".")[1]
print("suffix: {}".format(suffix))

字符串拼接的方法

字符串拼接的方法有三種,分別是:

  1. 通過join方法
    通過join方法的語(yǔ)法格式是str.join(iterable),其中join的條件是 iterable可迭代的,并且列表元素是字符串(str)。就是對(duì)iterable中的每個(gè)元素進(jìn)行遍歷,然后拼接到str上,這里的str是用于指定合并時(shí)的分隔符,如果想拼接之后的字符串是逗號(hào)分割,那么寫法是
  2. 通過format方法
    format 方法是通過占位符占據(jù)要拼接的字符串的位置。
  3. 通過+運(yùn)算符
    現(xiàn)有字符串碼農(nóng)飛哥好,,要求將字符串碼農(nóng)飛哥牛逼拼接到其后面,生成新的字符串碼農(nóng)飛哥好,碼農(nóng)飛哥牛逼
str6 = '碼農(nóng)飛哥好,'
# 使用+ 運(yùn)算符號(hào)
print('+運(yùn)算符拼接的結(jié)果=',(str6 + '碼農(nóng)飛哥牛逼'))
#使用join拼接字符串
list2 = ['碼', '農(nóng)', '飛', '哥', '牛', '逼']
print('無(wú)符號(hào)分割join的拼接結(jié)果=', ''.join(list2))
print('逗號(hào)分割join的拼接結(jié)果=',   ','.join(list2))
# 使用format拼接
str7 = str6 + '{0}'
print('format拼接的結(jié)果=',str7.format('碼農(nóng)飛哥牛逼'))
str8=str6+'{0}{1}'
print('format拼接的結(jié)果=',str8.format('碼農(nóng)飛哥','牛逼'))

運(yùn)行結(jié)果是;

+運(yùn)算符拼接的結(jié)果= 碼農(nóng)飛哥好,碼農(nóng)飛哥牛逼
無(wú)符號(hào)分割join的拼接結(jié)果= 碼農(nóng)飛哥牛逼
逗號(hào)分割join的拼接結(jié)果= 碼,農(nóng),飛,哥,牛,逼
format拼接的結(jié)果= 碼農(nóng)飛哥好,碼農(nóng)飛哥牛逼
format拼接的結(jié)果= 碼農(nóng)飛哥好,碼農(nóng)飛哥牛逼

大家想想如果還直接使用str6.join('碼農(nóng)飛哥牛逼') 最后的輸出結(jié)果是啥呢?

str6 = '碼農(nóng)飛哥好,'
print(str6.join('碼農(nóng)飛哥牛逼'))
print(str6)

運(yùn)行結(jié)果是

碼碼農(nóng)飛哥好,農(nóng)碼農(nóng)飛哥好,飛碼農(nóng)飛哥好,哥碼農(nóng)飛哥好,牛碼農(nóng)飛哥好,逼
碼農(nóng)飛哥好,

就是將碼農(nóng)飛哥牛逼遍歷,然后每個(gè)字符拼接到str6前面,所以前面的 str6是作為一個(gè)拼接的分隔符號(hào)的。
需要特別注意的是拼接后的字符串是新的字符串,而不是在原有的字符串上修改。所以我們看到原字符串str6在拼接后并沒有改變。這個(gè)特新跟Java中的String是一樣,那么有小伙伴知道str不可變的原因的?歡迎留言哦。
所以在遍歷拼接字符串的時(shí)候要特別注意賦值,就像這樣:

list = ['碼', '農(nóng)', '飛', '哥', '牛', '逼']
str_list = str("")
for str1 in list:
    str_list = str_list + "file {0}\n".format(str1)
print(str_list)

總結(jié)

本文詳細(xì)介紹了Python內(nèi)置數(shù)據(jù)類型中的序列類型,介紹了序列的基本概念,序列就是一塊存儲(chǔ)多個(gè)元素的內(nèi)存空間,這些元素按照一定的順序排列,介紹了序列的通性,可以把序列當(dāng)成其他語(yǔ)言中的數(shù)組,可以把序列想象成一個(gè)酒店。序列通過索引來(lái)查找里面的值。最后介紹了字符串,希望對(duì)讀者朋友們有所幫助。

牛刀小試一下吧

現(xiàn)有如下的字符串

str6='程序猿正在創(chuàng)造世界'
  1. 如何根據(jù)str6輸出結(jié)果為正創(chuàng) 的字符串?
  2. 如何根據(jù)str6輸出結(jié)果為界世造創(chuàng)的默默猿序程的字符串呢?
    歡迎知道的小伙伴踴躍留言,我們一起交流討論。參考答案詳見文尾:

參考答案

現(xiàn)有如下的字符串

str6='程序猿正在創(chuàng)造世界'
  1. 如何根據(jù)str6輸出結(jié)果為正創(chuàng) 的字符串?
  2. 如何根據(jù)str6輸出結(jié)果為界世造創(chuàng)的默默猿序程的字符串呢?

這里主要考察的是字符串的切片以及字符串的拼接等知識(shí)點(diǎn)。這里還用到了反轉(zhuǎn)函數(shù)。

  1. 答案一:
str6 = '程序猿正在創(chuàng)造世界'
# 索引的坐標(biāo)是從0開始的,3表示取第4個(gè)字符串,6表示到第七個(gè)字符串(不包括),步長(zhǎng)是2
print(str6[3:6:2])
# 首先獲取反轉(zhuǎn)之后的字符串
str2 = ''.join(reversed(str6))
#將字符串拼接成我們想要的字符
print(str2[0:4] + '的默默' +str2[6:9])
  1. 答案二:
str6 = '程序猿正在創(chuàng)造世界'
# 第一題
print(str6[3]+str6[5])
# 第二題
str6=str6[0:3]+str6[5:]
list2 = list(reversed(str6))
list2.insert(4, '的默默')
print(''.join(list2))

我是碼農(nóng)飛哥,再次感謝您讀完本文。
全網(wǎng)同名【碼農(nóng)飛哥】。不積跬步,無(wú)以至千里,享受分享的快樂
我是碼農(nóng)飛哥,再次感謝您讀完本文。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容