首页 > 开发 > Python > 正文

Python bytes()函数

2023-04-24 19:21:39
字体:
来源:转载
供稿:网友

Python bytes()函数返回一个整型数字序列的字节对象,整型数字的取值范围为:0<=x<256.

bytes()函数的语法格式

官方参考文档给出的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()函数产生的字节数组是可变的。

返回值

该函数返回一个不可变的字节对象。

Python bytes()函数

bytes()函数使用示例

下面使用几个例子来说明bytes()函数的具体使用方法。

1、不带任何参数的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中的运行情况如下图所示:

Python bytes()不带参数的情况 

从上面的输出结果中可以看出,在不给任何参数时,bytes()函数输出空的字节对象(前面以'b'开始)。

但是不带参数不等于None,当给定None作为参数时,将引发TypeError错误:无法将NoneType对象转换为字节。

2、传递字符串参数

当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()函数的不可变版本。

3、使用整数作为参数

source参数为整型数时,bytes()函数产生指定长度的null字节对象。

b = bytes(5)
print(b)

输出结果:

b'/x00/x00/x00/x00/x00'

4、可迭代对象作为参数

 可迭代对象作为参数时,可迭代对象的元素必须是整型数,否则将引发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

上面这个例子说明,当使用可迭代对象作为参数时,可迭代对象的元素应该是代表对应字符的整型数。

本文(完)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表