Python 第七天

本文介绍了Python字符串的切片操作,包括切片的语法、索引规则和特殊用例。详细解析了切片原理,解释了为何递增步长为-1会得到逆序输出。同时,文章探讨了字符串切片的特例,并通过示例代码帮助理解切片的实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串的切片和索引

在Python内,字符串可以被多种关键字所调用也可被用来切片,不过需要注意的是,因为字符串是不可更改的类型,关键字和切片的操作并不会改变字符串本身,而是将操作后的值以赋值或者其他形式输出,原字符串不变。

切片

已知字符串x,字符串内每一个单独的字符都有一个属于的索引下表,这个索引下标从左往右由0开始递增。

a='qwertyuiooooooop'
b=a[1:5:1]#括号里的参数分别代表起始索引编号,结束索引编号,递增步长
print(b) #out:wert

以上案例中将字符串中某一段输出的方式便称之为切片,切片的起始可以是正数也可以是负数,递增步长可以不填写,不填写时默认为1,需要注意的是,切片的值输出时是不包含结束索引所对应的字符的,即由起始索引开始一直到结束索引的前一位结束

a='qwertyuiooooooop'
b=a[1:-1]#括号里的参数分别代表起始索引编号,结束索引的-1代表最后一个,递增步长
print(b) #out:wertyuiooooooo
a='qwertyuiooooooop'
b=a[1:-1:2]#括号里的参数分别代表起始索引编号,结束索引的-1代表最后一个,递增步长为2
print(b) #out:wryiooo

在Python内,如果一个字符串一共有5个字符组成,从左开始第一位字符的下标索引为0,那么当下标递增至第五位字符时,第五位的下标为4,从数学角度来理解,也就是最后一位的下标等于字符串的字符个数减一,我们一般成为字符串的字符个数为字符串长度,Python内由关键字len进行引用,例如

a='asd'
print(len(a))#len()用于计算字符串的长度,所以这里显示的结果为3,那么字符串的索引下标则是[0,len(a))的半闭半开区间。

此外,字符串索引也可以从最后一位开始,从最后一位开始时,最后一位的下标为-1

a='abcdefghijk'
print(a[-1:-4:-1])#递增步长为-1,这里的步长不能使用默认值,但并不是说有负数的情况就不能空着步长,而是这个案例的情况不行,当使用负数索引时,索引值的范围为[-1,-len(a)]的全闭区间。
a='abcdefghijk'
print(a[-9:7])#这里则是省略步长,默认1,而且可以正常输出 out:cdefg
特例
a='qwertyuiooooooop'
b=a[::-1]#如果起始不填索引值,则默认从第一位开始,结尾不填写索引值,则默认为直至结束为止,递增为-1,指代倒叙。
print(b) #out:poooooooiuytrewq
切片原理解析

为什么递增步长填-1会是逆序输出呢?起始切片本质上来说是个循环输出的应用,以以下案例引入

a=input("***")
print("正索引")
for i in range(len(a)-1,-1,-1):
    print(i,end=' ')
    print(a[i])
print()
print("<---------------------------------->")
print("负索引")
for i in range(-1,-(len(a)+1),-1):
    print(i,end=' ')
    print(a[i])


i=len(a)-1

while i>=0:
    print(i,a[i],end=' ')
    i-=1
print()
i=-1
while abs(i)<=len(a):
    print(i,a[i],end=' ')
    i-=1

上述代码的作用都是一样的,都是把字符串倒序输出。再看下列代码,不使用python的切片功能,而是由自己编写实现切片功能

a1='qwertyui'
a=input("起始")
b=input('结束')
c=input("步长")

if a=='': 
    a=0
if b=='':
    b=len(a1)
if c=='':
    c=1
