字符串

1.字符串的驻留机制

  • 字符串

    ​ 在Python中字符串是基本数据类型,是一个不可变的字符序列

  • 什么叫字符串驻留机制呢?

    ​ 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符的地址赋给新创建的变量

  • #字符串的驻留机制
    a='hello'
    b="hello"
    c='''hello'''
    print(a,id(a))
    print(b,id(b))
    print(c,id(c))
    

    输出:

    hello 2659185572144
    hello 2659185572144
    hello 2659185572144

    id相同这说明对象a,b,c在内存当中只有一份

  • 驻留机制的几种情况(交互模式)

  • 字符串的长度为1或0时

    说明两个对象在内存当中时开了一个内存空间

  • 符合标识符的字符串

    ·当字符串符合标识符时,

    这说明两个对象在内存中开了两个内存空间,内容虽相同,却用两个空间存储

    ·当字符串属于标识符时,

    这时候就产生了驻留,内存地址相同

  • 字符串旨在编译时进行主流,而非运行时

    为什么没有产生驻留呢?

    因为b的值是在运行之前就已经连接完毕,而c中的这个join操作是在运行时,在程序运行时会开新的内存空间。

  • [-5,256]之间的整数数字

    因为-6不在[-5,256]范围内,所以不产生驻留

  • sys中的intern方法强制2个字符串指向同一个对象

  • PyCharm对字符串进行了优化处理
  • 2.字符串的常用操作

    a.查询操作

    (1)index()

    查找字符串substr第一次出现的位置(索引),如果查找的字符串不存在时,则会抛出Value Error

    s='hello,hello'
    print(s.index('o'))
    

    输出:4

    (2)rindex()

    查找字符串substr最后一次出现的位置,如果查找的字符串不存在时,会抛出Value Error

    s='hello,hello'
    print(s.rindex('o'))
    

    输出:10

    (3)find()

    查找字符串substr第一次出现的位置,如果查找的字符串不存在时,则返回-1

    s='hello,hello'
    print(s.find('o'))
    

    输出:4

    (4)rfind()

    查找字符串substr最后一次出现的位置,如果查找的字符串不存在时,则返回-1

    s='hello,hello'
    print(s.refind('o'))
    

    输出:10

    b.大小写转换操作

    (1)upper()

  • 把字符串中的所有字符都转成大写字符
  • s='hello,hello'  #转成大写之后,会产生一个新的字符串对象
    a=s.upper()
    print(a)
    

    输出:HELLO,HELLO

    (2)lower()

  • 把字符串中的所有字符都转成小写字母
  • s='HELLO,HELLO'
    a=s.lower()  #同样也会产生一个新的字符串对象
    print(a)
    

    输出:hello,hello

    (3)swapcase()

  • 把字符串中所有大写字母转为小写字母,把所有小写字母都转成大写字母
  • s='Hello,Hello'
    a=s.swapcase()
    print(a)
    

    输出:hELLO,hELLO

    (4)capitalize()

  • 把第一个字符转成大写,把其余字符转换成小写
  • s='heLLO,Hello'
    a=s.capitalize()
    print(a)
    

    输出:Hello,hello

    (5)title()

  • 把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写
  • s='heLLO,Hello'
    a=s.title()
    print(a)
    

    输出:Hello,Hello

    c.内容对齐操作

    (1).center()

  • 居中对齐,第1个参数指定参数,第二个参数指定填充符,第2个参数是可选的,默认值是空格,如果设置宽度小于实际宽度则返回原字符
  • s='hello,baby'
    print(s.center(20,'%'))
    

    输出:%%%%%hello,baby%%%%%

    (2).ljust()

  • 左对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符
  • s='hello,baby'
    print(s.ljust(20,'%'))
    

    输出:hello,baby%%%%%%%%%%

    (3).rjust()

  • 右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符
  • s='hello,baby'
    print(s.rjust(20,'%'))
    

    输出:%%%%%%%%%%hello,baby

    (4).zfill()

  • 右对齐,左边用0填充,该方法只接受一个参数,用于指定字符串的宽度,如果指定的宽度小于一等于字符串的长度,返回字符串本身
  • s='hello,baby'
    print(s.zfill(20))
    

    输出:0000000000hello,baby

    d.劈分操作

    (1)split()

  • 从字符串 的左边开始劈分,默认的劈分字符时空格字符串,返回的值都是一个列表

    a='hello,world'
    lst=a.split()
    print(lst)
    

    输出:[‘hello,world’]

  • 以通过参数sep指定劈分字符串时的劈分符

    a='hello world'
    lst=a.split(sep='|')
    print(lst)
    

    输出:[‘hello world’]

  • 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的字串会单独做成一部分

    a='hello|world|ok'
    lst=a.split(sep='|',maxsplit=1)
    print(lst)
    

    输出:[‘hello’, ‘world| ok’]

  • (2)rsplit()

  • 从字符串的右边开始劈分,默认的劈分字符时空格字符串,返回的值都是一个列表

    a='hello world ok'
    print(a.rsplit())
    

    输出:[‘hello’, ‘world’, ‘ok’]

  • 以通过参数sep指定劈分字符串时的劈分符

  • 通过参数maxsplit指定劈分字符穿时的最大劈分次数,在经过最大次劈分之后,剩余的字串会单独做为一部分

    a='hello|world|ok'
    print(a.rsplit(sep='|',maxsplit=1))
    

    输出:[‘hello|world’, ‘ok’]

  • e.判断字符串操作

    (1).isidentifier()

  • 判断指定的字符串是不是合法的标识符

    s='hello,world'
    print(s.isidentifier())
    

    输出:False

    合法的标识符是数字,字母和下划线.不包括逗号

  • (2).isspace()

  • 判断指定的字符串是否全部由空白字符组成(回车,换行,水平制 表符)

    print('\t'.isspace())
    

    输出:True

  • (3).isalpha()

  • 判断指定的字符串是否全由字母组成

    s='hello,1'
    s2='张三'
    print(s.isalpha())
    print(s2.isalpha())
    

    输出:False

    True

  • (4).isdecimal()

  • 判断指定字符串是否全部由十进制的数字组成

    s='123,四'
    s2='123'
    print(s.isdecimal())
    print(s2.isdecimal())
    

    输出:False

    True

  • (5).isnumeric()

  • 判断指定的字符串是否全部由数字组成

    s='1234.'
    s2='1589四'
    print(s.isnumeric())
    print(s2.isnumeric())
    

    输出:False

    True

  • (6).isalnum()

  • 判断指定字符是否全部由字母和数字组成

    s='hello12138'
    print(s.isalnum())
    

    输出:True

  • f.字符串的替换与合并

    (1).replace()

  • 第1个参数指定被替换的子串,第2 个参数指定替换字串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化.调用该方法时可以通过第3个参数指定最大替换次数

    s='hello,girl'
    print(s.replace('girl','boy'))
    

    输出:hello,boy

    s='hello,hello,hello,world'
    print(s.replace('hello','ok',3))  #3表示最大替换次数
    

    输出:ok,ok,ok,world

  • (2).join()

  • 将列表或元组中的字符串合并成一个字符串

    lst=['hello','flower','hi']
    print('@'.join(lst))
    

    输出:hello@flower@hi

    a='hello'
    print('@'.join(a))
    

    输出:h@e@l@l@o

  • 3.字符串的比较

    (图片转载网络)

    print('apple'>'app')
    print('apple'>'banana')
    

    输出:True

    False

    怎么知道哪个字符更大呢?

    我们可以比较它们的原始值

    print(ord('a'),ord('b'))
    

    输出: 97 98

    4.字符串的切片操作

  • 字符串不具备增,删,改等操作
  • 切片操作将产生新的对象
  • s='hello,world'
    s1=s[:5]  #没有指定起始位置,默认从0 开始,默认步长为1
    s2=s[6:]   #没有指定结束位置,默认到末尾
    s3='!'
    new_str=s1+s3+s2
    print(new_str)
    

    输出:hello!world

    5.格式化字符串

    为什么需要格式化字符串?

    在python中我们会遇到一个问题,问题是如何输出格式化的字符串。我们经常会输出类似’亲爱的xxx你好!您尾号xxxx卡快捷支付xx元,余额xxxx元’之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。

    在python中,我们用%或{}实现格式化字符串。

    (图片转载网络)

    #第一种方式  %
    name='张三'
    age=20
    print('我叫%s,今年%d岁'%(name,age))
    
    

    输出:我叫张三,今年20岁

    # 第二种方式 {}
    name='张三'
    age=20
    print('我叫{0},今年{1}岁'.format(name,age))
    

    输出:我叫张三,今年20岁

    当然还有第三种方式

    #第三种方式  f-string
    name='张三'
    age=20
    print(f'我叫{name},今年{age}岁')
    

    输出:我叫张三,今年20岁

    我们还可以用格式化字符来表示宽度

    print('%10d' % 100)  #10表示宽度为10
    print('helloworld')
    

    输出:

    同时可以表示精度

    print('%.3f' %  3.1415926)  #3表示保留三位,同时四舍五入
    

    输出:3.142

    也可以同时表宽度和精度

    print('%10.3f' % 3.1415926)
    

    输出:

    ​ 3.142

    6.字符串的编码转换

    为什么需要字符串的变成转换?

    (图片转载网络)

  • 编码与解码的方式
  • 编码:将字符串转换为二进制数据(bytes)
  • 解码:将bytes类型的数据转换成字符串类型
  • s='一二三四五'
    print(s.encode(encoding='GBK'))  #在GBK这种编码格中,一个中文占两个字节
    

    输出:

    b’\xd2\xbb\xb6\xfe\xc8\xfd\xcb\xc4\xce\xe5’

    其中‘b’表示的是二进制

    s='一二三四五'
    print(s.encode(encoding='UTF-8'))
     #在UTF-8这种编码格中,一个中文占三个字节 
    

    输出:

    b’\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89\xe5\x9b\x9b\xe4\xba\x94’

    那我们怎么进行解码呢?

    #解码
    s='一二三四五'
    byte=s.encode(encoding='GBK')  #编码
    print(byte.decode(encoding='GBK'))  #解码
    

    输出:一二三四五

    注意:编码格式要与解码格式相同

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python字符串

    发表评论