第八章 字符串

学习要点

学习字符串的基本操作以及格式化输出。

对标内容

  1. 理解字符串类型的概念,掌握它的基础用法及操作:字符串的分割、 结合、替换、检索、长度获取。
  2. 运用%运算符输出指定格式,format()格式化输出。

情景导入

计算机是由美国发明的,所以在最早的计算机里面只有127个字符,包括英文字母、数字和一些常用符号;但是随着计算机的普及,全世界各国的语言有近百种,127个字符显然不够用,这样各国都开始建立自己的文字编码。但是,各国自己创建自己的编码,势必会造成编码之间的冲突,那该怎么办呢? Unicode 编码应运而生。Unicode编码把所有语言都统一到一套编码里,这样就不会再有乱码问题了,这就是现在我们计算机用的通用编码库。现在国内用得最多的 UTF-8就是在Unicode编码的基础上发展出来的。

字符串

字符串的特性

字符串是Python中最常用的数据类型,是不可变序列的一种。我们可以使用英文(半角)引号(单引号’或双引号")来创建字符串。

字符串的创建

  1. 直接赋值,如var = "Python编程"。
  2. 使用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()。

  1. 语法
字符串序列.count(子串, 开始位置下标, 结束位置下标)

注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  1. 快速体验
>>> 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():替换

  1. 语法
字符串序列.replace(旧子串, 新子串, 替换次数)

注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。

  1. 快速体验
>>> 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. 字符串的截取如果没有步长信息,则步长为1;如果有,则按照步长进行截取。

  2. 字符串中的数字是字符串类型的,所以不能用sum()进行求和运算。

  3. 字符串中的很多操作,比如检查是否在字符串中、字符串中某一个字符出现的次数等都要注意字符串要加引号,否则Python会认为是变量而不是字符串。

  4. %f可以有两个参数,由小数点隔开,比如%3.2f;小数点前面的数字代表整个小数的占位数量,如果数位不够,则用空格在前面补齐;小数点后面的数字代表小数位数,如果小数位数不够则用0补齐,如下例所示。小数位数的保留采用四舍五入的进位法保留。

    >>> print('这个数是:%10.5f'%1.2)
    这个数是:   1.20000     #1的前面有3个空格,整个小数一共10个字符
    
  5. %s的s前面可以加整数,代表字符串的长度。如果字符串长度超出了该数字,则显示全部字符串;如果没有超出,则在字符串的前面用空格补齐,如 下例所示。

    >>> print('我的名字叫:%s。'%'Python')
    我的名字叫:Python。
    >>> print('我的名字叫:%2s。'%'Python')
    我的名字叫:Python。
    >>> print('我的名字叫:%10s。'%'Python')
    我的名字叫:    Python。
    
  6. %格式化输出可以混合使用,但是每个%对应一个内容,必须用元组 一一对应注明出来,如下例所示。

    >>> 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、正确

Copyright © all right reserved,powered by Gitbook该文件修订时间: 2023-07-23 15:25:35