错误: 句法分析器6行里不能有多字节字符_第三章(第6节):list类型

在前面基本数据类型一节我们学过字符串类型,字符串类型严格意义上来说不属于基本数据类型, 因为字符串是由多个单字符类型的数据组成的复合类型。

但 Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用,这个和其它语言不同, Python 语言内置字符串类型,字符串是Python中最常用的数据类型之一。

我们本节课再次深入学习一下字符串的特点和函数,以及编码格式。

字符串元素的访问方式

  • 字符串是有序集合,有序集合并不是集合里面的数据是有序的, 有序集合的意思是可以通过下标访问的集合。我们可以通过下标访问字符串,注意第一个元素是从下标 0 开始,越界访问 Python 解释器会报异常错误。
strone = "老鸟Python"
print(strone[0])
print(strone[100])  # 越界访问,会报异常
  • 字符串是个常量,无论通过何种运算,都不会修改字符串本身的值, 我们不能通过该变量的索引修改它所指向的字符串内的字符, 但我们可以改变该变量指向的字符串。
strone = "老鸟Python"
strone[0] = "H"         # 错误,不可以修改字符串本身的值
strone = "Hello World"  # 正确,可以修改变量 strone 的指向
print(strone)

字符串运算

  • 字符串支持一系列的运算,但遵守一定的规则,我们列举出常用的字符串运算,如下表格。

14e4f08ed480d329ae5ac62fa79fe668.png
  • 重要的事情再说一遍,无论什么运算符操作字符串,都不会修改字符串本身的值。
strone = "Hello"
newstr = strone[0:3]  # 返回索引 0 到 3(不包含3)的子串
print(strone)
print(newstr)

操作字符串常用的函数

  • 操作字符串的函数,有字符串本身内置的函数,也有非内置的函数, 这些函数可以对字符串进行一系列的操作,下面表格是字符串常用的一些函数。

1c510a5b20d80ab327a7092ae72ed739.png
  • 重要的事情说三遍,无论什么函数操作字符串,都不会修改字符串本身的值。
strone = "老鸟Python"
newstr = strone.replace("Python", "Hello")
print(strone)
print(newstr)

strtwo = "Hello World"
lowerstr = strtwo.lower()
print(strtwo)
print(lowerstr)

strthree = "Bird Python"
upperstr = strthree.lower()
print(strthree)
print(upperstr) 

转义字符

  • 在编程语言里,有很多特殊字符,它们起着各种各样的作用。 有些特殊字符没有办法用普通字符表示,需要进行转义。 python用反斜杠 转义字符,下表列举了一些常用的需要转义的字符。

c28b4055994e8e42ae388fb53c50ba65.png
  • 注意:Python 中可以用 r 来禁止字符转义,试一试下面的代码。

strone = r"Hterlnl"o'"print(strone)

字符编码

  • 由于计算机是美国人发明的,因此,最早只有 127 个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为 ASCII 编码(范围为 0~127),比如字符 A 的编码是 65,字符 1 的编码是 49。我们知道 1 个字节可以表示的范围是 0~255,所以我们只需要 1 个字节既可以表示出来所有的 ASCII 编码。
strone = "A"
print (ord(strone))  # ASCII 值为 65;用 1 个字节的 2 进制表示为:01000001

strtwo = "1"
print (ord(strtwo))  # ASCII 值为 33;用 1 个字节的 2 进制表示为:00100001
  • 但是要处理中文用 1 个字节显然是不够的,至少需要 2 个字节, 用两个字节表示一个字符(包括英文,数字,可见字符等)的编码,我们成为 UNICODE 编码。我们知道 2 个字节的表示的范围为 0~65535,注意我们在字符串前面加上 u 来告诉计算机用 UNICODE 编码方式存储字符串。
strone = u"A"
print (ord(strone))  # UNICODE 值为 65;用 2 个字节的 2 进制表示为:00000000 01000001

strtwo = u"牛"
print (ord(strtwo))  # UNICODE 值为 29275;用 2 个字节的 2 进制表示为:01110010 01011011
  • 我们来分析一下上面的例子:汉字“牛”对应的十进制为 29275, 显然已经超出了 ASCII 编码的范围,所以用 1 个字节无法表示,我们只能用两个字节的 UNICODE 编码方式,对应的二进制为 01110010 01011011。 字母 A 对应的十进制为 65,可以使用 1 个字节的 ASCII 编码方式,对应的二进制为 01000001,当然我们也可以使用 2 个字节的 UNICODE 编码方式,对应的进制为 00000000 01000001。我们来考虑一个问题,如果我们写的字符串文本只有极个别中文,而大部分都是英文, 因为有中文的存在,我们无法使用 ASCII 编码方式进行统一编码, 只能使用 UNICODE 编码方式,而采用 UNICODE 编码比 ASCII 编码需要多一倍的存储空间,在存储和传输上就十分不划算,如果有一种编码可以智能的对文本中的英文采用 ASCII 编码方式,对中文采用 UNICODE 编码方式那该多好啊,有的,就是 UTF-8 编码。 UTF-8 编码把一个 UNICODE 字符根据不同的数字大小编码成 1-6 个字节,常用的英文字符、数字字符、英文符合字符等都被编码成 1 个字节,一般汉字通常是 3 个字节,只有很生僻的字符才会被编码成 4-6 个字节。在 Python 3 中,字符串前面什么都不要加,默认就是采用 UTF-8 编码;如果加上 u 就是 UNICODE 编码。
