为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这两种写法都是错的

import functools 

sorted_ignore_case = functools.partial(sorted,cmp) 

print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])

 ##

 sorted_ignore_case = functools.partial(sorted,lambda s1,s2:cmp(s1.upper(),s2.upper())) 

print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])

 为什么以上两种写法都是错的

正在回答

3 回答

sorted函数有四个参数,sorted(iterable, cmp=None, key=None, reverse=False)

可以看到其中第一个参数是可迭代对象,后面的参数都是具有默认值的,重点阐述如下:

1、cmp,比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0

2、key,主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序

3、reverse,是否反转,默认情况下不反转

由此看来我们的偏函数后面就必须为cmp,key或者reverse这三个

对于第一个:偏函数可以不用传后面的参数,但是如果传入后面的参数时就需要手动添加默认值

对于第二个:因为偏函数中的除了第一个参数外,其他剩下的参数其实就是第一个参数(其实是个函数)的可选参数(比如int2=functool.partial(int,base=2),后面的base参数其实是int()函数的一个可选参数),而如果你只传了一个匿名函数,而没有赋值给cmp,key或者reverse的话,sorted更本就不认识,所以仍然会报错


个人理解,如果有误还请指正


4 回复 有任何疑惑可以回复我~

import functools 

sorted_ignore_case = functools.partial(sorted,cmp=lambda s1,s2:cmp(s1.upper(),s2.upper())) 

print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])

还是不大明白为啥的这样写

0 回复 有任何疑惑可以回复我~
#1

余先生2

我觉得functools.partial(p1,p2) 这个函数实际的作用就是修改p1这个函数的一个默认参数,然后将这个新的函数的地址返回。p2就是p1函数的一个参数。所以直接“lambda s1,s2:cmp(s1.upper(),s2.upper())”是不对的,需要“cmp=lambda s1,s2:cmp(s1.upper(),s2.upper())”,改变了cmp的默认值cmp(s1,s2)。
2018-02-09 回复 有任何疑惑可以回复我~

第二不是方法名 而是关键字参数

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255532    人
  • 解答问题       3038    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

为什么这两种写法都是错的

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号