获奖设计网站,建设银行嘉兴分行官方网站,网站开发与设计课程设计,软装设计网站推荐list.sort 方法会就地排序列表#xff0c;也就是说不会把原列表复制一份。这也是这个方法的返回值是 None 的原因#xff0c;提醒你本方法不会新建一个列表。在这种情况下返回 None 其实是Python 的一个惯例#xff1a;如果一个函数或者方法对对象进行的是就地改动#xff…list.sort 方法会就地排序列表也就是说不会把原列表复制一份。这也是这个方法的返回值是 None 的原因提醒你本方法不会新建一个列表。在这种情况下返回 None 其实是Python 的一个惯例如果一个函数或者方法对对象进行的是就地改动那它就应该返回None好让调用者知道传入的参数发生了变动而且并未产生新的对象。例如random.shuffle 函数也遵守了这个惯例。
用返回 None 来表示就地改动这个惯例有个弊端那就是调用者无法将其串联起来。而返回一个新对象的方法比如说 str 里的所有方法则正好相反它们可以串联起来调用从而形成连贯接口fluent interface。详情参见维基百科中有关连贯接口的讨论https://en.wikipedia.org/wiki/Fluent_interface。
与 list.sort 相反的是内置函数 sorted它会新建一个列表作为返回值。这个方法可以接受任何形式的可迭代对象作为参数甚至包括不可变序列或生成器见第 14 章。而不管sorted 接受的是怎样的参数它最后都会返回一个列表。不管是 list.sort 方法还是 sorted 函数都有两个可选的关键字参数。 reverse 如果被设定为 True被排序的序列里的元素会以降序输出也就是说把最大值当作最小值来排序。这个参数的默认值是 False。 key 一个只有一个参数的函数这个函数会被用在序列里的每一个元素上所产生的结果将是排序算法依赖的对比关键字。比如说在对一些字符串排序时可以用 keystr.lower 来实现忽略大小写的排序或者是用 keylen 进行基于字符串长度的排序。这个参数的默认值是恒等函数identity function也就是默认用元素自己的值来排序。
可选参数 key 还可以在内置函数 min() 和 max() 中起作用。另外还有些标准库里的函数也接受这个参数像 itertools.groupby() 和 heapq.nlargest() 等。
下面通过几个小例子来看看这两个函数和它们的关键字参数: fruits [grape, raspberry, apple, banana] sorted(fruits)
[apple, banana, grape, raspberry] fruits
[grape, raspberry, apple, banana] sorted(fruits, reverseTrue)
[raspberry, grape, banana, apple] sorted(fruits, keylen)
[grape, apple, banana, raspberry] sorted(fruits, keylen, reverseTrue)
[raspberry, banana, grape, apple] fruits
[grape, raspberry, apple, banana] fruits.sort() fruits
[apple, banana, grape, raspberry]sorted 和 list.sort 背后的排序算法是 Timsort它是一种自适应算法会根据原始数据的顺序特点交替使用插入排序和归并排序以达到最佳效率。这样的算法被证明是很有效的因为来自真实世界的数据通常是有一定的顺序特点的。维基百科上有一个条目是关于这个算法的https://en.wikipedia.org/wiki/Timsort。