Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么sort()中的键值可以将自定义函数地址作为其参数?_Python_Sorting - Fatal编程技术网

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”作为参数?