• Python的bytes和str


    Python和C的字符串

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

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

    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去解码,得到韩文--- 뷤�붥

  • 相关阅读:
    Makefile学习(二)条件判断和内嵌函数
    Makefile学习(一)变量
    ZigBee心电传输(二)
    ZigBee心电传输(一)
    Zedboard甲诊opencv图像处理(四)
    Zedboard甲诊opencv图像处理(三)
    Zedboard甲诊opencv图像处理(二)
    linux的几个彩蛋
    Git
    lua
  • 原文地址:https://www.cnblogs.com/crb912/p/9150484.html
Copyright © 2020-2023  润新知