Python和C的字符串

在Python 3 中,bytes单独作为一个类型,不再和str类型混在一起。关于字符串和字节,我想先回顾下C/C++

在C/C++中,字符串是由char数组构成,每个元素是一个Char数据结构,数组的结尾是'\0'空字符。

  1. char是默认的unsigned的整型数据, 用于存储英文字符和小的整数(取值是0-255)。
  2. ASCII是char的子集,因此char很好存储英文字母, 满足存储英文字符的需求。

在C/C++中,int是整型的数据结构。而Python的int被设计成类,它有自己的属性和方法。这是Python和C/C++截然不同的地方。

同样在C/C++中的char整型,到了Python中,相应的是bytes类。我们可以这样说:Python中的Bytes类,本质上是C/C++中的char数组。

如下是几个demo。

1. 对比bytes和string

对于字节:

my_bytes = b'Python'
print(type(my_bytes))
print(my_bytes[0])
print(my_bytes[0] + 1) # 结果:
<class 'bytes'>
80
81

对于字符串:

my_string = 'Python'
print(type(my_string))
print(my_string[0])
print(my_string[0] + 'y') # 结果:
<class 'str'>
P
Py

结论:

  1. 在Python中,bytes和string都是序列类型,它们允许分片操作。
  2. 但是bytes中的+号是运算符,而string中+号是连接符。

从这个意义上,Python仍然保持着与C的一致性。在C中,bytes是char数组,string是以空字符结尾的char数组。+号对于前者是运算,对于后者是连接。

2. 如何用bytes表示125-255的整数型

a_num = b'\xff'
print(type(a_num[0]))
print(a_num[0]) # 结果:
<class 'int'>
255

结论:bytes类是序列,其中每个元素都是int类

字符串----encode--> 转到特定编码的的字节, 字节------decode--> 原生的字符串

字符串有decode方法,而字节是有encode方法。

3.关于decode和encode

str对象有encode方法,而bytes对象有decode方法,如何理解呢?

字符串(以某种编码存储的)----encode--> 转成特定编码的的字节,

字节(被编码的字节)------decode--> 原生的字符串。

name = '你好'                         # 此时"你好"是UTF-8编码存储的字符串
nameBytes = name.encode('utf-16') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr) # 结果:
你好
255 254 96
你好
  1. UTF-8编码的字节序列,总是以0xEF 0xBB开头,所以打印前两位出来是的:228,189
  2. UTF-16编码的字节序列,总是以0xEF 0xBB开头,所以打印前两位出来是的:255,254

因为一种格式编码的字符串可以被转换成其它的编码,所谓encode,本质就是编码的转换。python3中字符串默认是UTF-8编码格式,你可以把它encode成其它格式进行存储,当然,如果你要读取它,必须要以相应的编码格式去解码。

做个游戏

name = '你好'
nameBytes = name.encode('utf-8') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr) # 结果:
你好
228 189 160
뷤붥

我把中文“你好”用utf-8编码,然后用utf-16去解码,得到韩文--- 뷤붥

Python的bytes和str的更多相关文章

  1. python中bytes和str

    1.python中bytes和str Python3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分 (1)Python 3.0使用文本和(二进制) ...

  2. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  3. Python 3中的str和bytes类型

    Python3 中的str和bytes类型 Python3最重要的新特性之一是:对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Pyt ...

  4. python编程之字符bytes转换str问题

    之前学习bytes转换str的时候,场景比较简单,这次是python中使用subprocess模块输出Linux下的执行命令的结果,默认是bytes类型,因此输出的结果并不是我们想要的,bytes的输 ...

  5. python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  6. Effective Python(3)- 了解 bytes 与 str 的区别

    Python 有两种类型可以表示字符序列 bytes:实例包含的是原始数据,即 8 位的无符号值(通常按照 ASCII 编码标准来显示) str:实例包含的是 Unicode 码点(code poin ...

  7. python bytes和str之间的转换

    1 # bytes object 2 b = b"example" 3 4 # str object 5 s = "example" 6 7 # str to ...

  8. python中bytes类型转换为str类型

    使用的原因:基于URL解析报文的时候,要使用str类型,但是提供的确实bytes类型,报错: TypeError: must be str, not bytes 所以就把bytes类型转换为str类型 ...

  9. #utf-8与gbk转换 #bytes 和str 的转换

    #!/user/bin/env python # -*- coding:utf-8 -*- temp = "连接" temp_unicode = temp.decode('utf- ...

随机推荐

  1. 用Python自动办公,做职场高手(完结)

    教程目录: ┣━07.S2 Word自动化处理,又快又好做文档┃  ┣━36 本章介绍┣━08.[Word]S2-1 轻松用Python快速生成Word文档┃  ┣━45.[真实案例]S2-1-3 批 ...

  2. KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)

    http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降 ...

  3. 异常值检测方法(Z-score,DBSCAN,孤立森林)

     机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&sh ...

  4. PMP 1~3章错题总结

    工作到了一定的年限,都或多或少想了解管理的知识,PMP是国际认证的一项考试,招聘要求上也有提及. 不需要报名培训班,万能的某宝即可解决报名.PDU.学习资料的问题,但3900的考试费还是免不了的,为了 ...

  5. Docker是什么?

    Docker是什么? Docker是一个虚拟环境容器,可以将你的环境.代码.配置文件等一并打包到这个容器中,并发布和应用到任意平台中.比如,你在本地部署了git,jenkins等,可以将其与插件一并打 ...

  6. 【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

    [嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )     一. 内存 ...

  7. nginx使用与配置入门指南

    这是一篇关于nginx使用与配置的入门指南,但不包括nginx的编译与安装.我假定你知晓如何安装nginx.对大多数Linux系统来说,nginx都已经存在于它们的软件包里,直接使用系统提供的软件管理 ...

  8. haproxy转发真实IP给web

    1.在haproxy.cfg中加入下面参数. option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,必须要放在listen模块下 2.如 ...

  9. Vue生命周期 以及应用场景

    首先一张官方图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  10. 【笔试题】Overloading in Java

    笔试题 Overloading in Java Question 1 以下程序的输出结果为( ). public class Test { public int getData() { return ...