Python bytes()函数返回一个整型数字序列的字节对象,整型数字的取值范围为:0<=x<256.
官方参考文档给出的bytes()函数语法格式如下:
class bytes([source[, encoding[, errors]]])
该函数有三个可选参数:
source 可选参数,用于初始化字节对象;
encoding 可选参数,当source为字符串类型时使用该参数指明编码格式,Python使用str.encode()函数将字符串转换为字节。
errors 当source为字符串类型,并使用encoding指定的编码方式编码失败时给出的错误信息。
在使用bytes()函数时,要注意以下几条规则:
(1)当没有传递任何参数时,bytes()函数返回空的字节对象;
(2)当source为整型数字时,bytes()函数产生长度为source的null值字节数对象数组;
(3)当source为字符串时,encoding参数是必选参数,以让bytes()函数按照encoding指定的编码方式产生字节对象;
(4)如果source是可迭代对象时,如列表、元组等,可迭代对象元素必须是0到255的整型数。
从上面的描述中可以看出,bytes()函数与前面介绍的bytearray()函数非常相似。其不同之处在于,bytes()产生的字节对象是不可变的,而bytearray()函数产生的字节数组是可变的。
该函数返回一个不可变的字节对象。
下面使用几个例子来说明bytes()函数的具体使用方法。
b = bytes()
print(b)
n = bytes(None)
print(n)
输出结果如下:
b''
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
n = bytes(None)
TypeError: cannot convert 'NoneType' object to bytes
在Python3.8.2 Shell中的运行情况如下图所示:
从上面的输出结果中可以看出,在不给任何参数时,bytes()函数输出空的字节对象(前面以'b'开始)。
但是不带参数不等于None,当给定None作为参数时,将引发TypeError错误:无法将NoneType对象转换为字节。
当source为字符串类型时,bytes函数需同时指定encoding参数。
str1 = "Hello World!"
print(bytes(str1,"utf-8"))
print(bytes(str1, "ASCII"))
str2 = "关注公众号【优雅的代码】"
print(bytes(str2, "utf-8"))
print(bytes(str2, "ASCII"))
输出结果如下:
b'Hello World!'
b'Hello World!'
b'/xe5/x85/xb3/xe6/xb3/xa8/xe5/x85/xac/xe4/xbc/x97/xe5/x8f/xb7/xe3/x80/x90/xe4/xbc/x98/xe9/x9b/x85/xe7/x9a/x84/xe4/xbb/xa3/xe7/xa0/x81/xe3/x80/x91'
Traceback (most recent call last):
File "D:/PY/pythonbytes.py", line 7, in <module>
print(bytes(str2, "ASCII"))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
因为ASCII的编码范围是0~127,所以对汉字指定ASCII编码格式时会报错:UnicodeEncodeError .
下面再看另外一个例子:
str3 = "abcd"
res = bytes(str3,"utf-8")
print("res=",res)
res[1] = 66
print(res)
输出结果:
res= b'abcd'
Traceback (most recent call last):
File "D:/PY/pythonbytes.py", line 4, in <module>
res[1] = 66
TypeError: 'bytes' object does not support item assignment
上面这个例子说明bytes()函数产生的字节对象是不可变的,所以可以认为bytes()函数是bytearray()函数的不可变版本。
source参数为整型数时,bytes()函数产生指定长度的null字节对象。
b = bytes(5)
print(b)
输出结果:
b'/x00/x00/x00/x00/x00'
可迭代对象作为参数时,可迭代对象的元素必须是整型数,否则将引发TypeError错误。
b1 = bytes([65,66,67])
print(b1)
b2 = bytes([48,49,50])
print(b2)
输出结果:
b'ABC'
b'012'
下面再看另外一个例子:
b = bytes(['A','B','C'])
print(b)
输出结果:
Traceback (most recent call last):
File "D:/PY/pythonbytes.py", line 1, in <module>
b = bytes(['A','B','C'])
TypeError: 'str' object cannot be interpreted as an integer
上面这个例子说明,当使用可迭代对象作为参数时,可迭代对象的元素应该是代表对应字符的整型数。
本文(完)
新闻热点
疑难解答