问题一:cmp关键字,消失的cmp参数
arr = [5,4,3,2,1]
arr.sort(cmp = lambda x,y : x-y)
print(arr)
写完之后,竟然出现错误,难道是我晕了?
TypeError: 'cmp' is an invalid keyword argument for sort()
之后查看完文档,发现文档直接去掉了这个参数
def sort(self,*,key: Optional[(_T) -> Any] = …,reverse: bool = …) -> None
咱也不知道,咱也没法问,cmp参数就这样没了…
但是,凡事都有个但是,官方给咱了个 functools.cmp_to_key()
Use functools.cmp_to_key() to convert an old-style cmp function to a key function
直接上手使用
from functools import cmp_to_key
arr = [5,4,3,2,1]
arr.sort(cmp_to_key(lambda x,y : x-y))
print(arr)
唉呀妈呀,又直接报错
TypeError: sort() takes no positional arguments
欧!!!我实在是太粗心了,忘了再怎么改,也没有**cmp_to_key()**这个参数,我太慌了
所以,正确使用,记着以下两点:
记着导入>from functools import cmp_to_key
记着搭配>key=cmp_to_key(lambda x,y : x-y)
cmp 忘了它吧,下面放一个正确的实例:
from functools import cmp_to_key
nums = [1, 3, 2, 4]
nums.sort(key=cmp_to_key(lambda a, b: a - b))
print(nums) # [1, 2, 3, 4]
问题二:两种不同的赋值,遇到的问题
还是直接上问题,不多说
间接赋值
x=[4,6,2,1,7,9]
x.sort()
y=x
print(y) #[1, 2, 4, 6, 7, 9]
print(x) #[1, 2, 4, 6, 7, 9]
直接复制
x=[4,6,2,1,7,9]
y=x.sort()
print(y) #None
print(x) #[1, 2, 4, 6, 7, 9]
仔细的哥们就发现,第二个y怎么返回的是None
明明我排序后,直接将排序后的地址给了y吗,怎么打印不出来呢????
还是上面的原因,我们太慌了,哎!!!!
print(type(y))
#
<class 'NoneType'>
发现它竟然是无效!!!,那么一定是sort()函数的问题,仔细看看
def sort(self,
*,
key: Optional[(_T) -> Any] = ...,
reverse: bool = ...) -> None
注意::它返回的是一个None,是不是就跟之前的NoneType对应上了,大家这样可以了理解了吧
比如:
def len(o: Sized) -> int #它就明显告诉你返回一个int
所以y=x.sort() 也忘掉它吧,赋值正确方法:
使用间接赋值
下面放一个实例:
from functools import cmp_to_key
def comp(x, y):
if x < y:
return 1
elif x > y:
return -1
else:
return 0
nums = [3, 2, 8, 0, 1]
nums.sort(key=cmp_to_key(comp))
tmp = nums
print(nums) #[8, 3, 2, 1, 0]
print(tmp) #[8, 3, 2, 1, 0]
本文讨论了Python 3.x中sort函数的变化,包括cmp参数的移除和如何使用functools.cmp_to_key进行转换。同时解释了sort函数的赋值问题,指出直接赋值会返回None,并提供了正确的赋值方法示例。
1152

被折叠的 条评论
为什么被折叠?



