十三、字符串详述

在此之前,已经学习并记录了关于变量、运算符以及语句的一些基础知识,这一块主要介绍一下字符串。

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