第八章 字符串
学习要点
学习字符串的基本操作以及格式化输出。
对标内容
- 理解字符串类型的概念,掌握它的基础用法及操作:字符串的分割、 结合、替换、检索、长度获取。
- 运用%运算符输出指定格式,format()格式化输出。
情景导入
计算机是由美国发明的,所以在最早的计算机里面只有127个字符,包括英文字母、数字和一些常用符号;但是随着计算机的普及,全世界各国的语言有近百种,127个字符显然不够用,这样各国都开始建立自己的文字编码。但是,各国自己创建自己的编码,势必会造成编码之间的冲突,那该怎么办呢? Unicode 编码应运而生。Unicode编码把所有语言都统一到一套编码里,这样就不会再有乱码问题了,这就是现在我们计算机用的通用编码库。现在国内用得最多的 UTF-8就是在Unicode编码的基础上发展出来的。
字符串
字符串的特性
字符串是Python中最常用的数据类型,是不可变序列的一种。我们可以使用英文(半角)引号(单引号’或双引号")来创建字符串。
字符串的创建
- 直接赋值,如var = "Python编程"。
- 使用str()从其他类型转换,如str(1234) 。
不可变序列的通用操作在字符串中的应用
字符串的访问
直接使用字符串变量名加下标的格式访问,如a = "Python",a[0]可以获取到第一个元素的值为P。
>>> a = "Python"
>>> a[0]
'P'
字符串的截取
使用字符串变量加索引的起点和终点进行截取,但是要注意不包含终点索引上的元素,如下例所示。
>>>str ="中国电子学会Python编程等级考试"
>>>str[0:6]
>>>print(str)
"中国电子学会"
len()
获取字符串的长度,如下例所示。
>>> len('我爱Python编程')
10
in
检查某一个字符或者字符串是否包含在字符串中。
>>> 'Python' in 'Python是面向对象的高级编程语言'
True
>>> 'Scratch' in 'Python是面向对象的高级编程语言'
False
max()
求字符串中Unicode编码值最大的元素。Python 3是按照Unicode编码进行排序的,其基本规律如下:数字在最前面,接下来是大写字母,然后是小写字母,最后是中文等其他文字。
>>> max('123abcABC')
'c'
>>> max('123abcABC我')
'我'
数字 < A-Z < a-z < 汉字
min()
求字符串中Unicode编码值最小的元素。
>>> min('123abcABC')
'1'
+ 字符串的加法(连接)
字符串的加法运算,将两个字符串连接在一起。
>>> a='Python'
>>> b='是一门人工智能语音'
>>> a+b
'Python是一门人工智能语音'
* 字符串的乘法(重复输出)
字符串的乘法运算,将字符串重复输出。
>>> c='我爱编程'
>>> c*3
'我爱编程我爱编程我爱编程'
sorted()
字符串排序。由于字符串也是不可变序列,所以不可以使用sort命令进行 排序,sorted()依然按照Unicode编码顺序排序。
>>> a='abcDEF123'
>>> b=sorted(a)
>>> a
'abcDEF123'
>>> b
['1', '2', '3', 'D', 'E', 'F', 'a', 'b', 'c']
注意:
- 原字符串不会修改,会生成一个新的列表
- 排序后返回的是列表,不是字符串
index()
查找某个元素的位置,使用方法同其他数据类型中的index(),返回值为该元素的下标。
语法
字符串序列.index(子串, 开始位置下标, 结束位置下标)
快速体验
>>> mystr = "hello world and Tmbc and Python"
>>> print(mystr.index('and'))
12
>>> print(mystr.index('and', 15, 30))
21
>>> print(mystr.index('ands'))
ValueError: substring not found
注意:
- 如果元素不存在,则会报错
- 开始和结束位置下标可以省略,表示在整个字符串序列中查找。
count()
查找某个字符或者字符串在整个字符串中的个数,使用方法同元组中的count()。
- 语法
字符串序列.count(子串, 开始位置下标, 结束位置下标)
注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。
- 快速体验
>>> mystr = "hello world and Tmbc and Python"
>>> print(mystr.count('and'))
2
>>> print(mystr.count('ands'))
0
>>> print(mystr.count('and', 0, 20))
1
字符串特有的相关操作
Python中的转义字符
Python中的字符串是用引号引用起来,但是我们有时候需要输出一些特殊的字符,比如引号、缩进、换行等,为了更好地实现这些功能,大部分编程语言在字符串中都有转义字符。Python中的转义字符使用反斜杠\来表示,转义字符有很多,二级考试要求掌握的转义字符及作用如表8-1所示。
表8-1 Python中的转义字符
转义符 | 描述 | 案例 |
---|---|---|
\\ | 反斜杠 | >>> print('\\') \ |
\\' | 单引号 | >>> print('\\'') ' |
\\" | 双引号 | >>> print('\\"') " |
\b | 退格键 | >>> print("Hello\bWorld!") HelloWorld! |
\n | 换行 | >>> print("Hello\nWorld!") Hello World! |
三引号在字符串中的应用
Python 中三引号可以将复杂的字符串进行赋值。
Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。
>>> a='''Pyhon是什么?
Pyhon是"高级编程语言"
'''
>>> a
'Pyhon是什么?\n\tPyhon是"高级编程语言"\n\t'
格式化输出
Python支持格式化字符串的输出,格式化输出有两种方式,一种是%, 一 种是 format。
%格式化输出
在Python中,%格式化输出要求比较严格,要求元素的数量和数据类型必 须一一对应。%格式化有很多种,二级考试中要求掌握的有表8-2所示的几种。
表8-2 %格式化输出
符号 | 描述 | 案例 |
---|---|---|
%d | 格式化整数,如果d前面有数字,则代表该整数所要占的位置 | >>> print("这是第%d行。"%3) 这是第3行。 >>> print("这是第%4d行。"%3) 这是第 3行。 |
%f | 格式化浮点数,如果f前面有数字,则代表保留的小数精度,具体请参考易错点介绍 | >>> print('圆周率的近似值是:%f。 '%3.14159265358979323846) 圆周率的近似值是:3.141593。 >>> print('圆周率的近似值是:%.2f。 '%3.14159265358979323846) 圆周率的近似值是:3.14。 |
%s | 格式化字符串,如果前面有数字,则代表字符串的长度,具 体请参考易错点介绍 | >>> print("我的名字叫%s,我是%s的学生。 "%('小明','四年级3班')) 我的名字叫小明,我是四年级3班的学生。 |
综合示例:
>>> print("我的名字是%s,今年%d,体重%.2f斤。" % ('小明', 12,65.257) )
我的名字是小明,今年12,体重65.26斤。
format格式化输出
相对于%格式化输出,format格式化输出的要求就没那么严格了。在 Python 3中,format也有很多种方法,二级考试要求掌握如下几种。
第一种:不设置指定位置,按默认顺序,如下例所示。
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
第二种:使用format后面的元组索引位置格式,如下例所示。
>>> print('1乘以{0}等于{0}, 2乘以{1}等于{2}。'.format(3,4,8))
1乘以3等于3, 2乘以4等于8。
第三种:使用命名方式,给每个需要格式化的位置命名,然后在format中 进行变量赋值,如下例所示。
>>> print ('我叫{name},我会的编程语言有{program1}和{program2},我学习编程已经{age}年了,用得最多的编程语言是{program2}。'.format(name='张三',program1= 'Scratch',program2='Python',age=4))
我叫张三,我会的编程语言有Scratch和Python,我学习编程已经4年了,用得最多的编程语言是Python。
replace():替换
- 语法
字符串序列.replace(旧子串, 新子串, 替换次数)
注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。
- 快速体验
>>> mystr = "hello world and Tmbc and Python"
>>> print(mystr.replace('and', 'he'))
hello world he Tmbc he Python
>>> print(mystr.replace('and', 'he', 10))
hello world he Tmbc he Python
>>> print(mystr)
hello world and Tmbc and Python
注意:数据按照是否能直接修改分为可变类型和不可变类型两种。字符串类型的数据修改的时候不能改变原有字符串,属于不能直接修改数据的类型即是不可变类型。
split()
作用:字符串分割,将一个完整的字符串使用分割符分割成字符串列表。
格式:字符串名字.("分隔符"),如下例所示。
>>> Fruits="苹果,香蕉,橘子,葡萄"
>>> Fruits1=Fruits.split(",")
>>> Fruits1
['苹果', '香蕉', '橘子', '葡萄']
join()
作用:和split()的功能刚好相反,将列表结合为字符串。
格式:"连接符".join(字符串名),如下例所示。
>>> Fruits=['苹果', '香蕉', '橘子', '葡萄']
>>> Fruitsl = ",".join (Fruits)
>>> Fruitsl
'苹果,香蕉,橘子,葡萄'
易错点
字符串的截取如果没有步长信息,则步长为1;如果有,则按照步长进行截取。
字符串中的数字是字符串类型的,所以不能用sum()进行求和运算。
字符串中的很多操作,比如检查是否在字符串中、字符串中某一个字符出现的次数等都要注意字符串要加引号,否则Python会认为是变量而不是字符串。
%f可以有两个参数,由小数点隔开,比如%3.2f;小数点前面的数字代表整个小数的占位数量,如果数位不够,则用空格在前面补齐;小数点后面的数字代表小数位数,如果小数位数不够则用0补齐,如下例所示。小数位数的保留采用四舍五入的进位法保留。
>>> print('这个数是:%10.5f'%1.2) 这个数是: 1.20000 #1的前面有3个空格,整个小数一共10个字符
%s的s前面可以加整数,代表字符串的长度。如果字符串长度超出了该数字,则显示全部字符串;如果没有超出,则在字符串的前面用空格补齐,如 下例所示。
>>> print('我的名字叫:%s。'%'Python') 我的名字叫:Python。 >>> print('我的名字叫:%2s。'%'Python') 我的名字叫:Python。 >>> print('我的名字叫:%10s。'%'Python') 我的名字叫: Python。
%格式化输出可以混合使用,但是每个%对应一个内容,必须用元组 一一对应注明出来,如下例所示。
>>> print('我的名字叫:%s,今年%d岁了,我是%.1f班的学生。'%('张三',10,4.3)) 我的名字叫:张三,今年10岁了,我是4.3班的学生。
模拟考题
考题1 单选题
已知s=list("sgdhasdghasdg"),以下选项中能输出字符"g"出现的次数的是 ()。
A. print(s.index(g)) B. print(s.index("g")) C. print(s.count("g")) D. print(s.count(g))
答案:C
解析:查找某一个字符在字符串中的索引位置使用index()函数,但是查找某一个字符在字符串中出现的次数需要使用count()函数,另外,count()括号里面的字符一定要用引号引起来,所以正确答案是C。
考题2 单选题
下列代码的执行结果是?()
s1="abcde"
s2="fgh"
s3=s1+s2
s3[4:7]
A. efg B. efgh C. def D. defg
答案:A 解析:根据题意可知,sl+s2是将两个字符串进行合并,结果为 "abcdefgh",然后赋值给s3, s3[47]代表截取字符串s3的索引为4~7 (不含7) 的字符串,所以结果为efg,选择A。
考题3 单选题
已知字符串中的某个字符,要找到这个字符的位置,最简便的方法是( )。
A.切片 B.连接 C.分割 D.索引
答案:D
解析:切片是已知索引才可以进行切片,排除A选项;连接是将两个字符串连接为一个,也不符合题意,排除B;分割是将一个字符串分为由多个字符串组成的列表,也不符合题意,排除C;索引是已知字符串,然后寻找它的位置, 符合题意,所以选择D。
考题4 单选题
对 s="www.baidu.com "执行 s.split(".")后的结果是( )。
A. www.baidu.com B. ['www', 'baidu', 'com']
C. "www.baidu.com" D. wwwbaiducom
答案:B
解析:split是字符串分割,通过split(),我们可以将字符串分割成列表,所 以正确答案是B。
考题5 判断题
运行如下代码:
print('今天是%d月%d日,星期%s,天气%s'%(3,25,'三','晴好'))
结果为“今天是3月25日,星期三,天气晴好”。( )
答案:正确
解析:这是对字符串格式化输出的用法的考核,%d代表整型,%s代表字符串,根据%后面的元组,将(3,25,'三','晴好')四个元素一一填入对应的格式位置, 得到的就是“今天是3月25日,星期三,天气晴好”,所以题目所述是正确的。
考题6 单选题
下面程序的执行结果为()。
s = '{0}+{1}={2}'.format(2, 3, 5)
print(s)
A. 0+1=2 B. {0} + {1}={2} C. 2+3=5 D. {2} + {3} = {5}
答案:C
解析:format的格式化,{}里面如果为数字,则代表参数在元组中的索引位置,根据题意,s = '{0}+{1}={2}'.format(2, 3, 5),格式化输出的结果为s = '2+3=5 ',所以选择C。
字符串单元测试题
模拟考题
一、单选题(共20题,每题4分,共80分)
1、下列代码的执行结果是?( )
s1="abcde"
s="fgh"
s3=s1+s2
s3[4:7]
A. efg
B. efgh
C. def
D. defg
2、
s='语文、数学、英语、信息技术'
l=s.split('、')
print(l)
以上代码的运行结果为?( )
A. ['语文', '数学', '英语', '信息技术']
B. ['语文、数学、英语、信息技术']
C. ('语文', '数学', '英语', '信息技术')
D. ('语文、数学、英语、信息技术')
3、执行以下语句后的输出结果是?( )
str1='My name is BeiJing'
print(len(str1))
A. 20
B. 18
C. 15
D. 16
4、对s=“www.baidu.com”执行s.split(".")后的结果是什么?( )
A. www.baidu.com
B. ['www','baidu','com']
C. "www.baidu.com"
D. wwwbaiducom
5、已知字符串st='Python',执行语句x=a[::2]后,变量x的值为?( )
A. 'Pyt'
B. 'Py'
C. 'yhn'
D. 'Pto'
6、已知a="1",b="2",则表达式a+b的值为?( )
A. 3
B. 12
C. '12'
D. '21'
7、已知变量stra="IloveTX",执行语句print("love" in stra)的结果为?( )
A. True
B. False
C. 1
D. 0
8、s="abc123",采用字符串操作函数将其中的字符c替换为字符C,以下哪个操作正确?( )
A. s.replace('c', 'C')
B. replace(c,C)
C. s.replace(c,C)
D. replace('abc123','abC123')
9、执行下列代码,输出的结果是?( )
word = 'China'
num = 3
string = 'python'
total = string * (len(word) - num)
print(total)
A. pythonpython
B. 'python''python'
C. python
D. 'python'
10、str = "学习力,思考力,行动力,创造力",运行print(str[4:7])的结果是?( )
A. 思考力,
B. ,思考力
C. 思考力
D. ,思考力,
11、下列关于字符串的描述正确的是?( )
A. 字符串是一个可变的序列
B. 我们可以通过min()来获取字符串的长度
C. 字符串是用一对双引号" "或者单引号’ '括起来的零个或者多个字符
D. 我们可以通过str.upper()将字符串中的所有大写字母变成小写字母
12、已知a="123",那么a*2的结果是?( )
A. 246
B. 123123
C. '123123'
D. '246'
13、下列程序的运行结果是?( )
name='The dog is ehite'
new_name=name[:11]+'white'
print(new_name[11:])
A. The dog is white
B. hite
C. ehite
D. white
14、运行下列程序,输出的结果是?( )
s = 'kdk-kldk-dsd'
s = s.split('-')
print(''.join(s))
A. ['kdk', 'kldk', 'dsd']
B. kdkkldkdsd
C. kdk kldk dsd
D. kdk-kldk-dsd
15、a=2,b=0 ,下列不能打印出2022的是?( )
A. print('%d%d%d%d' % (a, b, a, a))
B. print(''.join([a, b, a, a]))
C. print("{0}{1}{0}{0}".format(a, b))
D. print('%s%s%s%s' % (a, b, a, a))
16、运行下列程序,输出的结果是?( )
s1='student'
s2='school'
s3=s1+s2
print(s3[5:9])
A. ents
B. ntsc
C. entsc
D. ntsch
17、字符串str="maixnm"包含"min"和"max"两个单词,下面哪个操作不能将"min"从中找出来?( )
A. str1=str[0]+str[2]+str[4]
B. str1=str[0 : -1 : 2]
C. str1=str[::2]
D. str1=str[0:4:2]
18、想得到的输出为"My name is Kevin and I am 10 years old."以下选项正确的是?( )
A. print('My name is %s and I am %d years old.',%('Kevin',10))
B. print('My name is %s and I am %d years old.'%('Kevin',10))
C. print('My name is %c and I am %d years old.'%('Kevin',10))
D. print('My name is %s and I am %d years old.'%',Kevin',%10))
19、下列程序的运行结果是?( )
str1='0123456789'
str2=str1[1:9:2]
print(str2)
A. 1357
B. 024
C. 13579
D. 0246
20、下列程序的运行结果是?( )
str1="cat dog cat dog cat dog"
str2=str1.replace("cat","mouse",2)
print(str2)
A. cat dog mouse dog cat dog
B. 2 dog mouse dog cat dog
C. mouse mouse dog mouse mouse dog cat dog
D. mouse dog mouse dog cat dog
二、判断题(共5题,每题4分,共20分)
21、判断下面的语句是否正确。
>>> a="Hello"-"World"
>>> a
‘Hello World’
正确 错误
22、普通字符串,采用双引号("")包裹起来,用采用单引号(‘’)包裹起来不是字符串,
如:a="word"属于字符串,a=‘word’不属于字符串。
正确 错误
23、可以使用“+”和“-”来连接与删除字符串。
正确 错误
24、print('今天的最高气温是'+35+'度') +这个符号是起到连接的作用,所以这个代码的输出结果是:今天的最高气温是35度。
正确 错误
25、已知Money=8.6675 , print("工资{0:.2f}".format(Money)),结果是:"工资8.67".( )
正确 错误
答案
一、单选题
1、A
试题解析:本题考点是字符串的通用操作,根据字符串的连接,我们可以得到s3="abcdefgh",根据访问指定索引范围,我们应该得到答案为A
2、A 3、B
4、B
试题解析:字符串内置方法,通过split我们将字符串分割成了列表
5、D 6、C 7、A 8、A 9、A 10、C
11、C
试题解析:字符串是不可变的,获取字符串长度应该使用len(),str.upper()是将小写变成大写,所以A、B、D都不对,答案是C
12、C
试题解析:字符串的重复,特别要注意这里的a是字符串类型,而不是整型,所以选择C
13、D 14、B 15、B 16、B 17、D 18、B 19、A
20、D
试题解析:考察字符串replace()方法的使用、
二、判断题
21、错误 22、错误 23、错误 24、错误 25、正确