Python 语言-第三章字符串类型

第三章字符串类型

3.1 字符串的驻留机制

  • 字符串是 python 基本数据类型之一,是一个不可变字符序列

    • 所以对字符串元素不可切片赋值
  • 驻留机制:仅保留一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中

    • 在 python 中,会对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符的地址赋予新创建的变量,如:
      image-20220114212138201
  • 符合驻留机制(在交互模式下)的几种情况:

    • 字符串的长度为 0 或者 1 时
    • 符合标识符的字符串
      • 符合的标识符包括:字母、数字、下划线
    • 字符串只在编译时驻留,而非运行时
    • [-5,256]之间的整数数字
  • 在交互模式下 sys 模块中的 intern 方法可以强制 2 个字符指向同一个对象

    • 例如:
      image-20220114213845976
  • PyCham 对字符串的驻留进行了优化处理,即使在 python 中不满足驻留机制,但是使用 PyCharm 时的内存地址是一致的

    • 例如:

      a = '123$'
      b = '123$'
      print(a is b)
      
      True
      
  • 驻留机制的优缺点

    • 优点:当需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存
    • 缺点:基于优点,所以当拼接字符串和修改字符串是会比较影响性能的
      • 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
        • 因为 join() 方法是先计算出所有字符串的长度,然后进行拷贝。只需要 new 一次对象,效率比使用 + 高

3.2 基本操作

  • 字符串可以视为名称为字符的列表,与列表操作类似

    • 所以也具有索引、切片等操作(这里不详细介绍,在列表可能会详细说切片和索引)
  • 同时字符串也支持很多方法,可以用来对字符串进行处理。

    • 方法需要通过对象名和方法名来调用,

      • 语法格式为:

        对象名.方法名(参数)
        

3.2.1 查询操作

  • 方法 描述
    s.find(suber[,start[,end]]) 查找 suber 第一次出现的位置,如果 suber 不存在时,返回 -1
    若用 start 和 end 指定范围,则在 s[start,end] 范围进行搜索
    s.index(suber[,start[,end]]) 用法与 find 相同,只不过当 suber 不在 s 中时,抛出 ValueError 异常
    s.rfind(suber[,start[,end]]) 用法与 find 相同,只是从右边找
    s.rindex(suber[,start[,end]]) 用法与 index 相同,只是从右边找
    s.count(suber[,start[,end]]) 返回 suber 在 s 中出现的次数
    若用start和end指定范围,则返回在 s[start,end] 的次数
  • 例如:

    s = 'Hello,llo'
    print(s.index('lo'))
    
    3
    
    • 返回结果为 3,理解为索引为 3 即可

    • 字符串的索引

      • 正向索引:从左向右的顺序,左边第一字符的索引为 0,第二个字符索引为 1o
      • 逆向索引:从右向左的顺序,-1 表示最右的字符的索引,-2 表示倒数第二个字符的索引,依此类推。
    • s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8]
      H e l l o l l o
      s[-9] s[-8] s[-7] s[-6] s[-5] s[-4] s[-3] s[-2] s[-1]

3.2.2 大小写转换操作

  • 方法 描述
    s.upper( ) 将字符串所有字母全部转换为大写字母(upper:上面的)
    s.lower( ) 将字符串全部转换为小写字母(lower:低的)
    s.swapcase( ) 大小写相互转换(swap:交换,case:情形)
    s.capitalize( ) 字符串第一个字符大写,将其余字符转为其他小写字母(capital:大写)
    s.title( ) 每个单词的第一个字符大写,将其余字符转为其他小写字母(title:标题)

3.2.3 字符串对齐操作

  • 方法 描述
    s.just(width[,fillchar]) 左对齐,输出 width 个字符,右边不足部分使用 fillchar(默认为空格)填充
    s.rjust(width[,fillchar]) 右对齐,输出 width 个字符,,左边不足部分使用 fillchar(默认为空格)填充
    s.center(width[,fillchar]) 居中对齐,输出 width 个字符,两边不足部分使用 fillchar(默认为空格)填充
    s.zfill(width) 用于将字符串长度变为width,字符串右对齐,左边不足部分用 0 填充

3.2.4 字符串劈分操作

  • 方法 描述
    split([sep] [,maxsplit]) 从字符串左边开始拆分,sep 参数指定分割符(默认为空格),maxspilt 参数指定最大分割次数
    rsplit([sep] [,maxsplit]) 用法跟 spilt 一致,只是从右边开始拆分
  • 例如:

    s = 'Hello World Python'
    print(s.split())
    s1 = 'Hello|World|Python'
    print(s1.split(sep='|'))
    print(s1.split(sep='|',maxsplit=1))
    
    ['Hello', 'World', 'Python']
    ['Hello', 'World', 'Python']
    ['Hello', 'World|Python']
    

3.2.5 字符串连接操作

  • 使用+连接:一般连接

    • 一般语法:

      字符串1+字符串2+……+字符串n
      
  • 使用join()连接:一般连接

    • 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
      • 因为字符串的驻留机制,和 join() 的使用方法,效率比使用 + 高
        • join() 使用方法:先计算出所有字符串的长度,然后进行拷贝。
  • 使用*连接:重复连接

    • 一般语法:

      字符串 * 正整数
      

      或者

      正整数 * 字符串
      

3.2.6 字符串判断操作

  • 方法 描述
    s.isalnum() 判断 s 是否全是字母或数字组成
    s.isalpha() 判断 s 是否全是字母组成
    s.islower() 判断 s 是否全是小写字母组成
    s.isupper() 判断 s 是否全是大写字母组成
    s.istitle() 判断 s 是否是大写首字母开头
    s.isdigit() 判断 s 是否全是由数字组成
    s.isdecimal() 判断 s 是否只包含十进制数字
    s.isnumeric() 判断 s 是否只由数字组成
    s.isspace() 判断 s 是否只包含空格
    s.startwith(prefix[,start[,end]]) 判断 s 是否以 perfix开头
    s.endwith(suffix[,start[,end]]) 判断 s 是否以suffix结尾

