Python学习笔记-Day6

内容大纲:

一、代码块

二、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'
天气晴朗

                                                                         

 

 

原文地址:https://www.cnblogs.com/tian-tian/p/9450626.html