Перейти к содержимому

Зачем нужны анонимные функции

  • автор:

Анонимные функции — Python: Функции

Представим, что нам нужно написать функцию для выполнения определенного действия, но создание отдельной функции кажется излишним. Чтобы решить эту проблему, можно использовать анонимные функции. Они позволяют определить функцию «на лету» внутри другой функции или выражения.

В этом уроке мы изучим, что такое анонимные функции, как их определять и использовать в Python. Также рассмотрим примеры, где использование анонимных функций может значительно упростить написание кода. Но для начала вспомним, что такое именованные функции.

Принцип работы именованных функций

Именованные функции в Python — это функции, которым назначено имя с помощью оператора def . Он позволяет создавать функции, которые можно вызывать по имени из любой точки программы.

Пример именованной функции:

def add_numbers(x, y): return x + y 

Здесь именованная функция — add_numbers . Она принимает два аргумента x и y и возвращает их сумму.

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

Придумывание имен в программировании — одна из основных проблем. Но если функция нужна здесь и сейчас, и больше нигде ее вызывать не придется, то и имя ей не нужно. Такие одноразовые функции называются анонимными или лямбда-функциями.

Принцип работы анонимных функций

Анонимные функции — это функции, у которых нет имени. Они определяются с помощью ключевого слова lambda . Это ключевое слово названо в честь лямбда-абстракции — основы Лямбда Исчисления. Это математический аппарат, который часто применяется в разработке языков программирования. В Лямбда Исчислении все функции — анонимные. Поэтому анонимные функции во многих языках тоже иногда называют лямбдами или лямбда-функциями.

Такие функции обычно используются в качестве аргументов функций высшего порядка, таких как map() , filter() и reduce() . Также они позволяют описывать практически все языки, которые умеют работать с функциями как со значениями.

В Python определение подобной функции выглядит так:

lambda x: x + 1 # at 0x7f56e5798a60> 

Мы сконструировали функцию, но имя она не получила, поэтому REPL ее отобразил как function .

Рассмотрим пример, который использует анонимную функцию:

l = [1, 2, 5, 3, 4] l.sort(key=lambda x: -x) l # [5, 4, 3, 2, 1] 

Метод sort принимает в качестве аргумента key ссылку на функцию. В примере в качестве аргумента указана функция, которая меняет знак у аргумента. По этой причине список получается отсортирован от большего к меньшему.

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

Рассмотрим другой пример, который использует анонимную функцию вместе с функцией map() :

l = [1, 2, 3, 4, 5] result = list(map(lambda x: x * 2, l)) result # [2, 4, 6, 8, 10] 

В данном примере функция map() принимает анонимную функцию и список данных. Анонимная функция lambda x: x * 2 принимает один аргумент x и умножает его на два. Функция map() применяет эту анонимную функцию к каждому элементу списка l и возвращает новый список, в котором каждый элемент удвоен. Результат сохраняется в переменной result и выводится на экран.

Теперь рассмотрим пример работы с функцией filter :

l = [1, 2, 3, 4, 5] result = list(filter(lambda x: x % 2 == 0, l)) result # [2, 4] 

Этот код использует функцию filter . Она фильтрует элементы входной последовательности, согласно условию, которое задано в лямбда-функции. В нашем примере функция фильтрует элементы списка l .

Здесь лямбда-функция lambda x: x % 2 == 0 определяет, что элемент должен быть четным — его остаток при делении на два должен быть равен нулю.

Функция filter применяет лямбда-функцию к каждому элементу списка l и оставляет только те элементы, для которых лямбда-функция возвращает True . Затем эти элементы используются для создания нового списка с помощью функции list .

Посмотрим на еще один пример применения анонимной функции, но уже с функцией reduce :

from functools import reduce l = [1, 2, 3, 4, 5] result = reduce(lambda x, y: x * y, l) result # 120 

В данном примере используется лямбда-функция, которая принимает два аргумента: x и y . В итоге она возвращает их произведение. Итерируемый объект l содержит числа [1, 2, 3, 4, 5] . Поэтому функция reduce последовательно умножает каждую пару чисел в списке: (1 * 2) * 3) * 4) * 5 . Это приводит к результату 120 .