strone = "you"        # UTF-8 编码,共占用 3 个字节(和 ASCII 编码一样 1 个英文字符 1 个字节)
strtwo = "牛掰"       # UTF-8 编码,共占用 6 个字节(1 个中文字符通常是 3 个字节)
strthree = "you牛掰"  # UTF-8 编码,共占用 9 个字节(1 个英文字符 1 个字节,1 个中文字符通常是 3 个字节)

strfour = u"you"      # UNICODE 编码,共占用 6 个字节(1 个英文字符 2 个字节)
strfive = u"牛掰"     # UNICODE 编码,共占用 4 个字节(1 个中文字符 2 个字节)
strsix = u"you牛掰"   # UNICODE 编码,共占用 10 个字节(1 个英文字符 2 个字节,1 个中文字符 2 个字节)
  • Python 内置的 len 函数可以计算字符串的长度,但是这个长度是什么意思呢,我们通过查看 len 函数的源码发现,它内部逻辑有个判断:如果计算的字符串是 UNICODE 编码方式,返回字符串所占的字节数除以 2;如果是 UTF-8 编码,字符串里面的非中文字符按字节计算,中文字符除以该种中文字符编码所用的字节数 。
strone = "you"        # UTF-8 编码,共占用 3 个字节(和 ASCII 编码一样 1 个英文字符 1 个字节)
strtwo = "牛掰"       # UTF-8 编码,共占用 6 个字节(1 个中文字符通常是 3 个字节)
strthree = "you牛掰"  # UTF-8 编码,共占用 9 个字节(1 个英文字符 1 个字节,1 个中文字符通常是 3 个字节)
print(len(strone))    # 3(1 + 1 + 1)
print(len(strtwo))    # 2(3 / 3 + 3 / 3)
print(len(strthree))  # 5(1 + 1 + 1 + 3 / 3 + 3 / 3)

strfour = u"you"      # UNICODE 编码,共占用 6 个字节(1 个英文字符 2 个字节)
strfive = u"牛掰"     # UNICODE 编码,共占用 4 个字节(1 个中文字符 2 个字节)
strsix = u"you牛掰"   # UNICODE 编码,共占用 10 个字节(1 个英文字符 2 个字节,1 个中文字符 2 个字节)
print(len(strfour))   # 3
print(len(strfive))   # 2
print(len(strsix))    # 5
  • Python 内置的 encode 函数可以把 UNICODE 编码的字符串转换为 UTF-8 编码;decode 函数可以 UTF-8 编码的字符串转换为 UNICODE 编码。
strone = "you牛掰"
print( type(strone))    # UTF-8 编码
print( len(strone))     # 9
strtwo = strone.decode("utf8")
print( type(strtwo))    # UNICODE 编码
print( len(strtwo))     # 5

strthree = u"you牛掰"
print( type(strthree))  # UNICODE 编码
print( len(strthree))   # 5
strfour = strthree.encode("utf8")
print( type(strfour))   # UTF-8 编码
print( len(strfour))    # 9(UTF-8 编码)

格式化

  • 我们知道 print 函数会把输出的各种类型数据全变成字符串输出到屏幕上, 当其中输出的语句内容有变量的时候,我们需要根据这些变量的类型进行格式化。
name = "如花"
age = 18
print( "%s的年龄是%s" % (name, age))
  • 对应的被格式化的变量类型对应的占位符一般如下表。

fd448393ef3c9fa04b408afbfc8dce1b.png

本节重要知识点

  • 切记字符串本身是不可修改的常量。
  • 熟练掌握常用的字符串的操作函数。
  • 弄明白 len 函数的计算方式。

作业

对于以下代码,运行一下看下结果,想想为什么?

a = "hello"
b = "HEllo"
c = "hello"
d = b.lower()

print((a is c))
print((a is d))

原文链接:

再讲字符串​www.birdpython.com
b9584083bc4fd287f182249ce3e3c68a.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值