Синтаксис лямбда-функции в python - PullRequest
0 голосов
/ 09 мая 2018

Я наткнулся на пример sorted() ниже и не могу понять, почему lambda student: student[2] может представлять функцию, определяющую целые числа в кортеже.

Может кто-нибудь выложить механику или более понятный пример того, как python знает, что ученик по лямбда-функции должен извлекать данные из student_tuples?

student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10)]

sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
lambda student: student[2]

понятнее:

lambda x: x[2]

Лямбда-выражение возвращает функцию. Аргументы для этой функции перед «:» и разделены запятыми.

lambda x,y: x + y

Функция не имеет имени. Но вы можете представить, как будто лямбда создает абстрактную функцию. Лямбда-выражение возвращает функцию. (Лямбда - это своего рода сущность функции). Вы можете дать лямбда-выражениям также имя:

f = lambda x: x[2]

И теперь вы можете использовать имя для вызова функции.

f(["a", "b", "c"]) ## returns "c" because the list element "c" has index 2

list(map(f, student_tuples))
## [15, 12, 10]

или с лямбда-выражением:

list(map(lambda x: x[2], student_tuples))
## [15, 12, 10]

на самом деле то, что происходит внутри сортировки: лямбда-функция применяется к каждому элементу списка (map). Внешний list() вокруг map() необходим для выполнения map, потому что map лениво оценивается (обещание выполнить его, но еще не выполнено). Ленивые вычисления - это на самом деле вложенность лямбд ... ну, лямбда - это ядро ​​функционального программирования. Языки программирования, такие как Lisp, позволяют понять, что на самом деле является лямбда-выражением. (Вы можете также Google для лямбда-исчисления).

В R функциональный язык, в таком случае определяется порядок итерируемых индексов объектов, а затем применяется к объекту - для упорядочивания / сортировки - для получения окончательной отсортированной версии (функция sort)

Полагаю, что подобное происходит внутри функции Python sorted.

0 голосов
/ 09 мая 2018

lambda student: student[2] эквивалентно следующей функции, за исключением отсутствия имени:

def <anonymous function>(student):
  return student[2]

Причина, по которой он завершает вытягивание из student_tuples, заключается в том, что функция sorted() передает каждый отдельный элемент от своего первого аргумента (последовательности для сортировки) в свой аргумент key (функция, которая принимает элемент и возвращает соответствующий ключ сортировки). Таким образом, sorted() передает каждый элемент student_tuples в лямбда-функцию по очереди, в течение которого значение элемента временно присваивается переменной student.

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