Flask接口签名sign原理与实例代码浅析
513
2022-08-26
python中sort()方法的cmp参数(python sort cmp函数)
《python基础编程》里有讲到一段高级排序:
“如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x
>>>cmp(42,32)1>>>cmp(99,100)-1>>>cmp(10,10)0>>>numbers = [5,2,9,7]>>>numbers.sort(cmp)>>>numbers[2,5,7,9]
"
对于sort()方法,如果不传入参数,默认cmp为None,即numbers.sort()=number,sort(cmp)=number.sort(cmp=None),我们可以做一个验证:
>>> numbers = [5,2,9,7]>>> numbers.sort()>>> numbers[2, 5, 7, 9]
>>> numbers = [5,2,9,7]>>> numbers.sort(cmp)>>> numbers[2, 5, 7, 9]
>>> numbers = [5,2,9,7]>>> numbers.sort(cmp=None)>>> numbers[2, 5, 7, 9]>>>
如果传入参数,numbers.sort(cmp=1),我们可以验证一下,整型的参数可不可以:
>>> numbers = [5,2,9,7]>>> numbers.sort(cmp=1)Traceback (most recent call last): File "
代码报错:int对象不是一个callable,可调用对象。callable(object) 方法用来检测对象是否可被调用,即是否是一个函数,如果是则调用该函数的值,赋值给cmp。
那么我们如何自定义一个比较函数呢?
def mycmp1(x,y): #升序排列 return x-ydef mycmp2(x,y): #降序排列 return y-x
其中的规律就是:两两比较,如果返回为正,则交换两者的位置,即y在前x在后,否则x在前y在后。也可以这样解释,升序就是拿第一个数比对后面的数,降序就是拿最后一个数比对前面的数。
#升序排列numbers = [5,2,9,7]def mycmp1(x,y): return x-ynumbers.sort(cmp = mycmp1)print numbers>>>[2, 5, 7, 9]#降序排列numbers = [5,2,9,7]def mycmp2(x,y): return y-xnumbers.sort(cmp = mycmp2)print numbers>>>[9,7,5,2]
当然,也可以写作numbers.sort(mycmp1),省略cmp。
我们还可以直接穿入匿名函数lambda:
#升序排列numbers = [5,2,9,7]numbers.sort(cmp = lambda x,y: x-y)print numbers>>>[2,5,7,9]#降序排列numbers = [5,2,9,7]numbers.sort(cmp = lambda x,y: y-x)print numbers>>>[9,7,5,2]
另外,python3.x中取消了cmp参数,也不支持直接往sort()里面传函数,但可以构造排序函数传递给key来实现。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~