当前位置: 首页> 财经> 产业 > Python基础学习笔记(九)——字符串(下)

Python基础学习笔记(九)——字符串(下)

时间:2025/7/11 17:35:19来源:https://blog.csdn.net/dandellion_/article/details/139286383 浏览次数:0次

目录

  • 前言
  • 一、字符串的编码、检测和比较
    • 1. 编码与解码
    • 2. 字符检测与判断
    • 3. 字符串的比较
  • 二、占位符与格式化
    • 1. %型格式化
    • 2. {}型格式化
    • 3. 浮点格式化
    • 4. f-string 格式化
      • 4.1 对象调用
      • 4.2 数字格式
      • 4.3 字符串格式
      • 4.4 功能增强
  • 三、字符驻留机制

前言

  本篇将更深入地介绍字符串的使用和机制,有关字符串的基础内容,见Python基础学习笔记(九)——字符串(上)。

一、字符串的编码、检测和比较

1. 编码与解码

  字符串是由Unicode字符组成的,字符按一定格式转换为字节的过程,称为编码;编码的逆向操作,称为解码

  • encode(encoding, errors):将目标字符串str)转换为指定编码格式的字节对象bytes
  • decode(encoding, errors):将目标字节对象bytes)转换为指定编码格式的字符串str

  以上两个函数实现了文本与二进制数据之间的转换。其中,encoding默认值为"utf-8"errors默认值为"strict"
  encoding的可选参数(不论大小写)列表详见Python基础学习笔记(二)——编码_命名,errors的部分可选参数如下:

  • "strict":检测到非法字符,抛出UnicodeError异常
  • "ignore":忽略非法字符
  • "replace":用特定字符替代非法字符
str_ = 'dandelion的博客'
# GBK编码格式下,1汉字占2字节
en = str_.encode('GBK')
print(en)
de = en.decode('GBK')
print(de)# utf-8编码格式下,1汉字占3字节
en = str_.encode()
print(en)
de = en.decode()
print(de)
b'dandelion\xb5\xc4\xb2\xa9\xbf\xcd'
dandelion的博客b'dandelion\xe7\x9a\x84\xe5\x8d\x9a\xe5\xae\xa2'
dandelion的博客


  • chr(int):将任意进制Unicode码值转换为字符
  • ord(str|bytes):将一个字节对象或字符转换为十进制Unicode码值(不能输入空字符

  charcodeorder函数实现了strint之间的转换。

print(ord(' '.encode()), ord('a'), ord('A'), ord('缪'), ord('0'))
print(chr(255), chr(95))
32 97 65 32554 48
ÿ _


2. 字符检测与判断

  • isidentifier():若字符串中的字符全部为合法标识符,返回True;否则返回False
  • isspace():若字符串中的字符全部为空白符空格、换行、水平制表符),返回True;否则返回False
  • isalpha():若字符串中的字符全部为letter类型(英文字母、汉字等),返回True;否则返回False
  • isdecimal():若字符串中的字符全部为十进制数字字符0~9),返回True;否则返回False
  • isnumeric():若字符串中的字符全部为数字阿拉伯、中文、罗马等),返回True;否则返回False
  • isalnum():若字符串中的字符全部为数字或letter,返回True;否则返回False
print('_dandelion_'.isidentifier())
print(' \t\n'.isspace())
print('dandelion的博客'.isalpha())
print('02'.isdecimal())
print('Ⅱ0二十四'.isnumeric())
print('Muelsyse1103'.isalnum())# 在utf-8编码下,汉字不被视为字母
print('sleep'.encode().isalpha())
print('好困'.encode().isalpha())
True True True True True True
True False


