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(可迭代对象,包括不可变对象)会新建一个列表作为返回值。

扫描二维码关注公众号,回复: 7724351 查看本文章

  list.sort()和sorted()使用的参数:1、reverse={bool},默认为reverse=False,按照降序;reverse=True,按照升序  2、Key= {函数名} 函数名为仅含有一个参数的函数,该函数用在每一个可迭代对象上;比如key=len按照字符串长度排序,key=str.low按照忽略大小写的排序

猜你喜欢

转载自www.cnblogs.com/pyclq/p/11784319.html
今日推荐