«Функция первого класса» поддерживается несколькими языками программирования, включая Lisp, Haskell, Scala, Julia, Python, JavaScript, Ruby, Perl, а также Go. Короче говоря, все функции Python были функциями первого класса. Практически в любом языке программирования функция считается переменной первого класса и поэтому может быть предоставлена и обработана так же, как и другие типы объектов (все объекты в Python считаются объектами), например, целое число. или строка, например.
Свойства функций первого класса
- Позволяет также сохранить функцию внутри переменной.
- Позволяет отправлять функцию как нечто большее, чем просто параметр какой-либо другой функции.
- Разрешает функцию быть каким-то образом возвращенной из другой функции.
- Позволяет хранить данные в структурах данных, таких как словари, списки и кортежи.
- Функция сохраняется как не более чем переменная.
Пример 1
Этот образец кода можно использовать для демонстрации возможностей функции первого класса.
Мы создаем функцию с именем wish_a_friend(), которая принимает параметр «msg». С предоставленным параметром функция принимает сообщение «Hyy, Buddy». Функция вызывается в следующей строке с сообщением «Добрый вечер!» что заставляет вывод читать «Hyy, Buddy, Good Evening!».
Кроме того, мы устанавливаем переменную для той же функции wish_a_friend(). Там функцию можно сохранить как переменную. Следовательно, интерпретатор выводит «функция wish_a_friend at 0×7f698c6536e0>», когда мы пытаемся напечатать эту переменную. Это указывает на то, что переменная «wish_good_night» относится к функции wish_a_friend(). Предоставляется небольшое количество информации о текущем размещении функции в машинной памяти.
Мы начинаем вызов с символа «()», если хотим вызвать функцию, которая хранится как переменная. Функция wish_good_night() вызывается с сообщением «Спокойной ночи» в качестве результата.
Пример 2
Функции первого класса могут предоставлять функцию какой-либо другой функции в качестве аргумента, что является одной из их характеристик. Функция, которая передается в качестве аргумента другой функции, демонстрируется в следующем фрагменте кода:
Здесь определена функцияmulti_by_3(). Функциональность использования этого метода заключается в умножении требуемых значений на 3 и последующем возврате результатов. Некоторая другая функция, которая принимает три входа, показывает таблицу умножения. Функция — это первичный аргумент, кратное — второй аргумент, а список целых чисел — последний аргумент. Используется цикл for. Функция multiplication_table() вызывается с разными аргументами. В этом методе функция range() используется для установки диапазона элементов. Он отображает таблицу умножения 3 для каждого числа, упомянутого в списке диапазонов. Функция multiplication_table() получает аргумент «multiply_by_3».
Пример 3
Любую функцию, возвращаемую любой другой функцией, легко получить, используя функцию первого класса.
В предыдущем коде мы определили словарь «log_levels», который содержит различные уровни журнала. Создается функция с именем logger(). Он принимает «log_level» в качестве параметра. Определена другая внутренняя функция, называемая wrap_log(), которая принимает аргумент «сообщение». Вызывается метод print(). Он используется для отображения результата, который включает в себя уровень журнала и сообщение, которое можно найти внутри функции logger(). Не выполняя команду «wrap_log», мы возвращаем ее в logger() основной функции.
Затем, задав log_levels для каждой функции logger(), мы определяем несколько функций журнала в зависимости от этого уровня журнала. Процессор вызывает внешнюю функцию logger() с уровнем журнала «ERROR» всякий раз, когда мы запускаем оператор «log_error = logger (уровни журнала [5])». Мы создаем функцию-оболочку wrap_log() внутри метода logger(), и она принимает требуемое сообщение. Уровень log_level, а также сообщение выводятся на консоль с помощью команды печати внутри функции-оболочки. Здесь мы не выполняем функцию, а возвращаем ее как ссылку на переменную.
В зависимости от настроек ведения журнала можно вызвать определенную функцию журнала. В качестве иллюстрации мы можем вызвать функцию «log_error („Это похоже на журнал ошибок“)» в случае ошибки, передав сообщение об ошибке той же функции. Это выводит на терминал «ERROR:: Кажется, это журнал ошибок» и вызывает функцию-оболочку wrap_log() с сообщением об ошибке.
Пример 4
Первоклассные функции могут быть полезны и сохраняться внутри структур данных. В этом примере кода показано, как создать функцию, сохраняющую данные в структурах данных.
Существует функция fun_in_ax(), которая находится в стадии разработки. Эта функция требует два параметра, которые включают имя структуры данных «ax» и сообщение «msg». Это выводится на консоль, поэтому используется метод print(). Ссылка на функцию назначается списку, кортежу, а также словарю. При вызове этих трех разных структур данных мы можем передать соответствующие параметры списку, кортежам и словарям.
Различия между «функциями первого класса» и «функциями высшего порядка» в Python
Термины «функции первого класса», а также «функции высшего порядка» немного различаются.
- Функции более высокого порядка принимают другую функцию, такую как ввод, или возвращают новую функцию первого порядка, а иногда и то, и другое. В то время как функции первого класса обрабатываются как переменные и могут либо присваиваться переменным, либо передаваться в качестве аргументов.
- Функции высшего порядка не могут выполнять функции первого класса, тогда как функции первого класса могут выполнять функции высшего порядка.
- Функции первого класса применялись только к функциям в языках программирования, но функции более высокого порядка также могут использоваться в более широком контексте, например, в математике.
Заключение
В этой статье мы рассмотрели первоклассные функции Python, а также их атрибуты и свойства. Чтобы использовать функции первого класса для разных целей, мы также реализовали несколько примеров с подробными объяснениями каждого отдельного раздела кода. Мы обсудили некоторые наиболее существенные различия между функциями первого класса Python и функциями более высокого порядка. В этом руководстве мы узнали, как передать функцию другой функции, такой как аргумент, и как хранить функции в многочисленных структурах данных.