背景
对于很多 Python 初学者来说,搞懂我们每个数据的结构与作用是一件非常困难的事。
因此了解我们程序中各个基本类型的结构,表现方式,使用方法与应用是一件非常有必要的事。本文致力通过简单明了的语言来阐述基本类型字符串的相关信息
介绍
字符串又称 String, 是 Python 中最为常见的数据类型,在 Python 中通常用 String 的简写str 来表示。
字符串的作用
字符串用来记录文本文字信息,并且可以对其进行二次加工处理与展示,是机器与人沟通的重要方式
字符串的表现形式
在 Python 中字符串被单引号' 或双引号" 包裹,如下方代码所示
text1 = "Hello World"
text2 = 'Hello World'
等号左边的是我们的变量,等号右边的则是我们的字符串:Hello World
单双引号的区别以及如何在字符串中表示
在 python 中即可以用单引号包裹字符定义字符串,也可以用双引号包裹字符定义字符串,那么它们的区别和作用是什么?为什么要支持两种方式来创建字符串。
如果是双引号包裹的字符串中想要展示双引号,直接输入一个" 的话是会引发程序异常的,如下方代码所示
text = "双引号的表现符号是:" "
File "<stdin>", line 1
text = "双引号的表现符号是:" "
^
SyntaxError: EOL while scanning string literal
如输出内容所示,SyntaxError 是 python 的基本错误类型之一:语法错误。
冒号后面是我们的错误描述:EOL while scanning string literal
翻译成中文为:扫描字符串文字时遇到了EOL ,EOL 通常指项目终止,在 python 里代表遇到了结束符
因此我们如果想要在双引号包裹的字符串中直接将双引号又作为字符串的一部分来展示是不行的,需要一点人为的加工,同理,想要在单引号包裹的字符串中直接将单引号又作为字符串的一部分来展示也是不行的。
我们有两种方法可以实现我们的需求
方法一
在程序中,如果一串字符两端是单引号,那么单引号内部出现双引号的话,双引号会被程序作为字符存在整个字符串中,而不会被当做结束符提前结束整个识别过程,如下方代码所示
text = '双引号的表现符号是: " '
print(text)
在程序中,如果一串字符两端是双引号,那么双引号内部出现单引号的话,单引号会被程序作为字符存在整个字符串中,而不会被当做结束符提前结束整个识别过程,如下方代码所示
text = "单引号的表现符号是: ' "
print(text)
方法二
python 将反斜杠\ 作为转义字符,当我们字符串中出现了会被程序识别的一些关键字符的时候,如果我们只想将它们作为普通字符存在字符串中,就需要转义字符来标识一下,让程序忽略他们的特殊含义,如下方代码所示
text = "双引号的表现符号是:\" ,单引号的表现符号是:' "
print(text)
从输出中可以看到,我们字符串中双引号前面的反斜杠消失了,与此同时,双引号包裹的字符串中出现了双引号并没出出现任何报错,程序成功运行。说明反斜杠转义了双引号作为结束符存在的特殊含义。
通常,如果一个字符串中,既需要出现双引号,又需要出现单引号。我们仅凭双引号和单引号包裹无法全部展示时,就可以使用转义字符来转义对应的信息
如何确定它就是字符串
在Python中,我们可以通过内置函数type() 来获取数据的类型信息,如下方代码所示
print(type("Hello World"))
通过打印type() 获取的输出可以看到输出了<class: 'str'> 字符,尖括号中 class 代表这是一个类,而 str 代表这是字符串类型
之前我们介绍中说过,python 中使用英文 String 的简写 str 来表示字符串类型
字符串的运算符
运算符 | 描述 | 例子 |
---|
+ | 字符串连接符 | >>> “Hello” + “World” HelloWorld | * | 字符串倍数输出 | >>> “Hello” * 2 HelloHello | [] | 通过索引取出字符串中字符 索引第一位从0开始 | >>> “Hello”[2] l | [s:e] | 截取字符串的一截 从索引为s的字母开始到索引为e的字母前一位结束 | >>> “Hello”[1:4] ell | in | 成员运算符 如果字符串中包含给定字符返回True | >>> “H” in “Hello” True | not in | 成员运算符 如果字符串中不包含给定的字符返回True反之False | >>> “H” not in “Hello” False | % | 格式字符串,常用于拼接字符 | >>> “Hello %s” % “World” Hello World |
字符串的使用
转义字符
在介绍中我们说过,字符串中可能会出现各种包含特殊含义的字符,需要用转义字符反斜杠\ 才能正确展示。接下来我们介绍有哪些字符是转义字符以及它们的使用方法
转义字符 | 描述 |
---|
\(行尾) | 续行符 | \(行内) | 反斜杠转义 | \b | 退格 | \n | 换行 | \v | 纵向制表符 | \t | 横向制表符 | \r | 回车 | \f | 换页 | \0yy | 八进制数,yy 代表 0~7 的字符,例如:\012 代表换行。 | \xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
续行符
我们在写脚本的时候,有些时候字符串过长,屏幕无法完整展示整行文本,就需要通过换行来方便阅读。使用续行符可以来连接不同行的内容,将其作为完整的内容输出。如下方代码所示
text = "你是柴米油盐," \
"清晨白米稀饭," \
"你懂得四季变换," \
"懂得长久为伴"
print(text)
反斜杠转义
我们在字符串编辑中会遇到一些特殊的字符,python 会将其识别为特殊的功能,如果想要在字符串中展示它原本的字符,就需要用到反斜杠来转义它。如下方代码所示
text = "双引号的表现符号是:\" ,单引号的表现符号是:' "
print(text)
退格
退格顾名思义,就是往前退一格,我们如果字符串中包含退格符,则退格符前面一位的字符会消失不展示。如下方代码所示
text1 = "h\bour"
print(text1)
text2 = "我不\b\b喜欢你"
print(text2)
可以看到通过\b 我们可以让字符串原本的含义完全变样。但是在这里出现一个很奇怪的现象,text1 中我们输入了一个\b 就使字符向前退格,但是text2 中有两个\b 却只退格了一个字。
这是由于英文和中文占用的字节数不同导致的,一个英文字符只占用一个字节,而中文则会根据编码不同占用两个到三个字节
换行
我们在脚本中编辑字符串时也会有让字符输出有更丰富的格式,其中换行就是非常重要的一种格式。python 为我们提供了转义字符\n 作为换行符的标志,我们可以通过在字符串中加入\n 来实现输出的字符换行的功能。如下方代码所示
text = "故事的小黄花,从出生那年就飘着\n童年的荡秋千,随记忆一直晃到现在"
print(text)
其他
转义字符的使用可以直接在 python 控制台通过实际操作打印输出来印证自己的想法,其余转义字符由于使用较少,这里不再浪费篇幅赘述。大家可以动手尝试看看
三引号
python中除了单双引号可以用来创建表示字符串以外,还有三引号(""" 或''' )可以创建表示字符串。之所以将它单独列出来且放在这里介绍,是因为它可以将复杂的字符串进行处理赋值,同时了解了转义字符的作用之后有助于理解这里它的强大之处。
三引号的表现形式是三个连续的双引号或者单引号,将字符串两边包裹。如下方代码所示
text = """故事的小黄花 从出生那年就飘着
童年的荡秋千 随记忆一直晃到现在
re sol sol xi do xi la sol la
xi xi xi xi la xi la sol
"""
print(text)
可以看到三引号允许字符串直接跨多行存在,且自动为我们的字符串插入了换行符。它可以让我们自由编辑字符串从各种引号和特殊字符的噩梦泥潭中解脱出来(不需要想着为引号打上反斜杠转义,也不需要每次加\n才能表示换行等)
字符串的拼接
格式化代码
上面讲了 python 提供了很多转义字符让我们可以在字符串中输出尽可能多的格式,这里我们会介绍往字符串中加入更多的符号来让我们的字符串拥有更多更灵活的编辑方式。其格式化的语法如下方代码所示
singer_list = ["周杰伦", "林俊杰", "许嵩"]
for signer in singer_list:
text = "%s是我喜欢的歌手之一" % signer
上方代码中我们使用循环遍历了列表,将列表中所有的歌手取出来并且动态的插入进了我们的字符串中,实现了动态变更字符串内容的过程。
初学者如果尚不了解循环可以不必在意上述代码中for signer in signer_list: 到底为什么这么写。只需要理解它实现了一个循环取出三个歌手的操作,每次循环signer 就被赋值成一个歌手的值即可。
下表是 python 所能提供的一些格式化符号
符号 | 描述 |
---|
%c | 格式化字符和ASCII码 | %s | 格式化字符串 | %d | 格式化整数 | %u | 格式化无符号整型 | %o | 格式化无符号八进制数 | %x | 格式化无符号十六进制数 | %X | 格式化无符号十六进制数(大写) | %f | 格式化浮点数,可以指定小数点后精度 | %e | 用科学计数法格式化浮点数 | %g | %f和%e的简写 | %p | 用十六进制数格式化变量的地址 |
下面介绍几种比较常见,初学者易于理解的用法做为了解
格式符号:%s
%s 是格式化字符串的,当我们需要动态的的给字符串中插入一些其他字符时,我们可以使用%s 来实现我们的需求。如下方代码所示
variable = "苹果"
text = "牛顿被%s砸中,所以发现了万有引力" % variable
print(text)
上述代码我们将苹果 赋值给了变量variable ,并且使用变量来动态插入到字符串中,从而输出了一串完整的句子。实际生产环境使用中,variable可能是任意值,我们身为脚本的编写者也不知道用户会输入什么值。但是无论输入的事什么值,都能够通过赋值给这个变量然后动态插入字符串中并输出
格式符号:%d
上面表格中描述写%d 是格式化整数的,根据上面%s 的用法我们可以知道,当字符串中出现%d 时,我们就可以通过字符串后面加百分号% 再加一个整数,即可实现往字符串中动态插入数字的操作。如下方代码所示
point = 99
text = "小明今天考试得了%d分,非常开心" % point
print(text)
格式符号:%f
与%d 格式化整数相对,%f 是用来格式化浮点数的,浮点数通常指小数。我们可以通过%a.bf 来指定展示小数的长度,保留的精度。如果长度不够,则左侧补空格。如下方代码所示
pi = 3.14
text = "π的数值大概是%f" % pi
print(text)
π的数值大概是3.140000
pi = 3.1415926
text = "π的数值大概是%f" % pi
print(text)
π的数值大概是3.141593
pi = 3.1415926
text = "π的数值大概是10.3f" % pi
print(text)
π的数值大概是 3.142
可以看到当我们仅使用%f 时,无论我们的浮点数 多长,都会固定将数值截断至小数点第六位,若不足六位则会用0补上。而我们可以通过%a.bf 的方式来指定我们需要保留多少长度和多少位小数的精度,a 代表长度,b 代表精度,当我们浮点数的长度不够时,左侧补上了缺少长度数目的空格
字符串的加法
字符串可以通过符号加号+ 来拼接多个字符串,如下方代码所示
text1 = "Hello"
text2 = "Kitty"
text = text1 + text2
print(text)
字符串的倍化
字符串可以通过符号星号* 来倍数字符串,如下方代码所示
text = "Hello" * 3
print(text)
字符串的内置函数拼接法
除了上述的拼接字符串的方法外,字符串还提供了一种内置函数format() 方便我们动态往字符串中插入我们想要拼接的字符。如下方代码所示
text = "{}是我最喜欢吃的{}之一".format("苹果", "水果")
print(text)
可以看到我们在字符串中加入了两个花括号,而在字符串的结束处加入了.format("苹果", "水果") 就令苹果 和水果 两个词汇插入到了花括号所在的地方。
我们只需要在字符串中加入花括号,然后在format的括号内加入对应想要插入的字符串即可将其动态插入上去。加了多少花括号就需要在format的括号内加入多少字符串并用逗号隔开
字符串内置函数
本节将讲解字符串具体有哪些常用内置函数,它们有什么作用。
方法 | 描述 |
---|
string.count(str, beg=0, end=len(string)) | 返回str在string里面出现的次数,如果beg或者end指定,则返回string指定范围内str出现的次数 | string.decode(encoding=“UTF8”, errors=“strict”) | 以encoding指定的编码格式解码string,如果出错则报一个ValueError的异常,除非errors指定的是ignore 或者replace | string.encode(encoding=“UTF8”, errors=“strict”) | 以encoding指定的编码格式编码string,如果出错则报一个ValueError的异常,除非errors指定的是ignore 或者replace | string.find(str, beg=0, end=len(string)) | 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 | string.format() | 格式化字符串 | string.index(str, beg=0, end=len(string)) | 跟find()方法一样,只不过如果str不在 string中会报一个异常 |
|