Чувствую, что в голове есть некоторая неясность в принципах работы с лямбда функциями….Прошу помочь полностью разложить по полочкам проблему лямбда функции, так, чтобы я мог ответить на любой вопрос по этой теме ).
Предлагаю начать с разбора найденной на другом сайте строки с участием этих чертовок:
map(lambda n: (lambda f, *a: f(f, *a))(lambda rec, n: 1 if n == 0 else n*rec(rec, n-1), n), range(10))
Насколько я сейчас понимаю ситуацию, то лямбда функция имеет стандартную запись, например:
map(lambda x: x + 1, range(a))
По моим соображениям в этой записи все устоено так:
- объявляется функция lambda
- указывается условное название элемента итерируемого объекта в формулах функции, в данном случае “х”
- далее идет двоеточие “:” говорящее, что далее будет собственно описание действий функции
- далее идет само описание действия
- далее запятая, говорящая, что описание функции кончилось
- далее идет ссылка на итерируемый объект, элементы которого, под условным названием “х”, будут подвергаться экзекуции.
Обладая таким представлением я попытался разобраться, как работает строка, которая упоминалась выше….и понял, что я что то не понимаю в этой ситуации…
если с первым упоминанием lambda функции еще более-менее ясно, что есть аргумент n, есть некое описание фунции и после запятой есть итерируемый объект range(10)
map(
lambda n:
(lambda f, *a: f(f, *a))(lambda rec, n: 1 if n == 0 else n*rec(rec, n-1), n),
range(10)
)
то при детальном рассмотрении второго упоминания lambda функции я попал в ступор…совсем не понял запись:
lambda f, *a: f(f, *a)
Если не будет возражений, то именно с этого места и начнем…. Кто нибудь знает, как объяснить сию запись?