0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В языках программирования существует понятие "объекты первого рода (или класса)". Им обозначают элементы, которые могут быть переданы в функции, возвращены из функций и присвоены переменным. К таким элементам относятся любые<em>данные</em>, например числа, строки, массивы или логические значения.</p>
1
<p>В языках программирования существует понятие "объекты первого рода (или класса)". Им обозначают элементы, которые могут быть переданы в функции, возвращены из функций и присвоены переменным. К таким элементам относятся любые<em>данные</em>, например числа, строки, массивы или логические значения.</p>
2
<p>Объектами первого рода может быть не только то, что мы привыкли именовать словом "данные", но и любая конструкция языка, например, функции. В Python функции - это объекты первого рода. Такая особенность очень серьезно влияет не только на обращение с функциями, но и на общий стиль программирования. Ниже мы поговорим об обращении с функциями как с данными.</p>
2
<p>Объектами первого рода может быть не только то, что мы привыкли именовать словом "данные", но и любая конструкция языка, например, функции. В Python функции - это объекты первого рода. Такая особенность очень серьезно влияет не только на обращение с функциями, но и на общий стиль программирования. Ниже мы поговорим об обращении с функциями как с данными.</p>
3
<h2>Анонимные функции</h2>
3
<h2>Анонимные функции</h2>
4
<p><strong>Анонимные функции</strong>- это функции, у которых нет имени. Они определяются с помощью ключевого слова lambda. Это ключевое слово названо в честь лямбда-абстракции - основы Лямбда Исчисления. Это математический аппарат, который часто применяется в разработке языков программирования. В Лямбда Исчислении все функции - анонимные. Поэтому анонимные функции во многих языках тоже иногда называют лямбдами или лямбда-функциями.</p>
4
<p><strong>Анонимные функции</strong>- это функции, у которых нет имени. Они определяются с помощью ключевого слова lambda. Это ключевое слово названо в честь лямбда-абстракции - основы Лямбда Исчисления. Это математический аппарат, который часто применяется в разработке языков программирования. В Лямбда Исчислении все функции - анонимные. Поэтому анонимные функции во многих языках тоже иногда называют лямбдами или лямбда-функциями.</p>
5
<p>В примере выше мы создали лямбда-функцию с параметром x, которая прибавляет к переданному значению 2. Как мы упомянули выше, функции в Python объекты первого рода, а значит мы можем присвоить функцию переменной.</p>
5
<p>В примере выше мы создали лямбда-функцию с параметром x, которая прибавляет к переданному значению 2. Как мы упомянули выше, функции в Python объекты первого рода, а значит мы можем присвоить функцию переменной.</p>
6
<p>Теперь работа с ней не отличается от работы с привычными нам функциями</p>
6
<p>Теперь работа с ней не отличается от работы с привычными нам функциями</p>
7
<p>Даже сохранив функцию внутри переменной, ничего не мешает передать ее в другую переменную. Только не забывайте об объектной природе функции. В другую переменную передается не сама функция, а ссылка на нее:</p>
7
<p>Даже сохранив функцию внутри переменной, ничего не мешает передать ее в другую переменную. Только не забывайте об объектной природе функции. В другую переменную передается не сама функция, а ссылка на нее:</p>
8
<p>Более того, любую функцию можно использовать напрямую, без сохранения в переменной:</p>
8
<p>Более того, любую функцию можно использовать напрямую, без сохранения в переменной:</p>
9
<p>Имя переменной - это лишь её имя, а сама функция не имеет имени. Поэтому такие функции в программировании и называют "анонимными".</p>
9
<p>Имя переменной - это лишь её имя, а сама функция не имеет имени. Поэтому такие функции в программировании и называют "анонимными".</p>
10
<p>В примере мы сделали вызов функции, что называется, "на лету": сначала создали (lambda: print('I love Hexlet')) и сразу же сделали вызов с помощью<em>оператора вызова функции</em>(). При этом определение функции следует обернуть в круглые скобки, чтобы обозначить границы определения для интерпретатора, которому нужно "понимать", что конкретно вы хотите вызвать. Понятно, что после такого выражения доступ к функции будет утерян, потому что она нигде не была сохранена.</p>
10
<p>В примере мы сделали вызов функции, что называется, "на лету": сначала создали (lambda: print('I love Hexlet')) и сразу же сделали вызов с помощью<em>оператора вызова функции</em>(). При этом определение функции следует обернуть в круглые скобки, чтобы обозначить границы определения для интерпретатора, которому нужно "понимать", что конкретно вы хотите вызвать. Понятно, что после такого выражения доступ к функции будет утерян, потому что она нигде не была сохранена.</p>
11
<p>У синтаксиса лямбда-функций есть несколько особенностей:</p>
11
<p>У синтаксиса лямбда-функций есть несколько особенностей:</p>
12
<ul><li>Параметры анонимных функций не заключены в скобки. Но все средства для описания параметров доступны в полной мере - и именованные параметры, и *args с **kwargs</li>
12
<ul><li>Параметры анонимных функций не заключены в скобки. Но все средства для описания параметров доступны в полной мере - и именованные параметры, и *args с **kwargs</li>
13
<li>Тело лямбда-функции - это всегда одно выражение, результат вычисления которого и будет возвращаемым значением. В теле лямбда-функции не получится выполнить несколько действий и не получится использовать многострочные конструкции вроде for и while. Но зато анонимные функции обычно просто читать, чего было бы сложно добиться, разреши авторам "многострочные" лямбды</li>
13
<li>Тело лямбда-функции - это всегда одно выражение, результат вычисления которого и будет возвращаемым значением. В теле лямбда-функции не получится выполнить несколько действий и не получится использовать многострочные конструкции вроде for и while. Но зато анонимные функции обычно просто читать, чего было бы сложно добиться, разреши авторам "многострочные" лямбды</li>
14
<li>Лямбды не используют return - объявление функции является выражением.</li>
14
<li>Лямбды не используют return - объявление функции является выражением.</li>
15
</ul><h2>Именованные функции</h2>
15
</ul><h2>Именованные функции</h2>
16
<p>Вернемся к примеру выше:</p>
16
<p>Вернемся к примеру выше:</p>
17
<p>Можно заметить, что конструкция add_two = lambda x похожа на знакомое нам объявление def add_two(x):. Действительно, ключевое слово def лишь связывает<strong>определение</strong>функции с<strong>именем</strong>переменной. Потому такие функции называют именованными в противоположность анонимным. При этом все свойства функции как объекта первого рода сохраняются.</p>
17
<p>Можно заметить, что конструкция add_two = lambda x похожа на знакомое нам объявление def add_two(x):. Действительно, ключевое слово def лишь связывает<strong>определение</strong>функции с<strong>именем</strong>переменной. Потому такие функции называют именованными в противоположность анонимным. При этом все свойства функции как объекта первого рода сохраняются.</p>
18
<h2>Создание внутри другой функции</h2>
18
<h2>Создание внутри другой функции</h2>
19
<p>Раз лямбда-функция - выражение, мы можем определять её в любом месте программы, допускающем использование выражений, например, в теле другой функции:</p>
19
<p>Раз лямбда-функция - выражение, мы можем определять её в любом месте программы, допускающем использование выражений, например, в теле другой функции:</p>
20
<p>Из свойств функций как объектов первого рода мы рассмотрели пока присваивание переменной. В дальнейших уроках мы рассмотрим как можно передавать функции в другие функции в качестве аргументов и возвращать из других функций. Использование функций как значения значительно повышает выразительные возможности языка, и в этом вы скоро убедитесь.</p>
20
<p>Из свойств функций как объектов первого рода мы рассмотрели пока присваивание переменной. В дальнейших уроках мы рассмотрим как можно передавать функции в другие функции в качестве аргументов и возвращать из других функций. Использование функций как значения значительно повышает выразительные возможности языка, и в этом вы скоро убедитесь.</p>