当前位置:首页 » 《我的小黑屋》 » 正文

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

23 人参与  2024年11月27日 14:03  分类 : 《我的小黑屋》  评论

点击全文阅读


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

个人主页:我要学编程(ಥ_ಥ)-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 = 18score = 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 = 18score = 98.5# 使用f-stringprint(f'姓名:{name}, 年龄:{age}, 成绩:{score}')

字符串的 format 方法 

语法格式:

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

代码演示:

name = '马冬梅'age = 18score = 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,而针对浮点数时,需要加上fprint('{0:.2f}'.format(3.1415926535))print('{0:.5}'.format('Hello Python'))# 类型a = 8print('二进制:{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()) # Trueprint('一二三'.isdigit()) # Falseprint('I'.isdigit()) # Falseprint('壹'.isdigit()) # Falseprint('b0101'.isdigit()) # Falseprint('-'*20)# 判断所有的字符都是数字# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字print('123'.isnumeric()) # Trueprint('一二三'.isnumeric()) # Trueprint('I'.isnumeric()) # Falseprint('壹'.isnumeric()) # Trueprint('b0101'.isnumeric()) # Falseprint('-'*20)# 判断所有的字符都是字母print('hello你好'.isalpha()) # Trueprint('hello你好123'.isalpha()) # Falseprint('hello 你好'.isalpha()) # Falseprint('-'*20)# 判断所有的字符都是数字或者字母print('hello你好'.isalnum()) # Trueprint('hello你好123'.isalnum()) # Trueprint('hello-你好-123'.isalnum()) # Falseprint('hello 你好'.isalnum()) # Falseprint('-'*20)# 所有的字符都是小写# 中文既是大写也是小写print('hello'.islower()) # Trueprint('hello你好'.islower()) # Trueprint('Hello'.islower()) # Falseprint('HELLO'.islower()) # Falseprint('-'*20)# 所有的字符都是大写# 中文既是大写也是小写print('hello'.isupper()) # Falseprint('hello你好'.isupper()) # Falseprint('Hello'.isupper()) # Falseprint('HELLO'.isupper()) # Trueprint('-'*20)# 所有的字符都是首字母大写# 通过 空格 来区分单词print('Hello'.istitle()) # Trueprint('HelloWorld'.istitle()) # Falseprint('Helloworld'.istitle()) # Trueprint('Hello World'.istitle()) # Trueprint('-'*20)# 所有的字符都是空白字符print('   '.isspace()) # Trueprint('\n'.isspace()) # Trueprint('\t'.isspace()) # Trueprint('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 += charprint(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://m.zhangshiyu.com/post/192836.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1