Python基础——几个小知识点
程序员文章站
2022-05-28 10:20:44
...
1. 字符编码
- 1个字节能表示的最大的整数就是255(二进制11111111=十进制255)
- 2个字节可以表示的最大整数是65535
- 4个字节可以表示的最大整数是4294967295
编码类型 | 内容 | 问题 |
---|---|---|
ASCII | 目前为止共定义了128个字符,包括大小写字母、数字和一些符号,如A-65,z-122(图1) | 无法处理其他国家语言 |
GB2312 | 中文编码 | 各国有各国标准,在多语言混合文本中,会有冲突,显示乱码 |
Unicode | 将所有语言统一到一套编码,最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节) | 如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上不划算 |
将Unicode编码转化为“可变长编码”的UTF-8编码 | UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节 | 这样一来,如果传输的文本包含大量英文字符,用UTF-8编码就能节省空间(图2) |
总结: 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
ord() 和 chr()
# ord()获取字符的整数表示,chr()把编码转换为对应字符
print(ord('A'))
print(ord('中'))
print(chr(66))
print(chr(25991))
>>> 65
>>> 20013
>>> B
>>> 文
encode() 和 decode()
Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
# python中对 bytes 类型的数据,用带 b前缀的单引号/双引号表示
# 注意区分‘ABC’和 b'ABC',前者为 str,虽然内容显示相同,但后者 bytes 的每个字符都只占用一个字节
# 1.以 Unicode 表示的 str 通过encode()方法可以编码为指定的 bytes
print('ABC'.encode('ascii'))
print('中文'.encode('utf-8'))
>>> b'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'
# 2.要把 bytes 变为 str ,就需要用 decode() 方法
print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')) # 忽略小部分无效字节
>>> ABC
>>> 中文
>>> 中
2. list 和 tuple
- list 列表是一种有序集合,可以随时添加和删除其中元素
- tuple 元组是一种有序列表,但是tuple一旦初始化就不能修改,安全性更高
# '可变的'tuple
t = ('a', 'b', ['A','B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)
>>> ('a', 'b', ['X', 'Y'])
3. dict 和 list
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢
- 需要占用大量的内存,内存浪费多
list相反:
- 查找和插入的时间随着元素的增加而增加
- 占用空间小,浪费内存很少
注意: dict的key必须是不可变对象,这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法。
hash()
- 作用:将大的文件映射成一个小字符串,但hash算法不可逆,即不能通过hash值逆向推出key的值,因为可能存在不同key值对应相同的hash值
- 可哈希的数据类型:不可变的数据结构(字符串str、元组tuple、对象集objects)
- 不可哈希的数据类型:可变的数据结构 (字典dict,列表list,集合set)
(待更新)