#因为python的切片功能可以有缺省,所以从上面第一个if开始直至本注释前的代码就是用来处理缺省情况的
a=int(a)
b=int(b)
c=int(c) #输入进来的内容还是字符串类型,这里必须将它转换为整型,如果在缺省之前转换,那么空字符的情况就无法判断会出错,毕竟空字符不算数字
if a==0 and b==len(a1) and c==-1:#处理a[::-1]的切片特例
    a=len(a1)-1
    b=-1

if a<0:
    a=len(a1)+int(a)
if b<0:
    b=len(a1)+int(b) #这里的两个if都是用来处理输入进来的是负数的情况的,当输入的索引值不超出字符串的长度的情况下,负索引对应的字符刚好等于字符串长度加上负索引的值所对应的正索引的字符,例如奇数长度的字符串“abc”,用负索引输出b的话,那么索引值为-2,“abc”的长度为3,3+(-2)=1,而1正好是b的正索引值,再比如偶数长度的字符串“abcd”,用负索引输出b,则索引值为-3,长度为4,4+(-3)=1,也可以得到b的正索引

print(a1[a:b:c])#这里的输出是用来比较是否和下列的循环输出结果有误差,如果有误差,则以这里的为准
for i in range(a,b,c):
    print(a1[i],end=' ')

运行上述的代码可以发现,起始python的切片索引是采用了循环,以及将负索引转化为正索引处理的方式,那么有些问题就能解决了。

1
a='abcdefghijk'
print(a[-9:7])

之所以这里可以缺省,实质上是,len(a)+(-9)=2,而2到7之间是一个递增的过程,所以递增步长如果是1的话就可以省略了。

2
a='abcdefghijk'
print(a[-1:-4:-1])

同理,len(a)+(-1)=10,len(a)+(-4)=7,10到7这是一个递减的过程,所以这里的步长根本不是1,而是-1,这个无法省略。

3
a='abcdefgdcb'

c=a[3:5:-1]
print(c)

d=a[-7:2:1]
print(d)

那么同理,这里的案例三就能明白为什么没有结果输出了,因为3到5为递增,步长1无法满足,另一个则是len(a)+(-7)=10+(-7)=3,3到2是递减的过程,1也无法满足,所以没有值输出。

字符串的一些关键字

a='abcdefgdcb'
i=a.rfind('c')
print(i)
i=a.rindex('c')
print(i)
i=a.count('c')
print(i)
a='12-13-14-15-16-17-18-19-20'
b=a.partition('-')
print(b)
b=a.rpartition('-')
print(b)
b=a.split('-')
print(b)

a='abc\ndef\nghk\ni'
a1=a.splitlines()
print(a1)
a1=a.split('\n')
print(a1)
print("**",a1[3])

a='1-2-3-4'
b=a.split('-',maxsplit=2)
print(b)
b=a.split('-',maxsplit=13)
print(b)

a='1a2a3a'
b=a.replace('a','b')
print(a)
print(b)
a='qwerfvbn'
x=str.maketrans('abcdefgh','12345678')
print(x)
b=a.translate(x)
print(b)

y=str.maketrans('12345678','abcdefgh')
c=b.translate(y)
print(c)

a='abcd'
x=a.center(10)
print(x,end='^')
print()
y=a.ljust(10,'#')
print(y)
z=a.rjust(10,'$')
print(z)
z1=a.zfill(12)
print(z1)
a='           a               '
b=a.strip()
print(b)
b=a.lstrip()
print(b,end='#')
print()
b=a.rstrip()
print(b,end='#')
print()
a='########a##############'
b=a.strip('#')

print(b)
a='姓名{},年龄{}'
b=a.format('诶丽丽',13)
print(b)
print(a)
print('{0} {1} {0} {1} {0}'.format('Python','Oblivious'))
a='{0} {1} {0} {1} {0}'
b=a.format('Python','Oblivious')
print(b)
a='{name}啊{name}啊{name}啊,你又去{age},{hold}'.format(name='胡适',age='打牌',hold='殆已')
print(a)
a='{:$^4}'.format('李四')#输出字符为李四,填充字符为$,填充字符和输出字符合计占4字符,^表示输出字符居中
print(a)
a='{:&<4}'.format('王五')#输出字符为王五,填充字符为&,填充字符和输出字符合计占4字符,<表示输出字符左对齐
print(a)
a='{:@>4}'.format('赵六')#输出字符为赵六,填充字符为@,填充字符和输出字符合计占4字符,>表示输出字符右对齐
print(a)

