Python学习 Day 06

再谈编码

  • 1. 小数据池
  • 2. is和==的区别
  • 3. 编码的问题

1.小数据池

 (1) 代码块的概念:

      Python程序是由代码块构成,一个代码块的文本作为Python程序的执行单元.

      代码块:一个模块,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块,eval()和exe()执行的时候也是一个代                   码块.

       命令行:我们在控制台CMD中输入python进入的就是python的command模式. 在这⾥里里也可以写 python的程序. 

                   ⼀个command命令就是⼀个python代码块.(在控制台中每一行都是一个代码块)

  (2) is和==的区别

      内存地址 id():

       通过id()我们可以查看到⼀个变量表示的值在内存中的地址.   

a = 1000
print(id(a))  # 内存的开辟是由解释器来完成的.

      is和==

扫描二维码关注公众号,回复: 3121145 查看本文章

         == 判断左右两端的值是否相等. 是不是⼀致.           

     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中, 默认会把数字, 字符串, 布尔值进行缓存

关于缓存:

小数据池.:一种数据缓存机制. 也被称为驻留留机制.各大编程语言中都有类似的东西. 在网上 搜索常量量池,小数据池指的都是同⼀一个内容. 小数据池只针对: 整数, 字符串, 布尔值. 其他的数据类型不存在驻留机制.当我们在控制台的时候, 代码块与代码块之间的规则:   

在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. 编码的问题

  • ASCII: 8bit 1byte 英文字母 数字 特殊字符.
  • GBK: 16bit 2byte 主要是存中文。日文, 韩文, 繁字体。 中文的特殊字符 中国 (abcd)
  •  UNICODE: 32bit 4byte4. UTF-8: 可变长度的unicode

       英文: 8bit, 1byte     欧洲文字:16bit, 2byte     中文: 24bit, 3byte (abcd)

         GBK和UTF-8不能直接互换

   (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'\xe5\x88\x98\xe4\xbc\x9f\xe5\xbe\x88\xe7\x9a\xae'

    (3)解码: 

abc = b'\xe5\x88\x98\xe4\xbc\x9f\xe5\xbe\x88\xe7\x9a\xaf'
s = abc.decode("UTF-8") # 解码。 用什么编码, 就用什么解码
print(s)
s = "周星驰"
print(s.encode("GBK"))
bs = b'\xd6\xdc\xd0\xc7\xb3\xdb'
print(bs.decode("GBK")) # GBK的编码不能用UTF-8解码
# GBK的编码. 把这句话变成UTF-8
bs =b'\xd6\xdc\xd0\xc7\xb3\xdb'
# 先解码
s = bs.decode("GBK")
# 重新编码
bs2 = s.encode("UTF-8")
print(bs2)

Homework

        

猜你喜欢

转载自www.cnblogs.com/wcx666/p/9621249.html