Python 为什么sort()中的键值可以将自定义函数地址作为其参数?
今天,我遇到下面的一张代码幻灯片,我不明白为什么Python 为什么sort()中的键值可以将自定义函数地址作为其参数?,python,sorting,Python,Sorting,今天,我遇到下面的一张代码幻灯片,我不明白为什么key=takeSecond是一种有效的语法。我的意思是,它不应该是key=takeSecond(elem)?然而,代码工作得非常完美,我不知道为什么 # take second element for sort def takeSecond(elem): return elem[1] # random list random = [(2, 2), (3, 4), (4, 1), (1, 3)] # sort list with key
key=takeSecond
是一种有效的语法。我的意思是,它不应该是key=takeSecond(elem)
?然而,代码工作得非常完美,我不知道为什么
# take second element for sort
def takeSecond(elem):
return elem[1]
# random list
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# sort list with key
random.sort(key=takeSecond)
# print list
print('Sorted list:', random)
对于list,python有方法
list.sort(key=None,reverse=False)
,排序列表中的key
您可以检查排序方法作为
键
参数的函数,您会问为什么正确?。
因此,它采用了一个函数,因为如果要执行takeSecond(elem)
,Python只需返回值
如果以这种方式实施:
random.sort(key=takeSecond((1, 2)))
这等于:
random.sort(key=2) # Because the function returns 2 (elem[1]).
这是不正确的。
因此,您为排序方法提供了他可以调用的函数,为了更好地理解,我将向您展示一个以另一个函数为参数的函数
这是:
def get_func(function, values):
for item in values:
function(item) # For every item in the list it'll execute this function.
因此,函数接收函数并使用它,等于sort
方法使用它的方式。takeSecond(elem)
意味着您使用elem
作为参数调用函数takeSecond
,并返回结果。但是,如果只传递函数名,如key=takeSecond
,则传递的是可由排序函数调用的函数对象
下面是一个带有
键的参数,用于指定排序列表中每个元素时将调用的函数。如果列表元素的结构与您的情况相同,并且您希望根据该结构的某个组件进行排序,那么指定这样的函数非常有用
如果要指定key=taksecond(elem)
,takesecond(elem)
是对带有参数elem
的函数的即时调用(该参数恰好未定义;仅当传递的参数绑定到名称elem
时,才在函数takesecond
中定义该函数)只有当调用返回的值恰好是用于比较键的函数时,这才是正确的。list.sort()的key
参数可以接受返回值的函数。它将这些值相互比较以对内容进行排序
def takeSecond(elem):
return elem[1]
列表的每个参数都将被传递到takeSecond()
函数中,如下所示
# takeSecond((2, 2)), #first return 2
# takeSecond((3, 4)), #second return 4
# takeSecond((4, 1)), #third return 1
# takeSecond((1, 3)). #fouth return 3
因此,sort
函数正在比较2,4,1,3
,用于将结果元素定位到列表中键以random作为参数。你应该通过面向对象的概念来理解这一点。我建议阅读-键需要是可调用的,只有一个参数。不。您缺少的关键点是,在Python中,函数与任何其他对象一样。可以将指定给名称,myfunc=takeSecond
,它们可以作为参数传递给函数,也可以从函数返回。就像int
,list
,或者你有什么。下面Python有一流的功能,非常感谢。您能否进一步解释“当传递的参数绑定到名称elem时,它仅在函数takesecond中定义”?我不太明白。如果您尝试使用random.sort(key=takeSecond(elem))进行排序
,您会得到一个错误,因为在调用takeSecond
时没有定义elem
,elem
是在函数takeSecond
中定义的:它是传递给该函数的形式参数的名称。谢谢。顺便说一句,当代码运行到“random.sort”(key=takeSecond)时,并调用takesecond()。解释器如何知道应该将哪个参数传递给takesecond()?或者方法sort()默认将列表中的元素“random”作为参数?