Особенности анонимных функций

Рассмотрим главные особенности анонимных функций:

  • Аргументы анонимных функций не заключены в скобки. К этому нужно будет привыкнуть. Остальные средства для описания аргументов доступны в полной мере — и именованные аргументы, и *args с **kwargs
  • Тело лямбда-функции — это всегда одно выражение, результат вычисления которого и будет возвращаемым значением. В теле лямбда-функции не получится выполнить несколько действий и не получится использовать многострочные конструкции вроде for и while . Но зато анонимные функции обычно просто читать, чего было бы сложно добиться, разреши авторам «многострочные» лямбды
  • Объявление функции является выражением. Функции можно конструировать и тут же вызывать, не заканчивая выражение:
1 + (lambda x: x * 5)(8) + 1 # 42 

В таком виде лямбды встречаются редко. Зато часто можно встретить возврат лямбды из функции:

def caller(arg): return lambda f: f(arg) call_with_five = caller(5) call_with_five(str) # '5' call_with_five(lambda x: x + 1) # 6 

Из этого примера можно понять, что лямбды являются замыканиями — возвращаемая лямбда запоминает значение переменной arg .

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Анонимные функции в JavaScript

Анонимной в JavaScript называют функцию с которой не связано никакое имя или другими словами у такой функции нет имени. Также можно сказать, что если после ключевого слова function или перед знаком стрелочной функции => не стоит имя — функция анонимная. Однако если такую функцию положить в переменную она уже считается именованной.

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

Самовызывающаяся функция

 (function() < alert('Я буду настойчив и выучу все возможные записи функций!'); >)(); 

Такая анонимная функция выполнится сразу же, как интерпретатор до неё дойдет. В такой записи, функция заключается в круглые скобки () , а после нее добавляется вызов () .

Также запись может быть сделана в стиле стрелочных функций.

Анонимные функции в качестве параметров

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

 setTimeout(function() < alert('Время заняться практикой JavaScript!'); >, 5000); 

В данном примере анонимная функция выступает в качестве аргумента функции setTimeout() , и выведет сообщение через пять секунд после загрузки страницы.

Еще один пример, но уже не с кастомной функцией.

 function importantQuestion(question, yes, no) < if (confirm(question)) yes() else no(); >importantQuestion( "Вы хотите изучать JavaScript?", function() < alert("Не опускайте руки и у вас все получиться!"); >, function() < alert("Отличная новость! Чем меньше у меня конкурентов, тем выше моя зарплата."); >); 

Итого

1. Анонимные функции становятся доступны, только после того, как интерпретатор дойдет до них, таким образом их вызов возможен только после записи функции в коде.

2. Анонимные функции короче и отлично подходят в тех случаях, когда на них не нужно ссылаться в коде.

3. Анонимные функции могут вызывать сами себя.

4. Анонимные функции могут выступать в качестве параметров в других функциях.

Skypro — научим с нуля

Анонимные функции — это просто

Мы начинаем скринкаст про анонимные функции. Давайте мы с Вами разберемся для чего они нужны, что они собой представляют и как их можно использовать. Давайте посмотрим, что они нам дают. Анонимные функции нам нужны для безопасности. С помощью их мы можем более безопасно обращаться к нашим событиям, ведь язык Javascript – это язык событий. Мы можем обратиться к какому-то элементу или чего-то запустить очень незаметно благодаря этой функции. Как же их создавать? Мы можем начать с того, что создадим конкретный button. Пусть у него будет айди mybutton, дальше тут будет какой-то Сlick Me.

С чего начнем? Сделаем так, чтобы по клику на кнопку мы могли обращаться к содержимому кнопки. Это первое.

Второе. Нам нужно, что бы мы могли вывести на экран это содержимое с помощью, естественно, анонимной функции. Итак, приступаем. Первое действие, что нам необходимо. Как я сказал, нам надо обратиться к кнопке по ее клику. Давайте посмотрим какой айдишник у нашей кнопки, наверное mybutton. Ну вот и вперед. Пишем mybutton, точка естественно, пишем онклик потому, что нам нужно по клику обратиться к нему. После этого мы ставим равно и делаем запуск самой уже функции. У нас любая функция называется function и всегда после круглых скобок у нас стоят фигурные, обозначая действие.

