Python基础知识2-序列增量和排序
1、序列增量赋值 +=/*=
+=特殊函数为__iadd__,如果没有则调用__add__;但是区别是前者为就地改动,后者需要新生成一个变量,计算,再赋值,性能低下。 比如不可变变量 (比如tuple)根本不支持这个这个操作(注意:str为特例,cpython对str做了优化),所以使用就是后者__add__流程。该原理适用于*=(__imul__)
一个谜题(增量赋值非原子操作):
t = (1, 2, [30, 40])
t2 += [50, 60]
结果:即会抛出tuple不支持对它的元素赋值报错,同时t会变成(1,2, [30, 40, 50, 60]) 可以上http://pythontutor.com/visualize.html#mode=display 测试
上面谜题得到教训 1、不要把可变对象放到不可变元组里面 2、增量赋值不是原子操作,像上面谜题一样,已经赋值成功,但是报错 3、 会用dis查看字节码来查看运行过程
>>> s = (1,2,3,4,5,6)
>>> import dis
>>> dis.dis('s[1] += 3')
1 0 LOAD_NAME 0 (s)
2 LOAD_CONST 0 (1)
4 DUP_TOP_TWO
6 BINARY_SUBSCR
8 LOAD_CONST 1 (3)
10 INPLACE_ADD
12 ROT_THREE
14 STORE_SUBSCR
16 LOAD_CONST 2 (None)
18 RETURN_VALUE
2、排序
list.sort()为就地排序,不会生成新的序列,所以返回值为None;而sorted(可迭代对象,包括不可变对象)会新建一个列表作为返回值。
list.sort()和sorted()使用的参数:1、reverse={bool},默认为reverse=False,按照降序;reverse=True,按照升序 2、Key= {函数名} 函数名为仅含有一个参数的函数,该函数用在每一个可迭代对象上;比如key=len按照字符串长度排序,key=str.low按照忽略大小写的排序