3. 字符串的比较

  从字符串左端开始逐个字符进行比较,若两个字符的Unicode码值(原始值相等,就比较下一个字符,若不相等则确定两串大小关系。当且仅当每个字符都相等时,两串相等

print(ord('1'), ord('2'), ord('3'))
print('112' > '113')
print('212' > '113')
49 50 51
False
True

  常见的Unicode码值有:0-9 -> 48~57A-Z -> 65~90a-z -> 97~122

二、占位符与格式化

  占位符是一种特殊字符,用于表示字符串中将来要填充的值的位置,通常用于字符串格式化。它们是在程序运行时动态生成的,以便将实际值插入到占位符的位置。

1. %型格式化

  最传统的格式化方法,使用%型占位符将变量的值插入到字符串中,格式为:str % {variables}.

  • %d | %i:将整型变量的值插入到字符串中
  • %f:将浮点型变量的值插入到字符串中
  • %s:将字符串型变量的值插入到字符串中

  特定类型的占位符只能传递特定类型的值。

name = input('名字:')
age = int(input('年龄:'))
order = int(input('等阶:'))
coefficient = float(input('强度系数:'))print('我叫%s,一名%d岁的%i阶魔法使,魔力强度系数%f' % (name, age, order, coefficient))

  在上述示例中,用户可以根据实际情况给变量赋值,变量的值根据{variables}中的变量str中的占位符位置一一对应插入到str中,并得到一个特定格式的字符串。

2. {}型格式化

  不限制变量类型的格式化方法,使用{index}型占位符将变量的值插入到字符串中,格式为: str.format(variables).

name = input('名字:')
age = int(input('年龄:'))
order = int(input('等阶:'))
coefficient = float(input('强度系数:'))print('我叫{0},一名{1}岁的{2}阶魔法使,魔力强度系数{3}'.format(name, age, order, coefficient))

  在上述示例中,用户可以根据实际情况给变量赋值,变量的值根据{variables}中的变量str中的占位符索引对应插入到str中,并得到一个特定格式的字符串。

  特别的,若全为占位符为{},插入方式仍为 “位置一一对应”

3. 浮点格式化

  对于%型格式化,浮点型的占位符为%ca.bf.

  其中,c, a, b都是整型c是填充符,默认值为空格整数部分a右对齐参数,作用相当于rjust(a, 'c')函数;小数部分b精度参数,返回保留b位小数(四舍五入)的浮点数。

# 最大精度:保留6位小数
print('%f' % 3.1415926)
# 只对齐,使用最大精度,填充符为0
print('%010f' % 3.1415926)
# 右对齐,默认精度为0
print('%10.f' % 3.1415926)
# 不对齐,精度为3
print('%.3f' % 3.1415926)
# 右对齐,精度为3
print('%10.3f' % 3.1415926)
# 不对齐,默认精度为0
print('%.f' % 3.1415926)
3.141593
003.1415933
3.1423.142
3

  
  对于{}型格式化,浮点型的占位符为{index: ca.b}.

  其中,c, a, b的含义与前者基本一致,区别在于,有小数点.时:

  • b不再为可选参数
  • a的值未传递,或小于等于字符串长,默认值为len+1,即至少左空一格

  并且有{index: a.b}保留b有效数字{index: a.bf}保留b小数

# 最大精度:保留6位小数
print('{0:f}'.format(3.1415926535897932))
# 最大精度:保留16位有效数字
print('{0:}'.format(3.1415926535897932))
# 右对齐,使用最大精度,填充符为0
print('{:025}'.format(3.1415926535897932))
# 左空一格,精度为3
print('{:.3}'.format(3.1415926535897932))
# 右对齐,精度为3
print('{:10.3}'.format(3.1415926535897932))
3.141593
3.141592653589793
000000003.1415926535897933.143.14


4. f-string 格式化

4.1 对象调用

  可直接将变量写入字符串的格式化方法,使用{variable}型占位符将变量的值插入到字符串中,需要前缀fF对字符串进行标识。

# 直接输入
print(f'我考了{100}分')# 变量传递
score = 100
print(f'我考了{score}分')
我考了100

  
  f-string格式化也支持表达式和函数调用

# 平方运算
x = int(input())
print(f"{(lambda x: x**2)(x)}")


4.2 数字格式

  f-string格式化仍遵循上述的浮点格式化机制,并新增了分隔描述符,占位符格式为{decimal:,d}{decimal:_d}.

  其中,decimal十进制整数,_分隔符,表示每三位分隔一次

# 不对齐,保留2位小数
print(f"{3.1415926:.2f}")# 对多位整数按位划分
print(f"{2024114514:,d}")
3.14
2,024,114,514


4.3 字符串格式

  f-string格式化可以规定字符串的对齐格式,占位符格式为{str:fillchar/how/width.len},可以实现:先截断字符串保留指定长度(从左到右),再对齐填充

  其中,fillchar填充符how对齐方式(居中^、左对齐<、右对齐>),width对齐宽度len保留长度

s = "dandelion"# 左对齐:保留长度超过字符串长,不发生截断
print(f"{s:*<20.10}")
# 右对齐:截断后保留5个字符
print(f"{s:*>20.5}")
# 居中:不截断截断
print(f"{s:*^20}")
dandelion***********
***************dande
*****dandelion******


4.4 功能增强

  在Python 3.12版本后,f-string格式化支持引号重用、多行表达式和注释、转义字符

# 引号重用:允许嵌套定义
print(f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}")	# 2# 多行表达式和注释:允许跨行,并在行尾添加注释
lst = f"列表:{"; ".join(["1",  # 第1项"2",  # 第2项"3"   # 第3项
])}"# 转义字符:允许在语句内使用反斜杠
print(f"{'\n'}")


三、字符驻留机制

  字符驻留机制是一种优化技术,用于节约内存和提高性能,指的是:

  编译过程中,解释器会将较短的不可变字符串对象保存在内存池中,当创建新的字符串时,首先检查该字符串是否已经存在于内存池中,如果是,则返回已存在的对象的引用,也就是把内存地址赋给新变量,而不是开辟一个新空间。

  其中,较短的字符串一般指符合标识符或长度不超过1的字符串。 intern()函数还可以显式地将一个字符串对象添加到内存池中,以便进行字符驻留。

  特别的,Pycharm对该编译机制进一步优化后,所有相同的字符串id均相同。

关键字:Python基础学习笔记(九)——字符串(下)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: