由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍。
对于字符串,前面在数据类型中已经提到过。但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作。而我们在实际编码过程中,又经常会与字符串打交道。所以这里字符串单独列出一节来讲解。
字符串是由一对引号(单双引号都可以)括起来进行标识。字符串的数据类型是 str
, 同时字符串也是一种序列。
定义一个字符串:
>>> s = 'nemo'
>>> s1 = '中文'
>>> s2 = "Python 极简教程"
>>> s3 = ''' # 多行字符串,用三对引号(三个单引号或者三个双引号)
Python 极简教程
希望大家多提意见
顺便点个喜欢
'''
字符串操作
字符串的操作有很多与列表类似,因为字符串和列表同样都是序列。
1. 字符串相加(拼接)
>>> s = '懒猫'
>>> s1 = 'nemo'
>>> s + s1
'懒猫nemo'
2. 字符串乘法
>>> s = 'nemo'
>>> s * 3
'nemonemonemo'
3. 成员运算
>>> ms = 'n'
>>> s = 'nemo'
>>> ms in s
True
>>> 'x' in s
False
>>> 'x' not in s
True
# 也可以判断连续字符串
>>> 'em' in s
True
4. 通过索引取字符
字符串通过索引取字符的方式与列表中的取值相同。字符串中的每个字符相当于字符串的每个元素,索引从0开始。
>>> s = 'nemo'
>>> s[1]
'e'
格式化字符串
1. 使用 % 格式化
格式化字符串,本义是在打印的时候可以将打印出来的字符串格式化后输出(控制台,也就是打印语句的输出),这样字符串看起来更加整洁美观。
但是实际编码过程中,很少直接通过控制台输出,所以更多的时候,格式化字符串用来将字符串中的部分字符串用参数代替。
例如,从键盘接收两个输入,分别是姓名和爱好,然后输出* x 的爱好是 y *(x 用输入的姓名代替,y 用输入的爱好代替)
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('%s 的爱好是 %s !' % (name, fondness))
以上代码,用 IDLE 新建一个文件,运行效果更好。
'%s 的爱好是 %s !' % (name, fondness)
上面的
%s 的爱好是 %s !
就是格式化字符串,%
为占位符,s
表示占位的数据格式为字符串。
引号后面的%
为固定格式
(name, fondness) 是实际的参数,需要和前面的 % 数量一致,数量不一致就会报错。如果只有一个 % 就不需要括号
# 只有一个参数的情况
>>> name = 'nemo'
>>> '你的名字是 %s!' % name
'你的名字是 nemo!'
# 还可以先存起来,后面再赋值
>>> s = '你的名字是 %s!'
>>> s % 'nemo'
'你的名字是 nemo!'
其他还有很多格式化的用法,因为实际使用比较少,这里就不再赘述。有兴趣的可以查阅相关资料。
2. 使用 format 函数
format 函数是 Python 官方目前主推的格式化用法。但是同样我们实际很少需要在控制台上输出,因此主要还是用它来进行字符串内部字符的参数化。
format 函数的占位符为 {},可以是空的 {},后面实际赋值的时候按照 {} 出现的顺序依次赋值。也可以在 {} 中加上索引,如{0},{1}等,0 代表后面的第一个实际值,1为第二个,依次类推。还可以在 {} 中加上名称, 如 {name}, {fondness},那么会以该名称赋值。
示例如下:
# 以三种方式修改上面的例子
#1. 空的 {} 占位
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{} 的爱好是 {}!'.format(name, fondness)) # 写法上注意一下 字符串.format()
#2. 加上索引
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{1} 的爱好是 {0}!'.format(fondness, name)) # 故意更换了一下位置,对比一下
#3. 加上名称
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{n} 的爱好是 {f}!'.format(f=fondness, n=name)) # 前面 {} 加了名字,在后面就写成 名称=值(变量)
上面的例子,故意调整了一下顺序和名称,自己动手练练,感受一下。
3. f 字符串
f-string
是 Python 3.6 中定义的一种参数化字符串的方式,主要是让格式化字符串更加便捷。
在 f-string
中,不要再使用 %-格式化 或者 format 函数中的复杂写法,可以直接在字符串中写入变量名。f-string
用 {} 标识变量,区别在于 {} 不再是用来占位的,而是直接写入变量名。
修改上面的格式化例子:
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print(f'{name} 的爱好是 {fondness}!') # 字符串前面的 f 大小写均可
除此之外,还可以在f-string
中使用函数和表达式:
# 显示当前时间
>>> import time # 引入时间库
>>> print(f'当前时间是 {time.ctime()}!') # time.ctime() 为显示当前时间的函数
当前时间是 Tue Mar 19 23:30:49 2019!
# 直接在字符串中进行运算
>>> x = 10
>>> y = 5
>>> F'x + y = {x+y}'
'x + y = 15'
可谓非常方便实用,而且据说速度优于其他的格式化方式。
r 字符串
字符串中如果出现 反斜杠 \
会出现一些不同的意思,比如\n
表示换行,\t
制表符(Tab)等等,如果你想表示一个 Windows 路径的时候,比如C:\test\nemo
,那么实际打印的时候会变成如下的样式:
>>> path = 'C:\test\nemo.txt'
>>> print(path)
C: est
emo.txt
如果是操作文件的时候,就会出现各种异常。因此为了避免其中的特殊字符造成字符串不是原来的意思,我们可以使用 r
(大小写都可以)来将字符串中的特殊字符全部定义为普通字符。
>>> path = r'C:\test\nemo' # r 写在字符串第一个引号前面
>>> print(path)
C:\test\nemo
字符串常用内置方法
以下仅列出较为常用的内置方法,其余方法请参考其他资料。(写太多不常用的内容,就称不上极简教程了)
注意:其中部分极少使用的默认参数也已去掉
下面这些方法非常常用,需要背下来,就算不能背下来,至少要知道有这些方法。
方法 | 说明 |
---|---|
str.strip() | 删除字符串前后空格 |
str.replace(old, new) | 把将字符串中的 old 替换成 new |
str.join(seq) | 以指定字符串作为分隔符,将 seq 中所有的元素合并为一个新的字符串 |
str.split(obj) | 以 obj 为分隔符切割字符串,生成一个列表 |
str.find(obj) | 检测 obj 是否包含在字符串中 str中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 |
str.index(obj) | 跟find()方法一样,只不过如果str不在字符串中会报一个异常 |
string.startswith(obj) | 检查字符串是否是以 obj 开头。是则返回 True,否则返回 False |
string.endswith(obj) | 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束。如果是,返回 True,否则返回 False |
string.upper() | 转换 string 中的小写字母为大写 |
string.lower() | 转换 string 中所有大写字符为小写 |
1. str.strip() 去前后空格
我们在进行登录的时候,偶尔手抖在账号前或后输入了一个空格,也能登录成功;有些系统又不行。之所以能登录成功,其实是因为开发人员做了处理,帮你去掉了不小心在账号前后输入的空格。这就是 strip 这个方法的用途。
>>> s = ' nemo ' # 前后有空格
>>> s.strip()
'nemo'
2. str.replace(old, new) 替换
字符串替换,用于将字符串中的某部分内容替换成新的字符串。
# 将下面字符串中的'+'加号,替换成','逗号。
>>> s = 'MP3+pdf+doc+txt'
>>> s.replace('+', ',') # 被替换的字符串在前,替换后的字符串在后
'MP3,pdf,doc,txt'
3. str.join(seq) 字符串组合
字符串组合,是将列表中的字符串元素组合成一个完整的字符串。使用指定的字符串来分隔组合好的字符串。
这个方法是比较容易出错的,组合的字符串在'.'前面,列表是作为参数放在括号中。
# 比如列表中有多个单词,想组成一句话
>>> words= ['it', 'was', 'the', 'season', 'of', 'Light']
>>> ' '.join(words) # 用空格分隔,空格要放在前面
'it was the season of Light'
# 小练习 1
>>> li = ['a', 'b', 'c'] # 组合成 a_b_c
>>> face = ['*', '_', '*'] # 组合成 *_*
注意,列表中必须全部是字符串,如果存在其他数据类型则会报错。
4. str.split(obj) 切割字符串
以传入的obj 为分隔符切割字符串,生成一个列表。七号和上面的 join 方法是反过来的。
比如:
# 将下面的英文句子拆分为单个的英文的单词
>>> s = 'this is a pig'
>>> s.split() # 默认按空格进行拆分
['this', 'is', 'a', 'pig'] # 拆出后的结果是一个列表
# csv文件是以逗号分隔的一种文件格式。将下面以逗号分隔的内容拆分成一个列表
>>> s = '张三,男,30,170'
>>> s.split(',') # 按逗号拆分,括号中把逗号作为字符串传入
['张三', '男', '30', '170']
# 小练习 2
# 1. 从键盘接收一组数字输入,数字以逗号分隔。返回这一组数字中的最大最小值
# 2. 从键盘接收一组数字,数字以空格分隔。反向后输出
5. 字符串查找
str.find(obj)
从左边开始查找整个字符串,返回找到匹配的字符的起始位置索引。如果找不到则返回 -1。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.find('of') # 找到则返回 of 开始的索引值
18
>>> s.find('nemo') # 找不到返回 -1
-1
str.index(obj)
查找的结果与 find 方法一样。不同的是,找不到的时候,会报错。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.index('of')
18
>>> s.index('nemo')
ValueError: substring not found # 报子串不存在的错误
6. 字符串判断
用于判断字符串是否以什么开头或者以什么结尾。
str.startswith(obj)
检查字符串是否是以指定的obj字符串开头。是则返回 True,否则返回 False
>>> s = 'it was the season of Darkness'
>>> s.startswith('it') # 注意 startswith,start 后面有个 s,starts
True
>>> s.startswith('ness')
False
str.endswith(obj)
检查字符串是否是以指定的obj字符串结尾。是则返回 True,否则返回 False
>>> s = 'it was the season of Darkness'
>>> s.endswith('ness') # 注意 endswith,end 后面也有个s
True
>>> s.endswith('it')
False
7. 大小写转换
string.upper()
把字符串中的小写字母全部转换成大写字母。
>>> s = 'nEmO'
>>> s.upper()
'NEMO'
str.lower()
把字符串中的大写字母全部转换成小写字母。
>>> s = 'nEmO'
>>> s.lower()
'nemo'
# 小练习 3
# s = 'NemO'
# s == 'nemo' 改造这个等式,使之返回 True
小练习答案:
# 小练习 1 >>> li = ['a', 'b', 'c'] # 组合成 a_b_c >>> '_'.join(li) >>> face = ['*', '_', '*'] # 组合成 *_* >>> ''.join(face) # 小练习 2 # 1. 从键盘接收一组单词,以逗号分隔。返回这一组单词中的最大最小值 >>> s = input('请输入一组单词,以逗号分隔:') 请输入一组单词,以逗号分隔:nemo,leo,nano,aux >>> li = s.split(',') >>> max(li) 'nemo' >>> min(li) 'aux' # 2. 从键盘接收一组数字,数字以空格分隔。将顺序反向后输出 >>> s = input('请输入一组数字,以空格分隔:') 请输入一组数字,以空格分隔:31 25 14 8 11 >>> li = s.split() >>> li.reverse() >>> ' '.join(li) '11 8 14 25 31' # 小练习 3 # s = 'NemO' # s == 'nemo' 改造这个等式,使之返回 True >>> s.lower() == 'nemo' # 这也是实现字符串忽略大小写的写法 >>> s == 'nemo'.upper()