数据结构之bytes

本文探讨了Python中的bytes数据结构,从字节的概念、字符编码如ASCII和Unicode,到UTF-8编码的重要性。强调了UTF-8如何在节省空间的同时支持多种语言,以及在处理str和bytes转换时避免乱码的策略。最后介绍了bytes对象的定义及其用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导文

什么是bytes?是字节,数据结构bytes又有何用?什么会诞生bytes这种结构?这种结构如何定义?

字节

天知,地知,你知,我知,何谓无知?计算机根本是电路组成,正负点位表示1和0,因此由1和0组成信息集合,如何按照位数为一组进行提取信息?答案是bytes,将计算机8位作为一组信息,这一组就称之为字节。

金棒有何用

以bytes可以提取信息,这个信息有能代表什么信息呢?就像电报密码本一样,你收到滴滴的信息后,又能代表什么,美国编制ASCII表,中国编制GB2312表等等各国拥有各自的编码表,当用户收到同样一段0和1的组合信息时,用不同的解码表得到不同的信息,因此大小会大乱,因此出现了UNICODE,uniq和code两个单词的叠加,唯一的编码表俗称统一编码表,统一编码表采用两个字节进行编码,利用这两个字节可以将全世界的语言进行编排,因此这样就能达到信息一统天下,天下共知。

字符编码

如:字母A用ASCII编码是十进制的65,二进制的01000001,A的Unicode编码是00000000 01000001,汉子在UNIcode中也是两个字节进行编码,由上可知如果一篇文章用英文来写,在计算机中岂不是要浪费一半空间?此问题上升到很为严重的问题,空间怎么可能让浪费一半空间呢?空间浪费一半同样意味着网络传输也要浪费一半,当今世界可是无法承受此种无奈?
因此经过考虑如即能保留ASCII码编码又能保持Unicode编码呢?因此想出了UTF-8的编码,也就是说在UTF-8的编码规则中能用ASCII表达含义的继续延用ASCII的编码规则,至于表达其他国家的语言则将unicode转化为UTF-8的规则,这样就有效的实现了空间不浪费,不同国家语言又能表示清除的规则,何乐而不为呢?但是不幸的是unicode转为UTF-8时,中文又多了一个字节,中文用3个字节才能表示清楚,甚至有些特殊的字需要4-6个字节,如陕西美食biangbiang面中的biangbiang的汉子就没有被收录,在电脑上无法打印。
当然还有好处是之前采用ASCII编码的软件通常用UTF-8的软件依然可以打开使用,并不会产生乱码。
UTF-8工作模式:通常在内存里编码为unicode,但是在保存至电脑或着在网络传输时采用UTF-8的编码规则。
这里写图片描述
因此在操作字符串时,我们经常遇到str和bytes的互相转换,为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于python源代码也是一个文本文件,所以当你的源代码中包含中文的时候,在保存代码时,就需要务必指定保存为UTF-8编码,当python解释器读取源代码时,为了让它按照UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/python
#-*- coding: UTF-8 -*-

字节结构类型

如上通过导文及编码可知bytes的重要性,通过bytes进行将数据读取到内存等等一系列操作,那么bytes如何定义?又有什么特性呢?
bytes()
函数描述
Return a new “bytes” object, which is an immutable sequence of integers in the range 0 <= x < 256. bytes is an immutable version of bytearray – it has the same non-mutating methods and the same indexing and slicing behavior
返回一个bytes对象,是一个不可变的整型序列,整型范围是0至256,它是bytearray的一个不可变的版本,拥有和非可变的的方法、索引和切片的动作
函数语法
class bytes([source[, encoding[, errors]]])
函数参数

  • 参数source为空时,返回一个空的bytes
#!/bin/python3
#-*- coding: UTF-8 -*-
print(bytes())
运行结果:
b''
  • 参数source为整数时,返回一个长度为source的初始化为bytes,用0来填充
#!/bin/python3
#-*- coding: UTF-8 -*-
print(bytes(5))
运行结果:
b'\x00\x00\x00\x00\x00'
  • 参数source为字符串时,返回一个指定encoding编码的bytes
#!/bin/python3
#-*- coding: UTF-8 -*-
#预期任然不变,因为ASCII编码经过UTF-8编码后任然不变,ASCII编码的延用
print(bytes('are you ok?',"UTF-8"))
运行结果:
b'are you ok?'
  • 参数source为可迭代类型,则元素必须为[0,255]中的整数
#!/bin/python3
#-*- coding: UTF-8 -*-
print(bytes(range(5)))
运行结果:
b'\x00\x01\x02\x03\x04'
  • 如果source为与buffer接口一致的对象,则此对象也可以被用于初始化bytearray
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值