Day-06 小数据池 再谈编码

一、小数据池
在说小数据池之前. 我们先看一个概念. 什么是代码块:
代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块
小数据池的作用:为了快速的创建字符串对象, 可以减少内存的浪费
用缓存的前提:数据可以被共享。不可变.

1.当我们在控制台的时候, 代码块与代码块之间的规则:
    1. 数字:  -5 ~ 256之间的整数会被缓存
    2. 字符串:
        长度小于等于1 会默认缓存
        长度大于1 如果字符串中只有数字, 字母下换线缓存
        乘法得到的字符串:
            1. 如果乘数是1. 和上面两个方案一致
            2. 乘数不是1. 最终长度不能超过20
        手动指定缓存  from sys import intern intern()制定缓存的内容
     3. 布尔值
2. py文件里. 一个代码块内部. 只会缓存int, str, bool 也有自己的小数据池。 缓存的范围会比外面的代码块的数据池要大
      1. 数字。都会缓存。 运算的结果不缓存(-5~256 会缓存)
      2. 字符串。 默认的字符串都缓存. 如果有乘法。 遵循上方的结论
      3. 布尔值。 默认缓存


二、is和==的区别
id() 查看变量的内存地址
is 判断内存地址是否一致
== 判断内容是否一致

三、再谈编码
1. ASCII: 8bit 1byte 英文字母 数字 特殊字符.
2. GBK: 16bit 2byte 主要是存中文。日文, 韩文, 繁字体。 中文的特殊字符  中国 (abcd)
3. UNICODE: 32bit 4byte
4. UTF-8: 可变长度的unicode
    英文: 8bit, 1byte
    欧洲文字:16bit, 2byte
    中文: 24bit, 3byte  (abcd)
GBK和UTF-8不能直接互换
转码


python2中默认使用的是ASCII码. 所以不支持中文. 如果需要在Python2中更改编码.需要在文件的开始编写:
# -*- encoding:utf-8 -*-
    在python3中unicode是可以使用的。 默认用的就是Unicode. 代码用utf-8来存储
bytes的表现形式:
1. 英文 b'alex' 英文的表现形式和字符串没什么两样
2. 中文 b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式
字符串在传输时转化成bytes ==> encode(字符集)来完成
复制代码
 1 s = "alex"
 2 print(s.encode("utf-8")) # 将字符串编码成UTF-8
 3 print(s.encode("GBK")) # 将字符串编码成GBK
 4 结果:
 5 b'alex'
 6 b'alex'
 7 s = "中"
 8 print(s.encode("UTF-8")) # 中文编码成UTF-8
 9 print(s.encode("GBK")) # 中文编码成GBK
10 结果:
11 b'\xe4\xb8\xad'
12 b'\xd6\xd0'
复制代码
  记住: 英文编码之后的结果和源字符串一致. 中文编码之后的结果根据编码的不同. 编码结果也不同. 我们能看到. 一个中文的UTF-8编码是3个字节. 一个GBK的中文编码是2个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候我们python是保存和存储的bytes类型. 那么在对方接收的时候. 也是接收的bytes类型的数据. 我们可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串:
1 s = "我叫李嘉诚"
2 print(s.encode("utf-8")) #
3 b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'
4 print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解码
 
  
  编码和解码的时候都需要制定编码格式.
复制代码
1 s = "我是文字"
2 bs = s.encode("GBK") # 我们这样可以获取到GBK的⽂字
3 # 把GBK转换成UTF-8
4 # 首先要把GBK转换成unicode. 也就是需要解码
5 s = bs.decode("GBK") # 解码
6 # 然后需要进行重新编码成UTF-8
7 bss = s.encode("UTF-8") # 重新编码
8 print(bss)
复制代码
一、小数据池
在说小数据池之前. 我们先看一个概念. 什么是代码块:
代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块
小数据池的作用:为了快速的创建字符串对象, 可以减少内存的浪费
用缓存的前提:数据可以被共享。不可变.

1.当我们在控制台的时候, 代码块与代码块之间的规则:
    1. 数字:  -5 ~ 256之间的整数会被缓存
    2. 字符串:
        长度小于等于1 会默认缓存
        长度大于1 如果字符串中只有数字, 字母下换线缓存
        乘法得到的字符串:
            1. 如果乘数是1. 和上面两个方案一致
            2. 乘数不是1. 最终长度不能超过20
        手动指定缓存  from sys import intern intern()制定缓存的内容
     3. 布尔值
2. py文件里. 一个代码块内部. 只会缓存int, str, bool 也有自己的小数据池。 缓存的范围会比外面的代码块的数据池要大
      1. 数字。都会缓存。 运算的结果不缓存(-5~256 会缓存)
      2. 字符串。 默认的字符串都缓存. 如果有乘法。 遵循上方的结论
      3. 布尔值。 默认缓存


二、is和==的区别
id() 查看变量的内存地址
is 判断内存地址是否一致
== 判断内容是否一致

三、再谈编码
1. ASCII: 8bit 1byte 英文字母 数字 特殊字符.
2. GBK: 16bit 2byte 主要是存中文。日文, 韩文, 繁字体。 中文的特殊字符  中国 (abcd)
3. UNICODE: 32bit 4byte
4. UTF-8: 可变长度的unicode
    英文: 8bit, 1byte
    欧洲文字:16bit, 2byte
    中文: 24bit, 3byte  (abcd)
GBK和UTF-8不能直接互换
转码


python2中默认使用的是ASCII码. 所以不支持中文. 如果需要在Python2中更改编码.需要在文件的开始编写:
# -*- encoding:utf-8 -*-
    在python3中unicode是可以使用的。 默认用的就是Unicode. 代码用utf-8来存储
bytes的表现形式:
1. 英文 b'alex' 英文的表现形式和字符串没什么两样
2. 中文 b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式
字符串在传输时转化成bytes ==> encode(字符集)来完成
复制代码
 1 s = "alex"
 2 print(s.encode("utf-8")) # 将字符串编码成UTF-8
 3 print(s.encode("GBK")) # 将字符串编码成GBK
 4 结果:
 5 b'alex'
 6 b'alex'
 7 s = "中"
 8 print(s.encode("UTF-8")) # 中文编码成UTF-8
 9 print(s.encode("GBK")) # 中文编码成GBK
10 结果:
11 b'\xe4\xb8\xad'
12 b'\xd6\xd0'
复制代码
  记住: 英文编码之后的结果和源字符串一致. 中文编码之后的结果根据编码的不同. 编码结果也不同. 我们能看到. 一个中文的UTF-8编码是3个字节. 一个GBK的中文编码是2个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候我们python是保存和存储的bytes类型. 那么在对方接收的时候. 也是接收的bytes类型的数据. 我们可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串:
1 s = "我叫李嘉诚"
2 print(s.encode("utf-8")) #
3 b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'
4 print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解码
 
  编码和解码的时候都需要制定编码格式.
复制代码
1 s = "我是文字"
2 bs = s.encode("GBK") # 我们这样可以获取到GBK的⽂字
3 # 把GBK转换成UTF-8
4 # 首先要把GBK转换成unicode. 也就是需要解码
5 s = bs.decode("GBK") # 解码
6 # 然后需要进行重新编码成UTF-8
7 bss = s.encode("UTF-8") # 重新编码
8 print(bss)
复制代码

猜你喜欢

转载自www.cnblogs.com/xiaomai-rhce/p/10334434.html
今日推荐