序列的概念
序列sequence
是python中最基本的數(shù)據(jù)結(jié)構(gòu)呛凶。指的是一塊可存放多個(gè)值的連續(xù)內(nèi)存空間行贪,這些值按一定順序排列,可通過每個(gè)值所在位置的編號(稱為索引)訪問它們崭捍。
為了更形象的認(rèn)識序列啰脚,可以將它看做是一家旅店,那么店中的每個(gè)房間就如同序列存儲數(shù)據(jù)的一個(gè)個(gè)內(nèi)存空間粒梦,每個(gè)房間所特有的房間號就相當(dāng)于索引值。也就是說缴淋,通過房間號(索引)我們可以找到這家旅店(序列)中的每個(gè)房間(內(nèi)存空間)昼蛀。
在Python中,常用的序列類型包括字符串、列表夫植、元組油讯、集合和字典。
一陌兑、字符串
之前我們說Python中不可變數(shù)據(jù)類型的時(shí)候已經(jīng)介紹過字符串的一些基礎(chǔ)用法沈跨,忘記的可以查看文檔2的四-6。
下面我們說說字符串的更高級一些的用法兔综。
(一)下標(biāo)
1饿凛、概念
“下標(biāo)”
又叫“索引”
,就是編號软驰。比如火車的座位號涧窒,座位號的作用:按照編號快速找到對應(yīng)的座位。同理锭亏,下標(biāo)的作用即是通過下標(biāo)快速找到數(shù)據(jù)中對應(yīng)位置的字符纠吴。
所以字符串實(shí)際上就是字符的數(shù)組,如果想使用字符串中某個(gè)特定的數(shù)據(jù)慧瘤,那么可以通過下標(biāo)的方法取得戴已。換句話說字符串?dāng)?shù)據(jù)的下標(biāo)從0開始順序分配一個(gè)編號锅减,使用這個(gè)編號精確找到某個(gè)字符數(shù)據(jù)糖儡。
注意:下標(biāo)從0開始,向后遞增上煤。
image.png
2休玩、快速體驗(yàn)
需求:字符串name = "abcdef"
,取到不同下標(biāo)對應(yīng)的數(shù)據(jù)。
name = "abcdef"
# 下標(biāo)得到的是下標(biāo)為某個(gè)數(shù)字所對應(yīng)的數(shù)據(jù)
print(name[1])
print(name[0])
print(name[2])
"""
輸出結(jié)果
b
a
c
"""
3拴疤、字符串取值的兩種方式
在Python的字符串取值中永部,有兩種取值方式,即正負(fù)取值呐矾。
- 正向下標(biāo)從0開始苔埋,下標(biāo)值依次遞增。
- 負(fù)向下標(biāo)從-1開始蜒犯,下標(biāo)值依次遞減组橄。
如下圖:
練習(xí):
name = "abcdef"
print(name[-1])
print(name[-4])
print(name[-2])
"""
輸出結(jié)果
f
c
e
"""
(二)切片
切片是指對操作的對象截取其中一部分的操作。字符串罚随、列表玉工、元組都支持切片操作。
1淘菩、語法
序列[開始位置下標(biāo):結(jié)束位置下標(biāo):步長]
注意
- 不包含結(jié)束位置下標(biāo)對應(yīng)的數(shù)據(jù)(截取的規(guī)則為“前閉后開”)遵班, 正負(fù)整數(shù)均可;
- 步長表示潮改,每次獲取元素的間隔狭郑,默認(rèn)步長為1。(可省略不寫)
步長正負(fù)整數(shù)均可汇在,不能是0翰萨,設(shè)置0會直接異常。- 做切片操作時(shí)糕殉,總會返回一個(gè)新的列表(字符串亩鬼,元祖),不會影響原來的列表(字符串糙麦,元祖)辛孵。
- 一般創(chuàng)建列表時(shí),變量的名字會使用復(fù)數(shù)赡磅。(我們直接輸出魄缚,就不定義變量名了)
2、體驗(yàn)
# 序列名[開始位置的下標(biāo):結(jié)束位置的下標(biāo):步長]
# 我定義的一個(gè)字符串就是從0開始的數(shù)字
# 對應(yīng)著字符串的腳標(biāo)焚廊,方便我們直觀的查看結(jié)果冶匹。
str1 = '012345678'
# 1.規(guī)范截取,可觀察前閉后開
print(str1[2:5:1]) # 234
# 2.驗(yàn)證步長咆瘟,為隔幾個(gè)字符曲一次值
print(str1[2:5:2]) # 24
# 3.可以不寫步長嚼隘,默認(rèn)為1
print(str1[2:5]) # 234
# 4.如果不寫開始,默認(rèn)從0開始選取
print(str1[:5]) # 01234
# 5.如果不寫結(jié)束袒餐,表示從某位置開始飞蛹,選取到最后谤狡。
print(str1[2:]) # 2345678
# 6.如果不寫開始和結(jié)束,表示選取所有卧檐。
# 其實(shí)相當(dāng)于創(chuàng)建了一個(gè)字符串的副本
print(str1[:]) # 012345678
# 負(fù)數(shù)測試
# 1.如果步長為負(fù)數(shù)墓懂,表示倒敘選取
print(str1[::-1]) # 876543210
# 2.下標(biāo)-1表示最后一個(gè)數(shù)據(jù),下標(biāo)數(shù)值向前依次遞減霉囚。
# 如下:從倒數(shù)第4位到倒數(shù)第1位捕仔,正向截取,前閉后開盈罐。
print(str1[-4:-1]) # 567
"""
3.終極測試
從倒數(shù)第4位到倒數(shù)第1位榜跌,從左向右,
正向截取盅粪,前閉后開钓葫。
但是-1步長:是從右向左選取。
兩個(gè)選取方向相反票顾,所以不能選取出數(shù)據(jù)
"""
print(str1[-4:-1:-1]) # 沒有結(jié)果
# 如下修改瓤逼,從最后1位截取到倒數(shù)第4位
# 方向是從后向前,也就是從右到左库物,
# 步長-1的方向,也是從從右到左贷帮。
# 所以可以取到值戚揭。
print(str1[-1:-4:-1]) # 876
"""
重點(diǎn):****
如果選取方向(下標(biāo)開始到結(jié)束的方向) 和
步長的方向沖突,
則無法選取數(shù)據(jù)撵枢。
"""
總結(jié):
這種語法很有用民晒,因?yàn)槟憬?jīng)常需要在不知道列表長度的情況下訪問最后的元素。這種約定也適用于其他負(fù)數(shù)索引锄禽,例如潜必,索引-2返回倒數(shù)第二個(gè)列表元素,索引-3返回倒數(shù)第三個(gè)列表元素沃但,以此類推 磁滚。
體驗(yàn)補(bǔ)充:
# 1.做切片操作時(shí),總會返回一個(gè)新的列表宵晚,不會影響原來的列表垂攘。
stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精']
new_stus = stus[0 :3]
print(stus)
print(new_stus)
"""
輸出結(jié)果:
['孫悟空', '豬八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
['孫悟空', '豬八戒', '沙和尚']
"""
# 步長不能設(shè)置為0
# 結(jié)果:ValueError: slice step cannot be zero
print(stus[0 :3 : 0]) # 異常