当前位置: 首页 > article >正文

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: Python

目录

字符串的常见操作 

格式化字符串

占位符

f-string 

字符串的 format 方法 

字符串的编码与解码 

与数据验证相关的方法

字符串的拼接 

字符串的去重操作 


字符串的常见操作 

字符串是Python中的不可变数据类型,在最开始时,我们只是简单地学习了字符串的使用,并未深入研究。既然字符串也是一种数据类型,那么它是否也和前面学习的列表、字典、集合这些数据类型一样有着大量的操作方法呢?答案是有的,我们今天就来深入学习这些方法。

常见的操作字符串的方法
方法名说明
lower()将字符串str全部转成小写字母,结果为一个新的字符串
upper()将字符串str全部转成大写字母,结果为一个新的字符串
split(set=None)把str按照指定的分隔符sep进行分隔,分割之后的结果为列表类型,其中的元素便是被分割后的字符串
count(sub)结果为sub的这个字符串在str中出现的次数
find(sub)查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在结果为sub首次出现的索引
index(sub)功能与find(相同,区别在于要查询的子串sub不存在时,程序报错
startswith(s)查询字符串str是否以字符串s开头
endswith(s)查询字符串str是否以字符串s结尾
replace(old, news)使用news替换字符串s中所有的old字符串,结果是一个新的字符串
center(width, fillchar)字符串str在指定的宽度范围内居中,可以使用fillchar进行填充
join(iter)在iter中的每个元素的后面都增加一个新的字符串str
strip(chars)从字符串中去掉左侧和右侧chars中列出的字符串
lstrip(chars)从字符串中去掉左侧chars中列出的字符串
rstrip(chars)从字符串中去掉右侧chars中列出的字符串

代码演示:

str = 'Hello Python'
print('开始一系列字符串操作')
lower_str = str.lower()
print('将字符串变成小写:',lower_str)
upper_str = str.upper()
print('将字符串变成大写:',upper_str)
list = str.split(' ')
print('以空格分割字符串:',list)
count = str.count('o')
print('字符串中"o"出现的次数:',count)
a = str.find('o')
b = str.index('o')
print('字符串中"o"出现的索引位置:',a,b)

print('字符串是不是以"hello"作为起始子串呢?',str.startswith('hello'))
print('字符串是不是以"Hello"作为起始子串呢?',str.startswith('Hello'))

print('字符串是不是以"python"作为结束子串呢?',str.endswith('python'))
print('字符串是不是以"Python"作为起始子串呢?',str.endswith('Python'))

运行结果:

 注意:在判断是否为起始子串、结束子串时,参数中的字符串不需要是子串,也可以是非子串。上述代码中的 "hello" 便是非子串。

 从上述的结果,也可以看出字符串的相关操作并不会改变字符串本身。简单理解就是 全都是生成一个新的字符列表对象,然后在这个列表中进行一系列的操作,然后改成新的字符串返回。

我们再来通过代码实现剩下的方法操作。

代码演示:

str = 'Hello Python'

# 替换字符串中的部分字符
print(str.replace('Hello','Hi')) # 在最后面还可以指定参数
print(str.replace('Hello','Hi',0)) # 指定替换0次,即不替换

# 填充部分字符,是字符串在指定的范围内处于居中位置
print(str.center(20)) # 在长度为20的空间中,默认使用空白字符填充,是字符串处于居中位置
print(str.center(20, '*')) # 在上面的基础上,使用"*"进行填充
print(str.center(10,'*')) # 当字符串本身超出 width 时,就直接打印输出

# 在字符串str后面的每个字符元素中,加上"  "(两个空格)
print('  '.join(str))

# 将 '  hhh  ' 中的空格全部去掉(默认是去掉空格),再使用'*'去替换空格
print('  hhh  '.strip().replace(' ','*'))
print('  hhh  '.replace(' ','*'))
# 观察上面两个的不同,或者写成下面这样

print('***hhh***'.strip('*')) # 直接将'*'从字符串中去除
print('***hhh***'.lstrip('*')) # 直接将左边'*'从字符串中去除
print('***hhh***'.rstrip('*')) # 直接将右边'*'从字符串中去除
# 注意下面这种情况,是不能成功去除的
print('*1**hhh***'.lstrip('*')) # 在去除'*'字符的过程中,遇到非'*'字符之后,就会停止去除

print('经过一系列的字符串操作之后,原字符串为:'+str)

运行结果: 

格式化字符串

常见的格式化字符串方式有三种:1、占位符的形式;2、f-string的形式;3、str.format()的形式。

占位符

在Python中常用的占位符有三个:1、%s -> 代指字符串;2、%d -> 代指十进制的整数;3、%f -> 代指浮点数。

语法格式:

# 可以理解为是将后面的参数直接带入到 %s、%d、%f 中
# 这里的 %s、%d、%f 只是占了个位置罢了,故名:占位符
# str % () --> 字符串 % 元组,占位符使用元组来替代
print('姓名: %s, 年龄: %d, 成绩: %f' % (name, age, score))

代码演示:

name = '马冬梅'
age = 18
score = 98.5

# 使用了 .1f 之后,可以让浮点数只输出一位
print('姓名:%s, 年龄:%d, 成绩:%f' % (name, age, score))
print('姓名:%s, 年龄:%d, 成绩:%.1f' % (name, age, score))

除了上述 .1f 之外,还有 5d 这种写法,小数点后面的是保证位数,小数点前面的是保证输出总长度,当总长度小于我们设置的总长度时,就会使用空格填充,如果是 5d 的写法,就是填充在左边,也就是右对齐;反之,如果是 -5d 的写法,就是填充在右边,也就是左对齐的写法。 scanf与printf函数的详细介绍及其用法_printf 换行符-CSDN博客 可以去看这篇文章,介绍的比较详细,虽然是C语言,但是概念是差不多的(输出格式)。

f-string 

语法格式:

# f-string ,使用的就是 fstring的形式
# 这里是把要使用变量替代的全部放到了{}中,这样在打印时,就会将{}中的变量替换为真实的值
print(f'姓名: {name}, 年龄: {age}, 成绩:{score}')

代码演示: 

name = '马冬梅'
age = 18
score = 98.5

# 使用f-string
print(f'姓名:{name}, 年龄:{age}, 成绩:{score}')

字符串的 format 方法 

语法格式:

# str.format() 与 f-string 有点类似,都是使用 {} 来标明需要替换的元素
# 但是 f-string 是直接从上文中取,而 str.format 是从format参数中寻找
# 0、1、2 对应的是 format参数中索引的位置,0 是 name的索引,所以就让 name 来替换0
print('姓名: {0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 下面的写法也是符合要求的,2 是 name的索引,所以使用name来替换2
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

代码演示:

name = '马冬梅'
age = 18
score = 98.5


# 使用字符串的format方法
print('姓名:{0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 上述的0、1、2指的是format方法中的参数的索引位置,可以写成下面这样
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

上面三种格式化的方式,写在一起的运行结果:

格式化字符串的详细格式还是有很多的,下面来认识其他的格式。

 代码演示:

s = 'Hello Python'
# 直接使用0去代指format中的参数
print('{0}'.format(s))
# : 是引导符,表明后面开始的操作是对参数的格式化
# * 是填充符,表明当长度不足时,使用 * 来填充
# < 是向左对齐、20 是字符串的总长度,不足时使用填充符来填充
print('{0:*<20}'.format(s))
# ^ 居中对齐、- 使用"-"填充空闲的位置
print('{0:-^20}'.format(s))
# 超出长度,就啥也不做
print('{0:*^5}'.format(s))
# 默认使用 空白字符 填充
print('{0:^20}'.format(s))

运行结果:

代码演示:

# 千位分隔符:只适用于整数与浮点数
# 且针对浮点数时,只会将其整数部分进行分割,而小数部分不会做任何处理
print('{0:,}'.format(1234567890))
print('{0:,}'.format(1234567890.987654321))

# .精度 ——> 参数为字符窜时,是显示最大的长度,参数为浮点数时,是显示小数的最大长度
# 针对字符串时,不需要加f,而针对浮点数时,需要加上f
print('{0:.2f}'.format(3.1415926535))
print('{0:.5}'.format('Hello Python'))

# 类型
a = 8
print('二进制:{0:b}'.format(a))
print('八进制:{0:o}'.format(a))
print('十进制:{0:d}'.format(a))
print('十六进制:{0:x}'.format(a))
print('十六进制:{0:X}'.format(a))

运行结果:

字符串的编码与解码 

我们现在所处的时代是互联网时代,通信的方式也是发生了变化。现在的通信主要是网络通信,一台机器上的数据经过一系列的处理变为了二进制数据,然后再通过网卡以二进制的形式传输出去(电信号的高低电平表示1与0、光信号的频率高低表示1与0) ,这些数据经过互联网就被另一台机器的网卡给接收到了,然后开始对二进制数据进行解析,变为最终通信的数据。上述过程就是不同机器的基本通信过程,如果想要详细了解,可以去看下面的文章。初始JavaEE篇 —— 网络编程(1):基础的网络知识-CSDN博客 

在Python中,将字符串的转换为二进制数据的过程就称为编码的过程;反之,将二进制数据转换为字符串的过程就称为解码的过程。

在Python中,编码所使用的方法是 encode,解码所使用的方法是 decode。

语法格式:

# encoding 是指定要编码的方式,默认是utf-8
# errors 是指定编码错误的处理方式,常见的有三种方式:
# 1、strict ——> 遇到编码错误时,直接抛出异常。这也是默认的处理方式
# 2、ignore ——> 直接忽略编码错误的字符,可以认为是直接跳过了这个字符,去处理后面的字符
# 3、replace ——> 用 ? 去代替编码错误的字符


str.encode(encoding='utf-8', errors='strict/ignore/replace')

bytes.decode(encoding='utf-8', error='strict/ignore/replace')

代码演示:

# 编码过程
s = 'Hello Python'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

上面是对于英文的编码与解码演示,从结果上面来看就是在要传输的基础上加了个前缀b,同样对于数字字符串也是如此,下面我们来看看中文的编码与解码。

代码演示:

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

从上面的对比,我们可以得出一个结论:对于英文字符与数字在经过UTF-8编码后,是不变的,而大多数汉字字符在经过UTF-8之后,一个汉字字符对应着三个编码后的字符。 这是因为在UTF-8编码中规定的是大多数的中文字符占三个字节,而在传统的gbk编码中,中文是占两个字节的,因此使用不同的编码方式,最终形成的字节数也是不同的。

我们接下来就来看编码与解码的方式不同,会出现什么样的问题。

 当然我们也可以让其直接忽略或者是用?来替换

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)

# 解码过程
# 采用ascii码值的方式去解码,并且对解码错误的处理方式采用忽略。
# 因为全部的编码都会解码失败,因此最终的解码结果就是啥也没有
s_decode = s_encode.decode(encoding = 'ascii',errors='ignore') 
print('解码之后的结果:%s' % s_decode)

运行结果:

下面是使用replace的结果:

与数据验证相关的方法

数据的验证是指程序对用户输入的数据进行“合法”性验证。主要是使用以下八种方法:

数据的验证
方法名说明
isdigit()所有的字符都是数字(只能是阿拉伯数字)
isnumeric()所有的字符都是数字
isalpha()所有的字符都是字母(包含中文字符)
isalnum()所有的字符都是数字或者字母(包含中文字符)
islower()所有的字符都是小写
isupper()所有的字符都是大写
istitle()所有的字符都是首字母大写
isspace()所有的字符都是空白字符(制表符(\t)、换行符(\n)等)

 代码演示:

# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isdigit()) # True
print('一二三'.isdigit()) # False
print('I'.isdigit()) # False
print('壹'.isdigit()) # False
print('b0101'.isdigit()) # False

print('-'*20)

# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isnumeric()) # True
print('一二三'.isnumeric()) # True
print('I'.isnumeric()) # False
print('壹'.isnumeric()) # True
print('b0101'.isnumeric()) # False

print('-'*20)

# 判断所有的字符都是字母
print('hello你好'.isalpha()) # True
print('hello你好123'.isalpha()) # False
print('hello 你好'.isalpha()) # False

print('-'*20)

# 判断所有的字符都是数字或者字母
print('hello你好'.isalnum()) # True
print('hello你好123'.isalnum()) # True
print('hello-你好-123'.isalnum()) # False
print('hello 你好'.isalnum()) # False

print('-'*20)

# 所有的字符都是小写
# 中文既是大写也是小写
print('hello'.islower()) # True
print('hello你好'.islower()) # True
print('Hello'.islower()) # False
print('HELLO'.islower()) # False

print('-'*20)

# 所有的字符都是大写
# 中文既是大写也是小写
print('hello'.isupper()) # False
print('hello你好'.isupper()) # False
print('Hello'.isupper()) # False
print('HELLO'.isupper()) # True

print('-'*20)

# 所有的字符都是首字母大写
# 通过 空格 来区分单词
print('Hello'.istitle()) # True
print('HelloWorld'.istitle()) # False
print('Helloworld'.istitle()) # True
print('Hello World'.istitle()) # True

print('-'*20)

# 所有的字符都是空白字符
print('   '.isspace()) # True
print('\n'.isspace()) # True
print('\t'.isspace()) # True
print('123\t'.isspace()) # False

字符串的拼接 

字符串的拼接是根据数据类型的不同,从而采取不同的方法。例如,当要拼接的数据类型是字符串本身时,完全可以使用 + 的直接拼接方法。

1、使用 str.join() 方法进行拼接字符串

2、直接使用"+"拼接字符串

3、使用格式化字符串进行拼接

代码演示:

s1 = 'hello'
s2 = 'python'

# 1、采用 str.join()方法
# 使用字符串的内容去替代参数中的元素之间的分隔符
print(''.join([s1, s2]))
print(''.join((s1, s2)))

# 2、直接拼接
print(s1+s2)
# 简单粗暴的方式
print('hello''python')

# 3、采用格式化字符串的方式
print(f'{s1}{s2}')
print('{0}{1}'.format(s1, s2))

运行结果:

字符串的去重操作 

当字符串中重复出现多个字符时,如果我们想去除重复的字符,拿到不重复的字符,就可以采用下面的方法。

1、遍历字符串,判断是否在新字符串中,不在则加上这个字符,最终遍历完成之后,得到的就是去重之后的字符串。

2、使用哈希的思想(就是使用集合),来去重。

代码演示:

s = 'hello worldhello worldhello worldhello world'
# 1、遍历+判断:
new_s1 = ''
for char in s:
    if char not in new_s1:
        new_s1 += char
print(new_s1)

new_s2 = ''
for i in range(len(s)):
    if s[i] not in new_s2:
        new_s2 += s[i]
print(new_s2)

# 2、哈希思想去重
new_s3 = set(s) # 得到的集合中只剩下不重复的元素了
# 但因为集合是无序的,因此我们按照原来字符串的顺序来排序,需要转化为列表
list_S = list(new_s3)
# 将列表中的字符按照字符串中的索引来进行排序
list_S.sort(key=s.index)
# 最终再转换为字符串类型
print(''.join(list_S))

运行结果:

好啦!本期 初始Python篇(6)—— 字符串 的学习之旅 就到此结束啦!我们下一期再一起学习吧!


http://www.kler.cn/a/401784.html

相关文章:

  • 前端接入Paymax支付请求
  • 【微服务】Spring AI 使用详解
  • Python-简单病毒程序合集(一)
  • k-近邻算法(K-Nearest Neighbors, KNN)详解:机器学习中的经典算法
  • 华为刷题笔记--题目索引
  • MySQL —— MySQL索引介绍、索引数据结构、聚集索引和辅助索引、索引覆盖
  • 人工智能学习——前言
  • 2024年第十四届APMCM亚太杯数学建模A题B题C题思路+代码解析汇总
  • MATLAB用到的矩阵基础知识(矩阵的乘和矩阵的逆)
  • Axure9生成的阅览页面如何自动展开左侧页面导航?
  • CSS基础也要进行模电实验
  • JSONP处理跨域请求
  • 每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)
  • 【白话机器学习系列】白话 Softmax
  • 自动驾驶系统研发系列—智能驾驶新高度:解析ESS驾驶员转向辅助系统
  • C++ STL中常见的容器
  • 面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证
  • CSS基础选择器与div布局
  • 社群在 2+1 链动模式 S2B2C 商城小程序社交新零售运营中的价值与应用
  • 【Go实战】:使用AES和RSA加密算法保护关键信息
  • 独立资源池:虚拟化技术如何帮助企业在经济危机中降低成本?
  • 我们来学mysql -- EXPLAIN之type(原理篇)
  • Swift 数组
  • 安装 Ubuntu 桌面系统
  • [论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录
  • iOS 键盘弹出视图精准上移