python字典的键值对输出次序问题:

在2.7-3.5的python版本中,字典的键值对是按照哈希表的存储顺序排列输出的,

而在3.6及以上版本中, 字典的键值对是按照初始化时的排列顺序输出的。

python 中 可变类型 和 不可变类型:

将python中的类型分为 两个大类,可变 和 不可变,

可变:list dict set 

不可变:str,int(float),bool,tuple  

python 中的缓存  和 小数据池:

Python的重要知识点汇总1

 

 

小数据池 指的是 不同代码块下的 缓存机制,只是 缩小了 数字 的范围, 和 少的字符串,  都是为了提升性能,   

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 的使用: 

Python的重要知识点汇总1

 

 

 不过,以后不会直接用 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)

 

注:形参位置 *  和 ** 代表的都是聚合,  *代表把位置参数聚合成一个元祖,  ** 代表把关键字参数聚合成一个 字典  。

  实参位置的*  和 ** 代表 的是打散, 

Python的重要知识点汇总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     '''
* 和 ** 在形参 和实参的 不同

相关文章: