首页 > 技术文章 > 04 Python序列类型之字符串详解

Nonstopcoding 2019-07-14 08:55 原文

字符串(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'
'

推荐阅读