内容大纲:
一、代码块
二、is 、== 、id
三、小数据池
四、代码块与小数据池的关系
五、编码2
一、代码块
代码块:一个模块、一个函数、一个类、一个文件都是一个代码块。
而作为交互式方式输入的每一个命令行都是代码块(交互式方式输入:在cmd中进入Python解释器里面,每一行代码都是一个代码块)
例如:用cmd运行python,每行都是一个代码块
在一个程序中的两个函数体也是两个代码块,例如:
def func(): pass def func1(): pass
二、id、is 、==
id:在python中,id就是内存地址。例如使用id()内置函数去查询一个数据的内存地址:
name='wenghuitian' print(id(name)) #输出结果是name的内存地址:2151381407344(每次运行时的id地址都不一样)
==:比较两边的数值是否相等
is:比较两边的id是否相同
如果说内存地址相同,那么值一定相同;如果值相同,内存地址不一定相同。
三、小数据池
概念:小数据池也叫小整数缓存机制,或者称为驻留机制。
小数据池只针对于 整数、字符串、bool值。
整数:Python自动将-5~256的整数进行了缓存。就是说当你将这些整数赋值给变量时,并不会创建新的对象(不会在内存中开辟新的房间给变量),而是使用已经创建好的对象。
例如:
字符串:python会将一定规则的字符串放在字符串驻留池中,当你将这些字符串赋值给变量时不会创建新的对象,而是使用在字符串驻留池中已经创建好的对象。
小数据池对于字符串的规定要从以下四个方面进行讨论:
1、字符串长度为0或者1时,默认采用了驻留机制
2、字符串长度>1,且只含有大小写字母,数字,下划线时候,默认采用驻留机制
3、用乘法得到的字符串
①乘数为1时:
Ⅰ.仅含有大小写字母、数字、下划线,默认驻留
Ⅱ.含其他字符,长度<=1,默认驻留
Ⅲ.含其他字符,长度>1,默认驻留
②乘数>=2时:仅含有大小写字母,数字,下划线,总长度<=20,默认驻留
4、指定驻留:你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串
小数据池的优点:需要值相同的字符串和整数时,能够直接进行调用,避免频繁的创建和销毁,提升效率,节约内存。
缺点:在池中创建或插入字符、整数时,会发费更多的时间。
四、代码块与小数据池的关系
i1 = 1000
i2 = 1000
print(i1 is i2)
同样一段代码,在Pycham和交互方式执行的结果不同。在Pycharm中,结果是True,在cmd下结果是False。
因为代码块内的缓存机制和代码块和代码块之间的缓存机制不同。
Python在执行同一个代码块的初始化对象命令时,会检查其值是否已经存在,如果存在,会将其重用。换句话说,执行同一个代码块,遇到初始化对象的命令时,会将初始化的变量和值存储在一个字典中,在遇到新的变量时,会在字典中查询记录,如果有同样的记录,那么会重复使用字典中的这个值。
如果是不同的代码块,会看这两个变量的值是否满足小数据池的范围,如果满足则指向同一个地址。
对于同一个代码块的变量复用的问题,只能针对于数字,字符串,bool值,而对于其他数据类型是不成立的。
五、数据类型
ASCII:字母、数字、特殊字符,8位表示
Unicode:万国码,包含所有的文字
初期:一个字符16位
改版:一个字符32位
Utf-8:对Unicode升级
英文:8位
欧洲文字:16位
中文:24位
gbk(GB2312):字母、数字、特殊字符、中文
英文:8位
中文:16位
1、编码之间能不能互相识别:不能互相识别
2、网络传输或者硬盘存储的二进制必须是以非Unicode编码方式
大环境Python3x:
str:内部编码方式是Unicode。所以python文件中的字符串不能直接进行文件存储和传输。
bytes:python中的基础数据类型之一,与str相当于双胞胎。str拥有的所有方法,bytes类型都适用。
str与bytes的区别:
1、英文字母:
str:
表现形式:s1 =“alex”
内部编码方式:Unicode
bytes:
表现形式:b1 = b"alex"
内部编码方式:非Unicode
2、中文
str:
表现形式:s1 =“太白”
内部编码方式:Unicode
bytes:
表现形式:b1 = s1.encode(‘utf-8’)
内部编码方式:非Unicode
如何使用:
你想将一部分内容(字符串)写入文件,或者通过网络socket传输,这样部分内容(字符串),必须转化成bytes类型。
str---> bytes
encode
bytes ---> dtr
decode
s1 = '天气晴朗' d1 = s1.encode('gbk') print(d1) s2 = d1.decode('gbk') print(s2) 输出结果是: b'xccxecxc6xf8xc7xe7xc0xca' 天气晴朗