first-class
Введение | |
Пример | |
Реализация map() | |
Возвращение функции | |
Похожие статьи |
Введение
В информатике язык программирования имеет функции первого класса, если он рассматривает функции как объекты первого класса. В частности, это означает, что язык поддерживает передачу функций в качестве аргументов другим функциям, возврат их как результат других функций, присваивание их переменным или сохранение в структурах данных.
Функции первого класса являются неотъемлемой частью функционального программирования, в котором использование функций высшего порядка является
стандартной практикой.
Простым примером функции высшего порядка будет функция
Map
, которая принимает в качестве своих аргументов функцию и список и возвращает список после применения функции к каждому элементу списка.
Чтобы язык программирования поддерживал Map, он должен поддерживать передачу функций как аргумента.
Функция высшего порядка — в программировании функция, принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата.
Основная идея состоит в том, что функции имеют тот же статус, что и другие объекты данных. Использование функций высшего порядка приводит к абстрактным и компактным программам, принимая во внимание сложность производимых ими вычислений.
Пример
Создайте файл first-class.py
def square(x): return x * x f = square(5) print(square) print(f)
python first_class.py
<function square at 0x7ff58d862040> 25
Изменим код
def square(x): return x * x f = square print(square) print(f) print(f(5))
python first_class.py
<function square at 0x7fd877dbd040> <function square at 0x7fd877dbd040> 25
map()
Рассмотрим пример реализации кастомной функции map() из статьи map() в python
def square(x): return x * x def my_map(func, arg_list): result = [] for i in arg_list: result.append(func(i)) return result squares = my_map(square, [1, 2, 3, 4, 5]) print(squares)
python custom_map.py
[1, 4, 9, 16, 25]
Возвращение функции
Пример возвращения функции
def logger(msg): def log_message(): print('Log:', msg) return log_message log_hi = logger('Hi!') log_hi()
python first_class.py
Log: Hi!
Более сложный пример
def html_tag(tag): def wrap_text(msg): print('<{0}>{1}</{0}>'.format(tag, msg)) return wrap_text print_h1 = html_tag('h1') print(print_h1) print_h1('Test Headline!') print_h1('Another Headline!') print_p = html_tag('p') print_p('Test Paragraph!')
python first_class.py
<function html_tag.<locals>.wrap_text at 0x7f6b97f6db80> <h1>Test Headline!</h1> <h1>Another Headline!</h1> <p>Test Paragraph!</p>
Пояснения на примере print_h1:
print_h1 = html_tag('h1')
Заряжает функцию html_tag тегом h1
Теперь все , что будет передано в print_h1 это уже не tag, а msg,
так как наружу уже торчит не html_tag а wrap_text
Это видно когда выполняется
print(print_h1)
<function html_tag.<locals>.wrap_text at 0x7f6b97f6db80>
и этот msg будет попадать именно во внутреннюю функцию wrap_text и оборачиваться тегом h1
Функции | |
Python | |
Лямбда функции | |
map() | |
all() | |
Замыкания |