mybutton.onclick = function() < alert(‘hello’ >;

Что нужно сделать? По клику по кнопке мы могли обратиться к содержимому кнопки. Ну давайте обратимся хотя бы к чему-нибудь. Пусть у нас будет alert не ноль, просто напишем hello. Сохраняем и давайте посмотрим. Кнопка у нас есть. Что будет, если мы нажмем на нее. По моему работает. Правда! Итак, мы увидели, что есть у нас вывод hello, который происходит по нажатию на копку Click Me и это выполняет у нас определенная анонимная функция. Т.е. у нас нет запуска onclick, нет вызова функции, которая где-то уже там определена, нет. Т.е. вот здесь злоумышленник, или тому подобное, ничего не увидит, он видит здесь просто button и видит его айдишник , точка. Как бы здесь ниже, или где мы можем все это изобразить у нас уже запускается событие по клику на эту кнопку. Это раз. Первое действие мы выполнили, но частично. Мы должны обратиться к содержимому кнопки. Внимание! Как же мы можем обратиться к содержимому кнопки? Кто-то знает, кто-то может быть не знает. Посмотреть, или узнать на что мы нажали, или к чему мы прикоснулись в Javascript, в момент события, помогает указатель сделать this. Что делает? Он при нажатии на конкретную кнопку, он уже создается, т. е уже формируется. Стоит мне нажать на Click Me, уже создался указатель this, который прекрасно видит и который воспринимает нормально наша анонимная функция. Опять-таки, именные функции объявленные, не понимают this по дефолту и по умолчанию. А анонимная функция все это воспринимает легко. Мы можем обратиться через this. И мы можем узнать, что? Наверно, содержимое нашей кнопки. Обращение к содержимому, или его перезапись, это у нас innerHTML.

// Создаем анонимную функцию по нажатию на кнопку mybutton.onclick = function()< // this - это указатель элемента, на который нажимали alert(this.innerHTML); >

Обращение у нас сделано. Но обратиться мало, — нам надо как-то это взять и вывести на экран. И посмотреть, что же у нас будет на экране. Давайте попробуем сделать тот же alert и туда просто вывести это содержимое. Так, лишний alert уже убираем. Давайте сохраним все это дело и проверяем. Кликаем, по моему работает. Итак, у нас получилось обратиться к элементу. У на получилось вывести данные по его нажатию. И у нас получилось все это сделать.

Объясните назначение анонимных функций

недавно начал изучать PHP и встретился с анонимными функциями. Можете, пожалуйста, объяснить в каких ситуация лучше их использовать ? Я так понял, что их используют, чтоб не засорять глобальное пространство. А где они еще могут пригодиться ? Как понять что именно в этом месте нужна анонимная функция ?

Отслеживать
задан 26 окт 2018 в 20:41
324 1 1 золотой знак 2 2 серебряных знака 13 13 бронзовых знаков
callback-функции.
26 окт 2018 в 20:55
Анонимные функции хороши, когда не хочется засорять область видимости.
26 окт 2018 в 21:34

в js callback понятно, там асинхронность, но в php то они зачем если весь код выполняется последовательно?

26 окт 2018 в 21:39

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Анонимные функции нужны(например) для функций, которые требуют в аргумент функцию обратного вызова, например array_map(), array_filter(), array_reduce().

P.S. Все возможности вы найдете в документации, но смысл один: анонимную функцию можно использовать в таких ситуациях, где функция будет использована один раз.

Отслеживать
ответ дан 26 окт 2018 в 20:59
9,194 4 4 золотых знака 24 24 серебряных знака 47 47 бронзовых знаков

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

function RangeValidator($min, $max)< return function ($val) use ($min, $max)< // возвращает ф-цию с предустановленными границами return ($val >= $min && $val ; > $a = getRangeValidator(5, 10); echo $a(4); __________________________________ function RangeValidator($min, $max, $val)< return ($val >= $min && $val echo RangeValidator(5, 10, 4) 

Хочется разобраться где и когда лучше использовать анонимные функции, а когда нет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *