python字典的键值对输出次序问题:
在2.7-3.5的python版本中,字典的键值对是按照哈希表的存储顺序排列输出的,
而在3.6及以上版本中, 字典的键值对是按照初始化时的排列顺序输出的。
python 中 可变类型 和 不可变类型:
将python中的类型分为 两个大类,可变 和 不可变,
可变:list dict set
不可变:str,int(float),bool,tuple
python 中的缓存 和 小数据池:
小数据池 指的是 不同代码块下的 缓存机制,只是 缩小了 数字 的范围, 和 少的字符串, 都是为了提升性能,
python 中 深浅copy:
对于一个 嵌套的列表,
浅copy 是只新 copy 一个列表外壳,
深copy 除了copy 一个新的列表外壳,内部的也会copy新的内存,
1 def func(): 2 #1, 赋值 不 创建新内存空间 3 ''' 4 a = [1,2,3 ,[4,5,6]] 5 b = a 6 print(id(a),id(b)) 7 print(id(a[-1]),id(b[-1])) 8 ''' 9 10 # copy 指的就是要创建新的 内存空间 11 #2,浅copy 12 ''' 13 c = [1, 2, 3, [4, 5, 6]] 14 d = c.copy() # 这是浅copy 15 print(id(c),id(d)) 16 print(id(c[-1]),id(d[-1])) 17 # 所以浅copy 只是copy 一个外壳 18 ''' 19 20 #3,深copy 创建新的内存空间最多 21 ''' 22 from copy import deepcopy 23 e = [1, 2, 3, [4, 5, 6]] 24 f = deepcopy(e) 25 print(id(e),id(f)) 26 print(id(e[-1]),id(f[-1])) 27 ''' 28 # 所以,深copy 不只是新创建了一个壳子,而且也新创建了 里面的小壳子 29 30 if __name__ == '__main__': 31 func()
注: python 对深copy 也不是一味的开辟新内存,它是有条件的,对于不可变类型是不会 开辟的,例如:str,int ,float ,tuple!
还有,切片操作是 浅copy ,
1 l1 = [1,2,3,[11,22,33]] 2 l2 = l1[:] (浅copy ) 3 l1.append(666) 4 print(l1) 5 print(l2)
Python中 可以给数据 组合加上 索引的enumerate 函数:
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中:
1 def func(): 2 ''' 3 l = ["tom","a","b"] 4 5 ret = enumerate(l) 6 print(ret) # <enumerate object at 0x0371E198> #该对象 可迭代 7 for item in ret: 8 print(item) 9 ''' 10 11 ''' 12 s = "abcdefg" 13 ret = enumerate(s) 14 print(ret) 15 for item in ret: 16 print(item) 17 ''' 18 19 s = "woqu" 20 # 多用于 for in 结构 21 for item in enumerate(s): 22 print(item) 23 24 25 26 27 if __name__ == '__main__': 28 func()
Python中 编码 Unicode 和 utf-8/gbk 相关:
1 def func(): 2 3 s = "hello 世界" #s 是在内存中,它是Unicode 编码,(必须要转为 非unicode 才可以用于 网络传输 或 保存到硬盘 ) 4 print(s,type(s)) 5 6 #Python 中 所有的数据类型里,只有 字节类型(bytes) 的编码方式 是 非unicode 7 8 b = s.encode() # 默认编码 utf8 一个汉字 3个字节 # b此时在内存 是utf8 编码 b数据类型是bytes 9 print(b,type(b)) 10 11 c = s.encode(encoding="gbk") #gbk 一个汉字2个字节 # c 此时在内存中是 gbk编码 c数据类型是 bytes 12 print(c,type(c)) 13 14 # 如何将c (gbk): hello \xca\xc0\xbd\xe7 转为 b(utf8) :hello \xe4\xb8\x96\xe7\x95\x8c 呢? 15 # 这要通过 unicode 中间 转化, 因此需要通过 str 类型 (unicode) 转化, 16 ''' 17 # d = c.decode(encoding="utf8") # 这肯定不行,c 是以 gbk编码的,必须以 gbk解码 18 d = c.decode(encoding="gbk") 19 print(d,type(d)) 20 21 # 然后 再将 d 转为 utf8 22 e = d.encode(encoding="utf8") 23 print(e,type(e)) 24 25 ''' 26 27 # 总结: 28 # 1,内存中的数据类型 除了bytes 都是 Unicode , 29 # 2,要想保存硬盘 或网络传输 必须要是 非Unicode ( utf8 / gbk), 所以,保存 或 传输 要转为 bytes 类型 30 # 3,非 Unicode 之间 如果想互转 要通过Unicode 来转 31 32 if __name__ == '__main__': 33 func()
bytes 的使用:
不过,以后不会直接用 str 中转 ,因为如果字典 没办法直接 变为 str ,和 从str 再变回来, 一般使用json 模块 的loads() 和 dumps() ,
如下:
1 import json 2 def func(): 3 d = {'name':'a'} 4 5 # 将字典 变为 utf8 用于传输 6 ret = json.dumps(d).encode("utf8") 7 print(ret,type(ret) ) 8 9 # loads 直接可以转为 程序中使用的字典 10 ret2 = json.loads(ret) 11 print(ret2,type(ret2)) 12 13 if __name__ == '__main__': 14 func()
Python 中的 *args 和 **kwargs :
1 def func(a,*args,b=0,**kwargs): #位置参数 和 关键字参数 和 args 和 kwargs 的顺序 2 print(a) 3 print(b) 4 print(args) 5 print(kwargs) 6 7 if __name__ == '__main__': 8 func(1,2,1,2,b=10,d=1)
注:形参位置 * 和 ** 代表的都是聚合, *代表把位置参数聚合成一个元祖, ** 代表把关键字参数聚合成一个 字典 。
实参位置的* 和 ** 代表 的是打散,
1 ''' 2 def func(): 3 a= [1,2,3] 4 print(a) 5 print(*a) # 在实参位置 * 代表打散 6 ''' 7 def func2(a,b,c): 8 print(a) 9 print(b) 10 print(c) 11 12 def func3(name,age): 13 print(name) 14 print(age) 15 16 17 if __name__ == '__main__': 18 # func() 19 20 temp = [1,2,3] 21 func2(*temp) # * 在实参位置 处代表 打散 --> func2(1,2,3) 22 23 temp = {"name":"tom","age":18} 24 func3(**temp) # ** 在实参位置 代表 打散 --> func3(name='tom',age=18) 25 26 # 注: 实参位置要求 只要是可迭代对象 都可以被* 或 ** 打散 27 # 例如 28 ''' 29 temp = "abc" 30 def func4(a,b,c): 31 print(a) 32 print(b) 33 print(c) 34 35 func4(*temp) 36 '''