day6 代码块 is判断小数据池 编码与解码

总览:
  代码块
  变量的门牌号 id
  小数据池
  is判断语句
  bytes数据类型 与 中文str 英文str 的区别
  编码与解码

#代码块
#python 中真正意义的代码块是什么?
#代码块:一个模块,一个函数,一个类,一个py文件等等都是代码块
#记住:用cmd调用 python解释器 输入的每一行代码 都是一个代码块

#一个等号 = 是赋值语句 在内存中开辟一个地址 这个地址是唯一的 叫做id 也就是门牌号
#然后把相应的数据装入 这个房子内 变量的地址指向 这个id

#两个等号== 比较等号两边运算结果数值的大小

#id门牌号
'''name = 'alex'
print(id(name))
-->602278314816'''

'''name1 = 'alex'
name2 = 'alex'
print(name1 == name2)
-->True'''
#在内存中id是唯一的,如果两个变量指向的值 id相同说明这两个变量指向的是内存中的同一个地址

#分别在pycharm 和 cmd 命令窗口里面运行如下代码
'''i1 = 1000
i2 = 1000
print(id(i1),id(i2))'''

'''
-->pycharm运行的结果如下:135940177744 135940177744
-->pycharm运行的结果如下:404611174192 404612428976
'''
#为什么相同的代码 在cmd运行python 和 pycharm解释器上面运行的结果会不一样?

#python在同一个代码块中 记住是在同一个代码块中
#也就是在同一个模块,同一个函数,同一个类,同一个py文件中
#初始化对象的命令 例如:变量 = 值 把一个值赋给一个变量
#python会将变量与值的对应关系 放到一个字典里面
#如果下面的代码再次遇到 初始化对象 的命令
#会先从上面生成的字典中寻找,如果存在相同的值 直接拿过来用 将已经开辟内存的值 赋给 这个变量
#但是,对于不同的代码跨,比如在cmd命令行运行python 每次输入的命令都是一个代码段
#初始化对象 命令是 python先从 小数据池里面找


#小数据池的概念
#小数据池 也叫做 缓存机制 驻留机制
#对于-5~256的整数,和一定规则的字符串,bool值
#当把这些简单的小数据赋值给变量时不会重新创建对象 而是使用已将创建好的缓存对象
#这个缓存对象就是小数据池
#python中将-5--256的整数 bool值 有一定规则的字母组成的字符串挡在一个容器中,小池子,无论变量名怎么变,
#只要他们的值(在小池子里面)相同 呢么他们指向的就是是同一个内存地址的 在小池子里面的数据

#为什么要这样制作一个小数据池?
#小池子里面的数据都是使用频率 相当高的数据(-5到256的整数 一定规则的字母字符串 bool值)
#需要使用的时候 直接将变量的地址指向 小池子里面的数据地址
#避免繁琐的创建和销毁清理内存 提升效率 节省内存孔空间

#一定规则的字符串 这个规则是什么?
#1字符串的长度为0 或者1
#2字符串的长度>1 但是只含有大小字母 数字 和下划线
#3乘法得到的字符串 *1时 只含有大小字母 数字 和下划线默认驻留
#3乘法得到的字符串 乘数>1时 总长度<=20只含有大小字母 数字 和下划线默认驻留

#驻留机制的时间步长
#non-interned 非驻留字符串 遍历的时间步长o(n) 线性的 随着字符串长度的增加而增加
#interned 驻留字符串 遍历的时间步长o(1) 一次运算耗用的时间

#测试一下用pycharm 创建两个不同代码块 相同数据的内存地址是否相同
def func1():
    i1 = 100 #100在小池里面
    print(id(i1))

def func2():
    i2 = 100 #100在小池里面
    print(id(i2))

func1()
func2()

 #运算结果

1571646720
1571646720


def func1():
    i1 = 1000 #1000不在小池里面
    print(id(i1))

def func2():
    i2 = 1000 #1000不在小池里面
    print(id(i2))

func1()
func2()
运算结果:
476682936144
476660870864
#编码二
#编码的转换 bytes数据类型
'''ASCII:最初的密码本 只包含数字 字母 特殊字符
A 00000001
b 00010001
unicode:万国码 把所有国家的语言文字都收录进去
A 00100001 00000001 00000001 00000001
b 00010001 00000001 00000001 00000001
utf-8:最少用8位(1字节)来表示一个字符
A 00010001
欧洲 00010001 00000001
中文:01000001 00000001 00000001
gbk:国标 只含有中文 英文字母 数字 特殊字符
A 00010001
中文 01000001 00010001
'''

#unicode万国码的好处是把世界上所有国家的文字都编码 全部收录进去但是右个坏处就是 太占用内存
#一个英文字母a 一个数字1 一个符号+ 都需要用4个字节 32位 二进制去表示
#因此规定
#网络传输 硬盘存储必须以 非(unicodeutf-8,gbk)编码方式 进行编码


#请记住
#大环境是python3的情况下:
#str字符串 'a' '中国' '123' '@#$' 的内部编码方式为unicode
#但是unicode编码的数据是 不能网络传输和文件存储
#人类又发明了一种新的数据类型 bytes
#bytes 是python的基础数据类型之一 和 str是双胞胎
b1 = b'Alex'
s1 = 'Alex'
print(b1,type(b1))
print(s1,type(s1))

 -->

b'Alex' <class 'bytes'>
Alex <class 'str'>

  



#str bytes 之间的区别
'''
英文字符串
str:
表现形式:s1 = 'alex'
编码方式:unicode
bytes:
表现形式:b1 = b'alex'
编码方式:非unicode
中文字符串
str:
表现形式:s1 = '中国'
编码方式:unicode

bytes:
表现形式:b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' #utf8
b'\xd6\xd0\xb9\xfa'#gbk

编码方式:非unicode(utf-8或者gbk)

'''
s1 = '中国'
b1 = s1.encode('utf-8')
b2 = s1.encode('gbk')
print(s1)
print(b1)
print(b2)

  

中国
b'\xe4\xb8\xad\xe5\x9b\xbd'
b'\xd6\xd0\xb9\xfa'

  



#bytes如何使用
#将数据(字母 数字 特殊字符 中文。。。)写入文件 或者进行网络传输
#数据必须转化成bytes才可以进行

#str --> bytes(utf-8或者gkb)
#encode 编码
s1 = 'alex'
print(s1.encode('utf-8'))
s2 = '中国'
print(s2.encode('utf-8'))
print(s2.encode('gbk'))
 
b'alex'
b'\xe4\xb8\xad\xe5\x9b\xbd'
b'\xd6\xd0\xb9\xfa

 #bytes(utf-8或者gkb) -->str

#decode解码
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
b2 = b'\xd6\xd0\xb9\xfa
print(b1.decode('utf-8'))
#print(b1.decode('gbk'))#这个没法解码 
print(b2.decode('gbk'))
print(b2.decode('utf-8'))#这个也没法解码'''

  







猜你喜欢

转载自www.cnblogs.com/cavalier-chen/p/9451256.html