1. 字符串引入
python字符串是一个有序的字符的集合,用于存储和表现基于文本的信息。在python中,字符串被划分为不可变序列这一类别中,意思是字符串的字符有着从左到右的顺序,并且它们不能够在原处进行修改。下面我们开始看字符串的基本操作。
2. 字符串常量
2.1 字符串常量
首先我们需要知道的是,Python3中有3种字符串类型:str, bytes, bytearray。其中,str用于Unicode文本,bytes用于二进制数据(包括编码的文本),bytearray是bytes的一种变形。
创建字符串常量,我们可以通过单引号和双引号来创建字符串,这两者创建的字符串没有任何区别。
>>> str1 = 'hello'
>>> str2 = "hello"
>>> str1 == str2
True
空字符串通过不在单引号和双引号内部输入数据创建:
>>> str = ''
>>> type(str)
<class 'str'>
>>> str
''
>>> len(str) #求字符串的长度
0
既然通过单引号和双引号创建的字符串是相同的,那我们为什么要保留两种方式呢?这是因为当字符串也需要包含引号时,单双引号的存在可以使得在不使用转义字符的情况下实现字符串内包含引号的操作。下面看两个例子:
e.g.1: 字符串包含单引号,字符串通过双引号创建:
>>> str = "What's your name?"
>>> str
"What's your name?"
e.g.2 : 字符串包含双引号,字符串通过单引号创建:
>>> str = 'The second derivative is y".'
>>> str
'The second derivative is y".'
关于三引号,三引号主要用于跨行的字符串表示,在两个三引号之间的所有行的内容都会被标注为字符串。三引号常用于定义的函数下方,用来写函数的作用和输入输出变量的注释。还可以在不需要执行的代码块前后标注三引号,将此段代码注释掉。
在交互模式下运行由三引号创建的跨行字符串,输出的结果为会转换为转义字符:
>>> """ Python is easy to learn.
... I think so.
... Great!
... """
' Python is easy to learn.\nI think so.\nGreat!\n'
此外,python自动在任意的表达式中合并相邻的字符串常量:
>>> string = 'Nice''to''meet'"you."
>>> string
'Nicetomeetyou.'
但是在这些字符串之间增加逗号会创建一个元组:
>>> string = 'Nice','to','meet','you.'
>>> string
('Nice', 'to', 'meet', 'you.')
type(string)
<class 'tuple'>
2.2 转义字符
转义字符,也就是 反斜杠 \ , 用来引入特殊的字节编码。字符串常量中字符 \ ,以及它后边的一个或多个字符,会被一个表示特定含义的单个字符所替代,这个字符通过转义序列定义了一个二进制值。
注意:由转义字符+特殊命令构成的特殊字符表示一个单个字符. 但是,单独的一个反斜杠,表示在下一行连续输入,不单独占一个字符。 可以看下面一个例子:
>>> string = 'a\nb'\
... 'c'
>>> print(string)
a
bc
>>> len(string) #求字符串长度
4
\n表示换行字符,占一个,a,b,c各为一个字符,单独的反斜杠 \ 不占字符,因此字符串string的长度为4。
下面给出了常见的转义字符:
转义字符 | 意义 |
---|---|
\ | 连续,常用在一行写完接着第二行写的情况 |
\ \ | 单纯的反斜杠 (保留) |
\ ’ | 单引号 (保留’) |
\ " | 双引号 (保留") |
\a | 响铃 |
\b | 倒退 |
\f | 换页 |
\n | 换行 |
\r | 返回 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0 | NULL |
下面我们看几个转义序列的例子:
##双反斜杠
>>> s = 'hello\\'
>>> print(s)
hello\
##反斜杠+单引号
>>> s = 'hello\''
>>> print(s)
hello'
##反斜杠+双引号
>>> s ='hello\"'
>>> print(s)
hello"
##响铃,这里直接在交互模式下输入s不会有反应,print(s)的时候,插入耳机,会有“砰”的一声....
>>> s = 'hello\a'
>>> s
'hello\x07'
>>> print(s)
hello
##退格,\b前面一个字符会被删除掉
>>> s = 'hello\bpython\bstudy'
>>> print(s)
hellpythostudy
##换页
>>> s ='hello\fpython'
>>> print(s)
hello
python
##换行
>>> s = 'hello\npython'
>>> print(s)
hello
python
##返回 \r,是Carriage return, 打印头回到行首,因此覆盖掉了前面的hello字符
>>> s = 'hello\rpython'
>>> print(s)
python
##水平制表符
>>> s = 'hello\tpython'
>>> print(s)
hello python
##垂直制表符
>>> s = 'hello\vpython'
>>> print(s)
hello
python
## \0,NULL. 对print(s)没有影响。直接执行的时候,将八进制编码转义为一个数字
>>> s ='hello\0python'
>>> s
'hello\x00python'
>>> print(s)
hellopython
2.3 raw字符串
转义序列用来处理特殊字节编码非常方便,但是,为了引入转义字符而使用的反斜杠处理会带来一些麻烦,特别是在打开文件,需要输入路径,网址域名的时候。例如:
myfile = open('C:\new\text.dat','w')
这里,本来目的是打开C盘下new文件夹里的text.dat 文件,但是由于地址中存在’ \n ',会被识别为一个换行字符,因此,这将会报错找不到文件路径。
所以,我们要使用raw字符串来关闭转义机制。如过字母(大小写均可) r 出现在字符串的第一个引号前,Python会关闭对此字符串的转义机制,将反斜杠作为常量来保持。或者,我们可以通过两个反斜杠来保留其中一个反斜杠,达到目的。
注意: raw字符串不能以单个的反斜杠结束,否则反斜杠会将创建字符串的引号给转义为单纯的引号,出现报错信息。下面就是一个简单的报错,因为末尾的 \ 将最后的 ’转义为了单纯的引号,导致创建字符串常量不成功:
>>> string = r'C:\new\text.dat\'
File "<stdin>", line 1
string = r'C:\new\text.dat\'
^
SyntaxError: EOL while scanning string literal
除了核心字符串常量和工具以外,Python通过标准库re模块(正则式表达)支持更高级的字符串的处理。
3. 其他:关于类型分类和可变类型
我们已经知道,字符串是不可变序列,序列这一类操作都支持分片、合并、索引、迭代等。Python中主要有三个主要的类型分类:
1). 数字 (整数,浮点数,二进制,分数等), 支持加减乘除等运算
2). 序列 (字符串,列表,元祖), 支持索引、分片和合并等
3). 映射 (字典) , 支持通过键的索引
可变和不可变类型:
Python关于可变和不可变类型的分类大致如下:
1). 不可变类型: 数字、字符串、元祖、不可变集合
不可变类型不支持原处修改,但我们可以运行表达式来创建新对象并将新的结果分配给变量
2). 可变类型:列表、字典、可变集合
可变类型可以通过操作原处修改,而不用创建新的对象。