a='长度{:.0f},高度{:.1f},宽度{:.2f},深度{:.3f}'.format(1.111111,2.2222222,3.3333333,4.444444444444444)
print(a)

a='十进制的13转二进制{:b}\n十进制的13转八进制{:o}\n十进制的13转十六进制{:x}'.format(13,13,13)
print(a)

a='我叫%s,今年%d,身高%f,67%%'%('Tifa',23,178.66)#%f不添加小数位数时,输出六位小数
print(a)
a='我叫%s,今年%d,身高%.1f,67%%'%('Tifa',23,178.66)
print(a)
a='abcabcABC'
b=a.upper()
print(b)
b=a.lower()
print(b)
b=a.swapcase()
print(b)
a='hollo gugou a'
b=a.title()
print(b)
b=a.capitalize()
print(b)

a='a\tbb\tccc\t'
print(a)
b=a.expandtabs()#将\t转化为空格,和前面的字符一起合计八个字符输出,所以a+\t有7个空格
print(b)

a='asdfg'
b=a.isalpha()
print(b)

a='45tgkl.'
b=a.isalpha()
print(b)

a='1234567'
b=a.isdigit()
print(b)

a='1.3'
b=a.isdigit()
print(b)

a='se45tgbnm'
b=a.isalnum()
print(b)

a='asdfgh678900-='
print(a.isupper())
print(a.islower())
a='SDFGHJ234590-='
print(a.islower())
print(a.isupper())

a='A Big Pig'
print(a.istitle())

a='ASDC45erfv'
b=a.startswith('A')
print(b)
print(a.startswith('a'))

b=a.endswith('v')
print(b)
print(a.endswith('V'))
a='Tony\'s car'
print(a)
a="Tony's car"
print(a)

a='asdb\\qwee'
print(a)
a='asdb\qwee'
print(a)
a='assdd\\234'
print(a)
a='ahdwudwu\234'
print(a)

a='asd\nh\t4566\'67u\"'
print(a)


#-----------------------------------------------------不转义加r---------------------------------------------------------
a=r'a\t b\n'
print(a)

作业

# 判断一个数是否是回文数。例如:输入:121,输出也是121,像这样的数就是回文数
# a=input("请输入数字")
#
# if a==a[::-1]:
#     print("回文数")
# else:
#     print("不是")

# 2.查找字符串中每个字符最后出现的位置。
text = """
东边来了个喇嘛,西边来了个哑巴,喇嘛手里拎着五斤挞嘛,哑巴腰里别着个喇叭,
别着喇叭的要用喇叭换手里拎着挞嘛的哑巴的挞嘛,
拎着挞嘛的哑巴不愿意用挞嘛换手里拎着喇叭的喇嘛的喇叭。
拎着喇叭的喇嘛用喇叭打了拎着挞嘛的哑巴,
拎着挞嘛的哑巴也用挞嘛打了拎着喇叭的喇嘛。
"""
b=set()
b.update(text)
for i in b:
    print(i,"最后一次出现在第",text.rfind(i)+1,"位")

# 3.‘2018-11-12’去掉‘-’输出
a='2018-11-12'
b=a.split('-')
print(b)

# 4.统计数字,字母,下划线个数
a1='123edfyAhjnol'
def xx(a):
    num=0
    leter=0
    smart=0
    byt=0
    for i in a:
        if i.isdigit()==True:
            num+=1
        elif i.isupper()==True:
            leter+=1
        elif i.islower()==True:
            smart+=1
        else:
            byt+=1
    return num,leter,smart,byt

x=xx(a1)
for i in x:
    print(i)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值