.sort()方法
list.sort是就地将该列表进行排序,也就是说不会把原列表复制一份。这也是这个方法返回none的原因,提醒你本方法不会新建一个列表。就在这种情况下返回none是python的一个惯例:如果一个函数或者方法对对象进行的是就地改动,那他就应该返回none,好让调用者知道传入参数发生了变动,并且没有产生新的对象。例如random,shuffle这些函数也遵守了这个惯例。
import random
list = [20, 16, 10, 5]
random.shuffle(list)
print "随机排序列表 : ", list
random.shuffle(list)
print "随机排序列表 : ", list
>>>随机排序列表 : [16, 5, 10, 20]
>>>随机排序列表 : [16, 5, 20, 10]
用返回none来表示就地改动这个惯例也有一个弊端,就是调用者无法将其串联起来。而返回一个新对象的方法(比如str里的所有方法)则正好相反,它们可以串联起来调用,从而形成连贯的接口。
看一下sort和sorted的方法不同之处
frults = ['grape', 'respberry', 'apple', 'banana']
print(sorted(frults)) # >>> ['apple', 'banana', 'grape', 'respberry']
print(frults) # >>> ['grape', 'respberry', 'apple', 'banana']
# 按照字母降序排序
print(sorted(frults, reverse=True)) # >>> ['respberry', 'grape', 'banana', 'apple']
# 新建一个用长度排序的列表
print(sorted(frults, key=len)) # >>> ['grape', 'apple', 'banana', 'respberry']
# 新建一个用长度降序排序的列表,
# 由于用到的排序算法是二分法,是稳定的,长度一样时候
# 不会出现列表完全反转的现象
print(sorted(frults, key=len, reverse=True)) # >>> ['respberry', 'banana', 'grape', 'apple']
# 上面的一系列操作都对frults没有影响
print(frults) # ['grape', 'respberry', 'apple', 'banana']
frults.sort()
# 此时frults被排序
print(frults) # ['apple', 'banana', 'grape', 'respberry']