十三、字符串详述
在此之前,已经学习并记录了关于变量、运算符以及语句的一些基础知识,这一块主要介绍一下字符串。
1、字符串的三种表示
s1 = 'abc'
s2 = "abc" # 类似这样就称作常量赋值
s3 = '''
abc
'''
# 加一段代码来更直观地表示一下第三个与前两个所表示的不一样
print(s1)
print(s2)
print(s3)
运行结果如下:
运行之后可以发现s3的输出上下两行都有空格,而s1与s2前面没有,所以实际上s1、s2与s3内容是不一样的
abc
abc
abc
前面的代码证明:三引号占用的内存空间与单双引号不同(三引号为保留格式要换行),这个成立的前提是三引号的内容不在一行上
验证代码:
我们现在抛出一个字符串s4,依然用三引号但是不换行,测试可得其地址会与前两个一致。
s1 = 'abc'
s2 = "abc" # 类似这样就称作常量赋值
s3 = '''
abc
'''
s4 = '''abc'''
print(id(s1), id(s2), id(s3), id(s4))
运行结果如下:
s1、s2、s4(三引号的内容在同一行上)的内存地址是一样的。因为三引号为了保留格式,通常会换行,通俗地讲,出现了换行,地址肯定就变了。
2098529678960 2098529678960 2098529777584 2098529678960
这是在第一段代码的基础上进行的比较:
s1 = 'abc'
s2 = "abc" # 类似这样就称作常量赋值
s3 = '''
abc
'''
print(s1 == s2) # ==比较的是内容
print(s1 is s2) # is 比较的是地址
print(s2 == s3)
print(s2 is s3)
运行结果如下:从第一、二两段代码的运行结果可以看得出,s1与s2内容相同,s2与s3内容不相同。s1、s2的地址与s3不同。
==比较的是内容,is 比较的是地址
True
True
False
False
s1 = input('请输入:')
s2 = input('请输入:') # 此处我们特意把s1、s2都键入abc,观察运行结果
print(id(s1), id(s2))
print(s1 == s2) # ==比较的是内容
print(s1 is s2) # is 比较的是地址
运行结果如下:
请输入:abc
请输入:abc
3035565723504 3035565781040
原因是:input是输入流,是一个标准流,它进行转换的时候,把键盘上的abc拿到的时候它在这块的内存是不一样的。相当于说只要你拿input这个函数把值abc放进去,地址就不一样了。
如果直接声明变量,那它的地址就一样。 input是底层封装好的函数,它里面可能会对地址有所改变。但只要是常量赋值,再print(s1 is s2)进行地址的比较,结果就是True。
2、字符串的运算符 + 、*、 in、 not in、 %、 r、 []、 [:]、 [::]
*(1)+相当于拼接符 相当于将字符串重复多少次
s1 = 'hello'
s2 = 'world'
s3 = s1+s2
s4 = s2 * 5 # 倍数
print(s3, s4)
运行结果如下:
helloworld worldworldworldworldworld
(2)in在…里面 in可以判断一个字母,也可以判断多个字母是否在一个字符串中
name = 'steven'
resault = 't' in name # 返回值是布尔类型 True or False
print(resault)
print('st' in name)
print('tv' in name) # 因为tv两个字母在原字符串中是没有连在一起的,故结果为False
运行结果如下:
True
True
False
(3)not in没有在…里面 返回值也是布尔类型 True or False
name = 'steven'
resault = 'tv' not in name
print(resault)
运行结果如下:
True
(4)% 字符串的格式化
print('%s说:大家要努力呀!'%name) # 用%s占位,后面的%进行信息匹配 可以将name前面的那个%理解为运算符
print('%s说:%s'%(name, '大家要努力呀!'))
运行结果如下:
steven说:大家要努力呀!
steven说:大家要努力呀!
(5)r 保留原格式,原格式是指字符串里面是什么,输出的就是什么
print(r'%s说:\'哈哈哈哈\' ' %name) # 加r会将\'\'也输出来
print('%s说:\'哈哈哈哈\' ' %name) #不加r,那么\'\'就被当作转义字符转义掉了 (把\'\'当作转义字符了)
运行结果如下:
steven说:\'哈哈哈哈\'
steven说:'哈哈哈哈'
(6)字符串的正序逆序输出(切片)[:] 、 [::]
首先在这一段介绍前对顺序进行一下介绍,就以filename = 'picture.png’为例:
# p i c t u r e . p n g
# 0 1 2 3 4 5 6 7 8 9 10(每一个字母的下标)(正序是从左往右,从0开始)
# -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1(逆序是右往左,从-1开始)
- 通过[]可以结合位置,获取指定位置的字母 但是这种方式只能获取一个字母
代码如下:
filename = 'picture.png'
print(filename[0])
print(filename[1])
print(filename[5])
运行结果如下:
位置从左往右,且都是从0开始,位置也会称作是下标或者索引
经过将[]中的数字改为0,1,5可以发现执行结果取得是该filename中的第i个字母
p
i
r
- [:]与range的使用类似,也是取一个范围,且包前不包后 (切片使用)
filename = 'picture.png'
print(filename[0:7]) # 包前不包后
print(filename[3:7]) # 截取字符串
运行结果如下:
picture
ture
- 关于省略
filename = 'picture.png'
print(filename[3:]) # 只要省略的是后面的,表示一直取到字符串的末尾
print(filename[:7]) # 只要省略的是前面的,表示从0开始取值
运行结果如下:
ture.png
picture
- 负数(可以理解为倒数第i个,-1表示从后往前取值)
filename = 'picture.png'
print(filename[8:-1])
print(filename[:-2])
print(filename[-1:])
print(filename[-5:-1])
print(filename[10:0]) # 执行该条语句无结果 不能从10到0取值
print(filename[-1:8]) # 执行该条语句无结果
运行结果如下:
pn
picture.p
g
e.pn
- [::]
filename = 'picture.png'
print(filename[::-1]) # 倒序输出(-1表示方向是从有往左)
str1 = 'abcdefg'
print(str1[-1:-5:-1]) # 注意:取值范围包前不包后,而且倒序输出
print(str1[0:5:-1]) # 运行无果,倒序从右往左,(从0开始往左取值)无法取到下标在0-5的字母
print(str1[5:0:-1]) # []中最后一个元素是-1,所以从下标为5的字母开始向左取值,取至下标为1的字母(包前不包后)
print(str1[5:0:1]) # []中最后一个元素是1,所以从下标为5的字母开始向右取值,但向右取不到下标为1的字母,故运行无果
print(str1[:]) # 将str1从头到尾全部输出来了(正序输出)
print(str1[::-1]) # 倒序输出整个字符串
运行结果如下:
gnp.erutcip
gfed
fedcb
abcdefg
gfedcba
解释:
'''
str[start:end:方向和步长]
方向:1表示从左往右
-1表示从右往左
要注意数值的顺序
比如:正向的5:0就取值无果
逆向的0:5就可以取到值
'''
practice :hello world
要求:
1、逆序输出world
2、正向输出hello
3、逆序输出整个hello world
4、打印获取oll
5、打印llo wo
s = "hello world"
print(s[-1:-6:-1])
print(s[:5])
print(s[::-1])
print(s[-7:-10:-1])
print(s[4:1:-1]) # 跟上一句结果相同
print(s[2:8])
print(s[2:-3]) # 跟上一句结果相同
print(s[::2]) # 正2表示从左往右取值,取值步长为2
print(s[::3])
print(s[::-3]) # -3表示从右往左取值,取值步长为3
运行结果:
dlrow
hello
dlrow olleh
oll
oll
llo wo
llo wo
hlowrd
hlwl
dooe