Код сортирует список кортежей по 2-му элементу. Подскажите, как в функцию b передаётся аргумент el если вызов этой функции без скобок?

athletes = [('Дима', 10, 130, 35), ('Тимур', 11, 135, 39), ('Руслан', 9, 140, 33), ('Рустам', 10, 128, 30), ('Амир', 16, 170, 70), ('Рома', 16, 188, 100), ('Матвей', 17, 168, 68), ('Петя', 15, 190, 90)]

def func(num):
    def b(el):  # el - кортеж, элемент списка.
        return el[num]
    return b

num = 1

athletes.sort(key=func(num))

for x in athletes:
    print(*x)

Ответы (2 шт):

Автор решения: Глеб

Что-то вы перемудрили, по-моему. Вместо того, чтобы создавать свой аналог функции itemgetter, можно передать в параметр key лямбду:

>>> athletes = [('Дима', 10, 130, 35), ('Тимур', 11, 135, 39), ('Руслан', 9, 140, 33), ('Рустам', 10, 128, 30), ('Амир', 16, 170, 70), ('Рома', 16, 188, 100), ('Матвей', 17, 168, 68), ('Петя', 15, 190, 90)]
>>> athletes.sort(key=lambda x: x[1])
>>> for x in athletes:
        print(*x)

Руслан 9 140 33
Дима 10 130 35
Рустам 10 128 30
Тимур 11 135 39
Петя 15 190 90
Амир 16 170 70
Рома 16 188 100
Матвей 17 168 68

Функция sort должна принимать в параметр key объект-функцию, и вызов этой функции происходит внутри питона, для нас он не виден. Ваша функция возвращает n-ый элемент итерируемого объекта.

P. S. Использовать декораторы там, где они не нужны — плохая идея.

→ Ссылка
Автор решения: wchistow

Метод list.sort() в аргументе key принимает функцию, которой он передаёт каждый элемент. А так как ваша функция func возвращает функцию, принимающую на вход кортеж и возвращающую элемент из него:

>>> f = func(1)
>>> f(('Дима', 10, 130, 35))
10

то всё нормально.

→ Ссылка