小白跟着大神学Python——Day06 小数据池,编码再识,深浅Copy,set集合
今日内容
01.id is ==
#id id是什么意思?id指的是内存地址。#会有限制位数,但是具体是多少位,不知道。
#== 比较两边的内容是否相同。
#is 比较的两边的内存地址是否相等。
例子:
print(id(name)) # 12345686121
print(name is name1) # True
02.代码块:
python程序全是基于代码块去运行的,一个文件就是一个代码块。
#终端中每行代表一个代码块。
A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block. A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.
03.代码块与小数据池的关系
3.1 代码块的缓存机制
# python 在执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
简单的说就是,假如在同一个代码块中,你要设定一个a = ‘b’,先检查一下内存中是否已经存在‘b’了,如果存在,则将其直接调用,所以他们的内存地址相同。
其使用范围:数字,字符串,布尔值。
数字:任何数字在同一代码块下都会复用。
bool:True和False在字典中会以1,0方式存在,并且复用。
str:几乎所有的字符串都会符合缓存机制,具体规定如下:
1. 非乘法得到的字符串都满足代码块的缓存机制。
2. 乘数为1时,任何字符串满足代码块的缓存机制。
3. 乘数≥2时:仅含字母,数字,下划线,乘法总长度<=20,满足代码块的缓存机制。
优点:
1. 节省内存
2. 提升性能
2.小数据池(也称驻留机制,驻存机制,字符串的驻存机制,字符串的缓存机制等等)
那么到底什么是小数据池?他有什么作用呢?
大前提:
1. 小数据池是针对不同代码块之间的缓存机制(不能代码块之间的优化)!!!
2. 小数据池也是只针对 int(float),str,bool。
#int -5 ~ 256
#bool 全部。
#str 1. 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
2. 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
3. 乘法为1时:
仅含大小写字母,数字,下划线,默认驻留。
只含其他字符,长度不限,默认驻留。
4. 乘数>=2时:
仅含大小写字母,数字,下划线,乘法总长度<=20,默认驻留。
5.指定驻留
指定驻留是你可以指定任意的字符串加入到小数据池中,
让其只在内存中创建一个对象,多个变量都是指向这一个字符串。
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)
优点:
1.节省内存
2.提升性能
总结:
#如果你在同一个代码块中,用同一个代码块中的缓存机制。
#如果你在不同代码中,用小数据池。
04. 数据类型的补充
数据类型之间的转换:
str --> list split ***
list --> str join ***
bool :False 0,'', (),{},set() 转换为bool值都是False ***
list< ---> tuple tu = tuple(list) lst = list(tuple)
list < --- dict print(list(dict)) key放进列表中
tuple < --- dict print(tuple(dict)) key放进元组中
list <---> set print(set(list)) ***
列表、字典数据类型正反向循环删除列表的补充
# li = [11, 22, 33, 'alex', 55] # 将列表中索引为奇数位的元素删除。 # 错误实例: # for index in range(len(li)): # if index % 2 == 1: # li.pop(index) # print(li) # 在循环一个列表时,最好不要改变列表的大小,这样会影响你的最终结果。 # 方法一: # del li[1::2] # print(li) # 方法二: # new_l1 = [] # for index in range(len(li)): # if index % 2 == 0: # new_l1.append(li[index]) # li = new_l1 # print(li) # 方法三:倒叙循环列表 删除索引为奇数的元素 # for index in range(len(li)-1,-1,-1): # if index % 2 == 1: # li.pop(index) # print(li) # # for i in range(1,11): # # print(i) # # for i in range(10,0,-1): # print(i) # dict 在循环一个字典时,不能改变字典的大小,会报错。 dic = {'k1':1,'k2':2, 'k3': 3, 'name': '太白'} # 将字典中键含有k元素的键值对删除 错误实例: # for key in dic: # if 'k' in key: # dic.pop(key) 方法: # l1 = [] # for key in dic: # if 'k' in key: # l1.append(key) # # print(l1) # for k1 in l1: # dic.pop(k1) # print(dic)
05.编码再识
ascii:早期的密码本 英文字母,数字,特殊字符。
00000001
8位(bit) == 1 byte
在ascii码中 8位一个字节表示一个字符。
unicode :万国码,将全世界所有的文字全都包含进去
起初:
一个字符 用16位 2个字节表示
升级:
一个字符 用32位 4个字节表示
utf-8:最少用8位表示一个字符
a : 0000 0000 8位表示一个字符
欧洲: 0000 0000 0000 0000 16位 两个字节表示一个字符
中: 0000 0000 0000 0000 0000 0000 24位 3个字节表示一个字符
gbk:国标 只包含英文与自己国家的文字
a: 0000 0000 8位一个字节表示一个字符
中:0000 0000 0000 0000 16位 两个字节表示一个字符
1.不同的编码之间能否互相识别?? 不能!(报错或者出现乱码)
2.规定:文字通过网络传输,或者写入硬盘存储不能使用Unicode编码方式。
在python中
python3X环境(大前提):
唯独str类型:他在内存中的编码方式是Uniccode
所以python3中的字符串不能用于直接的网络传输,文件的存储
补充一个数据类型:bytes
bytes类型 与str类型非常类似(用法简直一模一样)
b1 = b‘alex’ 这个单独的数据类型(和字节虽然相同,但是不是那个意思)
为啥要有bytes:
bytes 内部编码方式 非Unicode
为啥还要有str? bytes 直接就解决了所有问题啊?
bytes显示的是16进制,而不是中文。编码不方便。
英文:
str:
表现形式:‘a’
内部编码:Unicode
bytes:
表现形式:‘a’
内部编码:非Unicode
中文:
str:
表现形式:‘屌丝’
内部编码:Unicode
bytes:
表现形式:16进制
内部编码:非Unicode
bytes: 当你使用python需要网络传输数据,文件储存数据时要考虑到bytes。
重点就在下面里!!!!!
字符串与bytes的转换。
str --》 bytes (gbk,utf-8,等)
unicode --》gbk utf -8
b = s.encode(‘gbk’) #编码
s = b.decode(‘gbk’)#解码
注意:unicode相当于中转系统,gbk要转化为utf-8,必须通过转为Unicode再转为utf-8。
06.深浅copy
对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表,但是新列表中的元素与原列表中的元素是公用的。
对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
07. set集合
集合本身是一个可变的数据类型,无序的。它要求里面的元素是一个不可变的类型(可哈希)
集合的作用
1 天然去重
2 数据分析
set( iterable 可迭代对象 ) #创建一个集合。
set 的用法
增 #记住是无序的
#add
#update迭代地添加
删
#set.remove(object)
#set.pop() #随机删除
#claer #清空
#del set1 删除集合
******去重******
#集合的其他操作
#交集 set1 = {1,2,3,4,5,6} set2 = {8,2,3,9,5,7} print(se1 &set2) print(set1.intersection(set2)) #并集 print(se1 | set2) print(set1.union(set2)) #差集 print(set1 - set2) print(set1.difference(set2)) #注意哪个的差集 #反交集 print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8} #子集与超集 set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) # 这两个相同,返回是False。 print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) # 这两个相同,返回是False。 print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。 #frozenset 不可变集合,让集合变成不可变类型
浙公网安备 33010602011771号