总览:
代码块
变量的门牌号 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'))#这个也没法解码'''