再谈编码
- 1.代码块的概述
- 2. is和==的区别
- 3. 编码的问题
1.小数据池
1.1代码块的概念:
- Python程序是由代码块构成,一个代码块的文本作为Python程序的执行单元.
- 代码块:一个模块,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块,eval()和exe()执行的时候也是一个代码块.
- 命令行:我们在控制台CMD中输入python进入的就是python的command模式. 在这里也可以写 python的程序.⼀个command命令就是⼀个python代码块.(在控制台中每一行都是一个代码块)
1.2is和==的区别
(1)内存地址 id():
通过id()我们可以查看到⼀个变量表示的值在内存中的地址.
a = 1000 print(id(a)) # 内存的开辟是由解释器来完成的.
(2)is和==
- == 判断左右两端的值是否相等. 是不是⼀致.
- is 判断左右两端内容的内存地址是否⼀致. 如果返回True, 那可以确定这两个变量使 用的是同⼀个对象
lst1 = [1,2,3] lst2 = [1,2,3] print(lst1 == lst2) # 长得一样 #True print(lst1 is lst2) # 不是同一个对象 #False
a = "alex" b = "alex" print(a == b) print(a is b) #在python中, 默认会把数字, 字符串, 布尔值进行缓存
(3)关于缓存:
小数据池.:一种数据缓存机制. 也被称为驻留留机制.各大编程语言中都有类似的东西. 在网上 搜索常量池,小数据池指的都是同⼀个内容. 小数据池只针对: 整数, 字符串, 布尔值. 其他的数据类型不存在驻留机制.当我们在控制台的时候代码块与代码块之间的规则:
在python中对-5到256之间的整数会被驻留在内存中. 将一定规则的字符串缓存. 在使用的时候, 内存中只会创建一个该数据的对象. 保存在小数据池中. 当使用的时候直接从小数据池中获取对象的内存引用. 而不需要创建一个新的数据. 这样会节省更多的内存区域.
- 优点: 能够提高⼀些字符串, 整数的处理速度. 省略的创建对象的过程.
- 缺点: 在'池'中创建或者插入新的内容会花费更更多的时间.
数字:
- -5~256是会被加到小数据池中的. 每次使用都是同⼀一个对象.
字符串:
- 1. 如果字符串串的长度是0或者1, 都会默认进⾏行行缓存
- 2. 字符串长度⼤大于1, 但是字符串串中只包含字母, 数字, 下划线时才会缓存
- 3. 用乘法的到的字符串. ①. 乘数为1, 仅包含数字, 字母, 下划线时会被缓存. 如果包含其他字符, 而⻓长度<=1 也会被驻存, ②. 乘数大于1 . 仅包含数字, 字母, 下划 线这个时候会被缓存. 但字符串长度不能大于20
- 4. 指定驻留. 我们可以通过sys模块中的intern()函数来指定要驻留留的内容,from sys import intern intern()制定缓存的内容
在py文件里
一个代码块内部. 只会缓存int, str, bool 也有自己的小数据池。 缓存的范围会比外面的代码块的数据池要大
- 数字。都会缓存。 运算的结果不缓存(-5~256 会缓存)
- 字符串。 默认的字符串都缓存. 如果有乘法。 遵循上方的结论
- 布尔值。 默认缓存
3. 编码的问题
(1) 相关概述
- 位(bit) 字节(byte)
- ASCII: 8bit 1byte 英文字母 数字 特殊字符.
- GBK: 16bit 2byte 主要是存中文。日文, 韩文, 繁字体。 中文的特殊字符 中国 (abcd)
- UNICODE: 32bit 4byte4. UTF-8: 可变长度的unicode
- 英文: 8bit, 1byte 欧洲文字:16bit, 2byte 中文: 24bit, 3byte (abcd)
- GBK和UTF-8不能直接互换
另外: 位与字节的关系
1字节 = 8 位
位(bit),数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,
一个位就代表一个0或1(即一个二进制),二进制是构成存储器的最小单位,每8个位(bit,简写为b)组成一个字节(Byte,简写为B),
字节是最小一级的信息单位
(1)转码
- 在python2里面. 默认的编码是ASCII
- 在python3中unicode是可以使用的。 默认用的就是Unicode. 代码用utf-8来存储
(2) 编码 :把unicode 转换成utf-8
s = "刘伟很皮" # 12个字节 abc = s.encode("UTF-8") # encode之后的结果是bytes类型 依然是原来的字符串 print(abc) # b'数据' #b'xe5x88x98xe4xbcx9fxe5xbex88xe7x9axae'
(3)解码:
abc = b'xe5x88x98xe4xbcx9fxe5xbex88xe7x9axaf' s = abc.decode("UTF-8") # 解码。 用什么编码, 就用什么解码 print(s)
s = "周星驰" print(s.encode("GBK")) bs = b'xd6xdcxd0xc7xb3xdb' print(bs.decode("GBK")) # GBK的编码不能用UTF-8解码
# GBK的编码. 把这句话变成UTF-8 bs =b'xd6xdcxd0xc7xb3xdb' # 先解码 s = bs.decode("GBK") # 重新编码 bs2 = s.encode("UTF-8") print(bs2)