Почему значение ключа в sort () может принимать адрес пользовательской функции в качестве параметра? - PullRequest
0 голосов
/ 11 июля 2020

Сегодня я обнаружил слайд с кодом ниже, и меня смущает, почему 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)

Ответы [ 5 ]

1 голос
/ 11 июля 2020

Метод sort принимает в качестве параметра key функцию, вы спрашиваете, почему? Итак, он принимает функцию, потому что если вы сделаете takeSecond(elem), то Python просто вернет значение.

Если вы реализуете его таким образом:

random.sort(key=takeSecond((1, 2)))

Оно равно это:

random.sort(key=2) # Because the function returns 2 (elem[1]).

И это неверно. Итак, вы предоставляете методу sort функцию, которую он может вызвать, я покажу вам функцию, которая принимает другую функцию в качестве аргумента для лучшего понимания.

Вот она:

def get_func(function, values):
    for item in values:
        function(item) # For every item in the list it'll execute this function.

Итак, функция получает функцию и использует ее, равно как метод sort ее использует.

1 голос
/ 11 июля 2020

takeSecond(elem) означает, что вы вызываете функцию takeSecond с elem в качестве параметра и получаете результаты обратно. Однако, если вы передаете только имя функции, например key=takeSecond, вы передаете объект функции, который может быть вызван функцией сортировки.

Вот подробное объяснение

0 голосов
/ 11 июля 2020

Параметр key из list.sort() может принимать функцию, которая возвращает значение. Он сравнивает эти значения друг с другом для сортировки содержимого.

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, который будет использоваться для позиционирования результирующего элемента в списке

0 голосов
/ 11 июля 2020

С аргументом key вы указываете функцию, которая будет вызываться с каждым элементом сортируемого списка . Указание такой функции полезно, когда элементы списка структурированы, как в вашем случае, и вы хотите отсортировать на основе определенного компонента этой структуры.

Если вы указали key=taksecond(elem), takesecond(elem) - это немедленный вызов вашей функции с аргументом elem (который, оказывается, не определен; он определен в функции takesecond, когда переданный аргумент привязан к имени elem), и это, безусловно, будет правильным только в том случае, если возвращенное значение из этого вызова оказалось функцией, которая будет использоваться для сравнения ключей.

0 голосов
/ 11 июля 2020

Для списка python имеет метод list.sort(key=None, reverse=False), тот список сортировки, с помощью которого key

Вы можете проверить здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...