04 Python序列类型之字符串详解
字符串(str)
定义:一对单引号或双引号中的一个或一串字符就是字符串。
str1 = '你好啊' str2 = "Hello" print(type(str1)) print(type(str2))
执行结果为:
<class 'str'>
<class 'str'>
由此可以看出,不管字符是哪国语言,不管引号是单引号还是双引号,只要是单或双引号引起来的一串字符就是字符串。回想一下变量也是一串字符,但它没有引号。
关于引号:Python中有3种引号,单引号、双引号、三引号。python中单引号’ '和双引号" "没有区别,如a=’abc’,a=’’abc’’。三引号'''就是连敲三次单引号,不表示字符串,它用来多行注释。若引号中还要加引号需要交叉使用,即外面单引号里面双引号,外面双引号里面单引号。
关于注释:在程序中加注释方便别人阅读你的代码,解释器不会运行注释的内容。Python注释分为单行注释和多行注释,单行注释使用井号#,#后加一行注释内容,多行注释使用三引号。一对三引号中间可以随便换行。
注释嵌套:多行注释中可以有单行注释,单行注释里不能有多行注释。
# 这是单行注释 ''' 这是多行注释 # 这是多行注释 这是多行注释 '''
一个字符串只能写在一行里,引号中间不能换行。因为一按enter语句就结束了,系统会因读不到另一个引号而报错。
如果字符串太长,想换行写成两行或多行怎么办?答:利用字符串拼接。
那就把长字符串分成若干段,每段成一个字符串,一行写一段,每段末尾加反斜杠\,最后一段不用。
其原理是反斜杠\将按enter时的语句结束功能失效,这样语句继续,多对引号连一起是字符串拼接,将多行字符串拼成一行。例子如下:
number1= "000000000000000000000000000000000000000000000000000000000" number2 = "000000000000000000000000000"\ "000000000000000000000000000000" print(number1) print(number2)
执行结果是:
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000
字符串的显示:
经过print语句打印的字符串是没有引号的,口诀:打印有引号的会没引号,打印没引号的(不是变量)会报错
print("Helloworld") print(Helloworld)
执行结果为(第一个成功第二个报错,本来我们想打印字符串,忘了加引号,系统把没引号的Helloworld认为是变量,然后又找不到赋值过的该变量):
Helloworld
Traceback (most recent call last):
File "C:\Users\22909\Desktop\blog.py", line 2, in <module>
print(Helloworld)
NameError: name 'Helloworld' is not defined
转义和原始字符串(repr)
上面的关于字符串换行写的问题中我们用到了反斜杠 \ ,这在Python中叫转义符,作用是将紧跟其后的特定字符由原来的意思转成特殊意思,上面的例子就用到了续行符。
Python所有转义字符如下:
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号(不作为字符串的单引号) |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符(等于按一下Tab) |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
有时字符串中有\,但又不想让它转义,比如路径"C:\\Programfiles\notepad\remember.txt",这里面有\n和\r。
若不想字符串转义有两种方法:1.在字符串前加小写r(将str转换成repr原始字符串)2.在\前再加一个\变成\\。当我们打印文件路径时,防转义就特别有用。
filepath = "C:\Programfiles\notepad\remember.txt" # 未防转义 print(filepath) newpath1 = r"C:\Programfiles\notepad\remember.txt" # 原始字符串防转义 print(newpath1) newpath2 = "C:\\Programfiles\\notepad\\remember.txt" # \\防转义 print(newpath2)
执行结果是:
C:\Programfiles
otepad
emember.txt
C:\Programfiles\notepad\remember.txt
C:\Programfiles\notepad\remember.txt
如何让字符串中有一个 ' 或 "。
如果字符串中有单引号或双引号,这样的字符串会报错,同样可以使用转义符。
sentence1 = 'Let's go!' # 这句会报错,解释器会以t后的单引号结束字符串,后面拖了一截不知道什么东西 print(sentence1) sentence2 = 'Let\'s go!' # \'就不再作为字符串引号了,是一种失效 print(sentence2)
执行结果为:
SyntexError
Let's go!
可以看出Python中的转义符很多时候起到的是失效的作用,比如\\, \(末尾enter失效),\',\"。
转化成原始字符串除了加r,还可以使用repr()函数,不过使用repr()打印出来的字符串带引号,不推荐。
filepath = repr("C:\Programfiles\notepad\remember.txt") print(filepath)
执行结果为
'C:\\Programfiles\notepad\remember.txt'
如何能让字符串以 \ 结尾
字符串都不能以\结尾,因为 \" ,\' 的失效作用,以\结尾报错。若想以\结尾可以使用字符串拼接原理,如下:
tail = r"C:\Program Files""\\" print(tail)
执行结果为:
C:\Program Files\
关于编码
我们从头说说编码是怎么回事。
最初的电脑是怎么显示字符的呢?
在电脑诞生不久,美国人创造了ASCII字符集,字符集中包含128个字符,这些字符就是我们键盘上的所有字符。每一个字符有一个编号(字符码),这个编号是10进制的,从0-127。然后将字符码从10进制转换成2进制。我们知道127转换成2进制是1111111,所以最多只要7位就能将128个ASCII字符全部表示。
怎么储存ASCII字符呢?
我们知道电脑的最小储存单位是字节(byte),一个字节有8位(bit),一个位上只能写0或1,所以一个字节能显示28=256个信息。而ASCII字符只占7位,所以字节第一位表示是否启用ASCII字符集,后7位表示字符。这样,只用一个字节就能储存所有的ASCII字符。
但是世界上有很多字符,比如光是中文就有六万多个字,怎么表示呢。
最初中国创建了自己的字符集,叫国标字符集,简写是GB。GB的字符码采用16进制,一个汉字的储存空间是2 byte。
再后来为了国际上的交流方便,世界上推出了Unicode字符集,该字符集中包含多国文字。Unicode有两个版本,分别是UCS-2(2 byte)和UCS-4(4 byte),每个字都是固定的储存空间。可是每个字都用4个byte储存不是太浪费了吗?像英文字母,完全可以一个byte就行了,所以为了节约空间,又在Unicode字符集的基础上发明了UTF编码储存方法,有UTF-8、UTF-16、UTF-32。UTF-8的储存机制是这样的:若某个Unicode字符码转成2进制后会占用n个byte,则将这串2进制数填入到一个格式中|n个1110……|10……|10……。把2进制按顺序填入到……中即可,| |表示一个byte,若n大于2,再加一个byte显示1110。这个编码机制可以节约常用字符的储存空间,一般只用3个字节而不是4个字节来储存字符。
Python中的英文、中文、阿拉伯数字都是采用Unicode编码来表示文本,编码默认采用UTF-8。Unicode中每个字符都采用一个字符码(code point)表示,且全世界统一,这样在不同的软件上都能显示相同的字符。
怎样调取其他Unicode字符呢,有一个通用机制:使用字符的字符码(16或32位)或Unicode名称。获取字符的字面量或名称请登录http://unicode-table.com。 下面分别举例16位字符码、32位字符码、名称。 (解释器可能显示不出笑脸和猫,将代码拷贝到博客或有道云笔记的代码块中就看见了)
>>> '\u00c6'
'Æ'
>>> '\U0001F60A'
'😊'
>>> '\N{Cat}'
'🐈'