3.2.7 字符串替换操作

  • 方法 描述
    s.replace(s1,s2[,count]) 将 s 中的 s1 替换成为 s2
    若指定 count,则指定替换count 次 (replace:取代)
    s.strip([chars]) 在 s 前后移除由 chars 指定的字符(默认空格) (strip:脱去 chars:字符)
    s.lstrip([chars]) 与 strip 用于一致,只是只移除 s 前的指定指定字符
    s.rstrip([chars]) 与 strip 用于一致,只是只移除 s 后的指定指定字符
    s.expandtabs([tabsize]) 将s中的 tab 符号转化为tabsize 个空格(默认8个空格)

3.2.8 字符串比较操作

  • 运算符:>、>=、<、<=、==、!=
    • == 与 is 的区别
      • == 比较的是 value
      • is 比较的是 id
  • 比较规则:
    • 从第一个字符开始,相等就继续比较下一个字符,直到两个字符串中的字符不相等时,其比较结果就是字符串的比较结果,后续字符将不再比较
  • 比较原理
    • 比较的是其 ordinal value (原始值),西文字符通过 ASCll 码进行对比,中文字符通过Unicode码
      • ord():可以得到字符对应的 ordinal value
      • chr():可以得到 ordinal value 对应的字符
    • 从小到大的顺序为:空字符、数字字符、大写字母、小写字母

3.2.9 字符串切片操作

  • 因为字符串是不可变类型,所以不具备增、删、改等对元素的操作
  • 进行切片操作产生的是一个对象

3.3 格式化字符串

3.3.1 % 作为占位符

  • 例如:

    "姓名:%s;年龄:%d" % ("李华",19)
    
    • 构成:定义的格式化字符串 + % + 实际值
      • 其中自定义的字符串中包含需要的格式化说明符
        • 格式化说明符格式:{格式说明符:格式控制符}
  • 常见格式化说明符:

    格式说明符 含义
    %% 输出百分号
    %d 输出十进制数字
    %c 输出chr(num)
    %s 输出字符串
    %o/O 输出8进制
    %x/%X 输出16进制
    %e/%E 以科学计数法输出浮点数
    %[w] [.p]f 以小数输出浮点数
    长度为 w(默认为0)
    小数部分有 p 位(默认为 6 位)
    • 其中%[w] [.p]f中的 w 的意思是宽度,p 的意思是精度
      • 宽度:输出小数点前多少位
      • 精度:输出小数点后多少位
  • 常见格式化辅助指令:

    符号 功能
    m 定义输出的宽度。若变量值的输出宽度超过m,则按实际宽度输出
    - 在指定宽度内输出值左对齐
    + 在输出的正整数前面显示正好(默认不显示)
    # 在输出的八进制数前面添加“0o”,十六进制前面添加“0X”或者“0x”
    0 在指定宽度内输出值时左边的空格用0填充
    -n 对于浮点数指定输出时小数点后保留的位数(四舍五入),对于字符串指定输出前n个字符
  • 示例:

    x=123.456789
    print("%f;%12.3f;%-12.3f;%012.3f"%(f,f,f,f))       #输出小数点形式表示的浮点数
    print("%e;%12.3e;%-12.3e;%012.3e"%(f,f,f,f))
    
    123.45678;     123.457;123.457;00000123.457
    1.234568e+02   1.235e+02;1.235e+02; 0001.235e+02
    
    • %f :输出浮点数
      %12.3f:输出小数点前 12 位,小数点后 3 位的浮点数

3.3.2 {} 作为占位符

  • 实现字符串格式化的首选方案

  • 例如:

    "{0}{1}".format(a,b)
    
    • 构成:定义的格式化字符串 + .format + 实际值
      • 自定义格式化字符串由普通字符和格式说明符组成。
        • 格式化说明符格式:{[序号或键名]:格式控制符}
  • 常用格式控制符:

    符号 功能
    d 输出十进制数
    b 输出二进制数
    o 输出八进制数
    x或X 输出十六进制数
    c 输出以整数为编码的字符
    f或F 以小数形式的浮点数
    e或E 以科学计数法的浮点数
    % 输出百分号
  • 例如:

    x=123.456789
    print("{0:f};{1:<12.3f}".format(f,f))
    
    123.456789;123.457
    

3.3.3 f-string 形式

  • 例如:

    name = '张三'
    age = '38'
    print(f'我叫{name},今年{age}岁')
    
    我叫张三,今年38岁
    

3.4 字符串编码转换

  • 为什么需要字符串的编码转换:便于其他计算机显示

    • image-20220115172605308
  • 编码与解码的方式

    • 编码:将字符串转换为二进制数据(bytes)

      • 使用encode()方法进行编码
    • 解码:将二进制数据转换为字符串类型

      • 使用decode()进行解码
    • 例如:

      s = 'Hello,World'
      byte = s.encode(encoding='UTF-8')
      print(byte)
      str = byte.decode(encoding='UTF-8')
      print(str)
      
      b'Hello,World'
      Hello,World
      
  • 常见编码解码格式

    • UTF-8:使用这种格式一个中文占 3 个字节
    • GBK:使用这个格式一个中文占 2 个字节
  • 编码和解码的类型必须一致

posted @ 2022-01-15 18:14  你是我的生命之源  阅读(188)  评论(0)    收藏  举报
页脚