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

embedded/2024/9/23 5:02:20/

目录

  • 前言
  • 一、字符串的编码、检测和比较
    • 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":用特定字符替代非法字符
python">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)
python">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之间的转换。

python">print(ord(' '.encode()), ord('a'), ord('A'), ord('缪'), ord('0'))
print(chr(255), chr(95))
python">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
python">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())
python">True True True True True True
True False


3. 字符串的比较

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

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

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

二、占位符与格式化

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

1. %型格式化

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

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

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

python">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).

python">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位小数(四舍五入)的浮点数。

python"># 最大精度:保留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)
python">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小数

python"># 最大精度:保留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))
python">3.141593
3.141592653589793
000000003.1415926535897933.143.14


4. f-string 格式化

4.1 对象调用

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

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

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

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


4.2 数字格式

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

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

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


4.3 字符串格式

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

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

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


4.4 功能增强

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

python"># 引号重用:允许嵌套定义
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均相同。


http://www.ppmy.cn/embedded/44573.html

相关文章

蓝桥杯2023(十四届)省赛——子串简写(跳跳双指针、妙妙剪枝)

子串简写&#xff08;跳跳双指针、妙妙剪枝&#xff09; 1.子串简写 - 蓝桥云课 (lanqiao.cn) 这里的剪枝实在是泰妙啦&#xff01; 回顾一下我这个蠢蛋的思路&#xff1a;一开始遍历leni&#xff0c;结果只过了俩&#xff1b;然后遍历i和j&#xff0c;len直接计算&#xff…

【3.vi编辑器使用(上)】

一、vi编辑器的三种模式及切换命令 1、vi是linux中最基本的编辑器。但vi编辑器在系统管理、服务器配置工作中永远都是无可替代的。 2、vi编辑器的三种模式&#xff1a;命令行模式、插入模式、底行模式。 &#xff08;1&#xff09;命令行模式&#xff1a;用户在用vi编辑文件…

消息队列RabbitMQ简介及应用场景

RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ的主要特点包括高性能、健壮性、可伸缩性和易用性。它使用Erlang语言编写&#xff0c;支持跨多种语言和平台&#xff0c;如Java、.NET、Ruby、PHP、Pytho…

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …

【设计模式】备忘录模式

来源&#xff1a;爱编程的大丙 定义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个对象&#xff0c;这样以后需要的时候就可以将该对象恢复到原先保存的状态。 #include<iostream> #include<map> #in…

部署加密系统的必要性

企业核心数据是企业运营的中枢神经&#xff0c;涵盖了客户信息、产品数据、供应链信息等关键业务记录。这些数据的准确性和安全性对企业至关重要&#xff0c;它们支撑着企业的日常运营决策&#xff0c;优化运营效率&#xff0c;增强客户服务&#xff0c;同时也是企业竞争力的重…

MVC和Filter

目录 MVC和三层架构模型的联系 Filter 概念 作用 应用场景 步骤 简单入门 注解开发 Filter过滤器的生命周期 Filter的拦截路径 过滤链 MVC和三层架构模型的联系 m-->model即模型是三层架构模型的业务层&#xff08;service&#xff09;和持久层(dao) v-->view…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具&#xff0c;该工具专为蓝队研究人员设计&#xff0c;可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…