- Python. Передача функции как аргумента. Структуры данных, содержащих перечень функций
- Передача функции как аргумента. Структуры данных, содержащих перечень функций. Возврат функции из другой функции оператором return . Примеры
- Связанные темы
- Python передать функции функцию
- Функция как параметр функции
- Функция как результат функции
Python. Передача функции как аргумента. Структуры данных, содержащих перечень функций
Передача функции как аргумента. Структуры данных, содержащих перечень функций. Возврат функции из другой функции оператором return . Примеры
Поиск на других ресурсах:
1. Передача функции в качестве аргумента. Общие понятия
Любая объявленная функция может быть передана в другую функция в качестве аргумента. Поскольку каждая функция является объектом, то передается ссылка на эту функцию. Функция, которая получает ссылку может по этой ссылке вызывать другую функцию соблюдая правильное задание количества и типа параметров.
В общем случае передача функции в качестве параметра выглядит следующим образом
# Функция, которая будет передана в другую функцию def FuncArg(parameters1): . # Функция, получающая ссылку на функцию FuncArg как параметр def Func(FuncArg, parameters2): .
- FuncArg — функция, ссылка на которую передается в другую функцию. Имя функции ( FuncArg ) есть ссылкой на функцию;
- Func — имя функции, которая получает входным параметром ссылку на функцию FuncArg ;
- parameters1 , parameters2 — соответственно параметры функций FuncArg() и Func() .
2. Примеры передачи функции в качестве аргумента
2.1. Решение квадратного уравнения. Передача функции, вычисляющей дискриминант в качестве аргумента
В примере реализована функция SquareRoot() , которая возвращает корни квадратного уравнения. Функция получает 4 параметра:
- func — имя ссылки на функцию;
- a , b , c — коэффициенты квадратного уравнения.
В теле функции SquareRoot() осуществляется вызов функции-параметра func() . При вызове указываются 3 параметра a , b , c .
Чтобы не было ошибки, при вызове функции SquareRoot() из другого кода, нужно, чтобы имя ссылки соответствовало (ассоциировалось) функции, получающей строго 3 параметра. В противном случае, будет сгенерирована ошибка.
# Функция SquareRoot(), которая получает ссылку на некоторую функцию. # Функция вовращает решение квадратного уравнения в виде списка. # Если уравнение не имеет корней, функция возвращает пустой список. def SquareRoot(func, a, b, c): D = func(a, b, c) # вызов функции с 3-мя параметрами if (D<0): return [] # уравнение не имеет решения else: x1 = (-b - math.sqrt(D))/(2*a) x2 = (-b + math.sqrt(D))/(2*a) return [x1, x2] # Функция, которая вычисляет дискриминант def Discr(a, b, c): # функция получает 3 параметра return b*b - 4*a*c # Передача функции Discr() как параметра в функцию SquareRoot() roots = SquareRoot(Discr, 2, 1, -1) if roots != []: print("x1 color: #800080;">print("x2 color: #ff6600;">else: print("The equation has no roots")
Результат выполнения программы
2.2. Пример передачи в функцию ссылки на функцию. Выполнение базовых операций над комплексными числами
В примере реализовано 5 функций:
- AddComplex() — возвращает сумму двух комплексных чисел в виде кортежа;
- SubComplex() — возвращает разницу двух комплексных чисел в виде кортежа;
- MulComplex() — возвращает произведение двух комплексных чисел;
- DivComplex() — возвращает результат деления двух комплексных чисел. В случае деления на 0 функция возвращает пустой кортеж;
- OperationComplex() — выполняет одну из четырех операций по ссылкам на соответствующие методы.
Результат выполнения программы
2.4. Пример передачи в функцию двух ссылок на функции, которые оперируют числами
В примере демонстрируется передача двух ссылок на функции в качестве параметров. Заданы две функции:
- SumNumbers() — определяет сумму цифр числа, которое задается входным параметром;
- MaxDigit() — определяет максимальную цифру числа, которое есть входным параметром.
С помощью функции OperationNumber() осуществляется вызов функций SumNumbers() и MaxDigit() . Функции SumNumbers() и MaxDigit() передаются в функцию OperationNumber() в качестве параметров.
# Функция, вычисляющая сумму цифр числа def SumNumbers(n): summ = 0 # искомая сумма n2 = n while n>0: t = n%10 # выделить последнюю цифру summ += t n = n//10 # уменьшить n print("The sum of digits of number ", n2, " color: #ff6600;">return summ # Функция, вычисляющая максимальную цифру числа и выводящая ее на экран def MaxDigit(n): maxD = 0 n2 = n while n>0: t = n%10 if t>maxD: maxD = t n = n//10 print("Max digit of number ", n2, " color: #ff6600;">return maxD # Функция, которая получает две ссылки на функции def OperationNumber(n, fn1, fn2): fn1(n) # вызвать функцию fn1 fn2(n) # вызвать функцию fn2 # Вычислить и вывести максимальную цифру и сумму цифр числа 2852 OperationNumber(2852, MaxDigit, SumNumbers)
3. Структуры данных, содержащие перечень функций
Поскольку функции являются объектами, то существует возможность создавать различные структуры данных, содержащих функции. При создании таких структур данных, каждую функцию и перечень ее параметров формируют в виде кортежа.
Например, список функций с одним параметром может быть таким
LF = [ (func1, param1), (func2, param2), . (funcN, paramN) ]
- func1 , func2 , …, funcN – перечень имен функций или ссылок на функции;
- param1 , param2 , …, paramN – перечень параметров соответственно функций func1 , func2 , …, funcN .
После такого описания можно вызвать функцию как элемент списка по образцу
LF[0][0](LF[0][1]) # вызов func1(param1)
4. Пример списка функций. Массив вызовов функции Convert_2_to_10() , которая конвертирует число из двоичной системы исчисления в десятичную
В примере формируется список ListConvert , содержащий кортежи, состоящие из имени функции Convert_2_to_10() и параметра-строки. Функция Convert_2_to_10() конвертирует число из двоичной системы исчисления в десятичную систему исчисления. Функция получает входным параметром число в виде строки и возвращает преобразованное число также в виде строки.
# Создание списка функций с параметрами для их дальнейшего вызова import math # Функция, конвертирующая число из двоичной системы исчисления в десятичную. def Convert_2_to_10(s): # Проверка строки s на корректность for c in s: if (c!='0')and(c!='1'): return "" # выход, если недопустимые символы в строке num = 0 # результирующее число типа int power = 0 # текущая степень i = 0 while ilen(s): bit = int(s[len(s)-i-1]) # получить один бит от конца строки power = int(math.pow(2, i)) # получить 2^i как целое число num = num + power*bit # увеличить число i = i+1 # Конвертировать число num в строку return str(num) # Функция, которая вызывает другую функцию с параметром s def Convert(func, s): return func(s) # Конвертировать число 10010 в десятичную систему исчисления n = Convert(Convert_2_to_10, "10010") print("n color: #ff0000;"># Создать список вызовов функций Convert_2_to_10() ListConvert = [ (Convert_2_to_10, "100111"), (Convert_2_to_10, "1111"), (Convert_2_to_10, "10001") ] n2 = ListConvert[0][0](ListConvert[0][1]) # Вызов функции Convert_2_to_10("100111") print("n2 color: #ff0000;"># Обход списка for (fn, param) in ListConvert: snum = fn(param) # Вызвать функцию с параметром print("snum color: #333300;">⇑5. Возврат функции из другой функции оператором return. Пример
Функции могут создаваться и возвращаться другими функциями. В наиболее общем случае, создание и возвращение функции выглядит следующим образом:
def FuncOut(parameters1): . # Объявление функции FuncIn() внутри функции FuncOut() def FuncIn(parameters2): # код функции FuncIn() . # Вернуть функцию FuncIn() return FuncInПосле такого объявления, использование функции FuncOut() может быть, например, таким
refFn = FuncOut(parameters1) refFn(parameters2)Пример. В примере в функции ProcessList() реализована функция AvgList() , которая возвращает среднее арифметическое элементов списка, который есть входным параметром функции ProcessList() . Результатом работы функции ProcessList() является функция AvgList() .
# Возврат функции оператором return. # Функция, возвращающая другую функцию. def ProcessList (L): # Внутри функции ProcessList() реалізована другая функция AvgList() def AvgList (L): summ = 0 for item in L: summ = summ + item return summ/ len (L) # Вернуть функцию AvgList(L) return AvgList # Демонстрация использования функций ProcessList() и AvgList() # Создать некоторый набор чисел LL = [ 2, 7, 3, 4, 0, 2, 3] # присвоить ссылке fnAvg функцию ProcessList.AvgList() fnAvg = ProcessList(LL) # Вызвать функцию AvgList() по ссылке average = fnAvg(LL) # Вывести результат print ( "average color: #333300;">⇑
Связанные темы
Python передать функции функцию
В Python функция фактически представляет отдельный тип. Так мы можем присвоить переменной какую-нибудь функцию и затем, используя переменную, вызывать данную функцию. Например:
def say_hello(): print("Hello") def say_goodbye(): print("Good Bye") message = say_hello message() # Hello message = say_goodbye message() # Good ByeВ данном случае переменной message присваивается одна из функций. Сначала ей передается функция say_hello() :
После этого переменная message будет указывать на данную функцию, то есть фактически представлять функцию say_hello. А это значит, что мы можем вызывать переменную message как обычную функцию:
Фактически это приведет к выполнению функции say_hello, и на консоль будет выведена строка "Hello". Затем подобным образом мы можем передать переменной message другую функцию и вызвать ее.
Подобным образом можно через переменную вызывать функцию с параметрами и возвращать ее результат:
def sum(a, b): return a + b def multiply(a, b): return a * b operation = sum result = operation(5, 6) print(result) # 11 operation = multiply print(operation(5, 6)) # 30Функция как параметр функции
Поскольку функция в Python может представлять такое же значение как строка или число, соответственно мы можем передать ее в качестве параметра в другую функцию. Например, определим функцию, которая выводит на консоль результат некоторой операции:
def do_operation(a, b, operation): result = operation(a, b) print(f"result = ") def sum(a, b): return a + b def multiply(a, b): return a * b do_operation(5, 4, sum) # result = 9 do_operation(5, 4, multiply) # result = 20В данном случае функция do_operation имеет три параметра, причем третий параметр, как предполагается, будет представлять функцию, которая принимает два параметра и возвращает некоторый результат. Иными словами третий параметр - operation представляет некоторую операцию, но на момент определения функции do_operation мы точно не знаем, что это будет за операция. Мы только знаем, что она принимает два параметр и возвращает какой-то результат, который потом выводится на консоль.
При вызове функции do_operation мы сможем передать в качестве третьего параметра другую функцию, например, функцию sum:
То есть в данном случае параметр operation фактически будет представлять функцию sum и будет возвращать сумму дву чисел.
Затем аналогичным образов в вызов функции do_operation можно передать третьему параметру другую функцию - multiply, которая выполнит умножение чисел:
do_operation(5, 4, multiply) # result = 20Таким образом, более гибкие по функциональности функции, которые через параметры принимают другие функции.
Функция как результат функции
Также одна функция в Python может возвращать другую функцию. Например, определим функцию, которая в зависимости от значения параметра возвращает ту или иную операцию:
def sum(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def select_operation(choice): if choice == 1: return sum elif choice == 2: return subtract else: return multiply operation = select_operation(1) # operation = sum print(operation(10, 6)) # 16 operation = select_operation(2) # operation = subtract print(operation(10, 6)) # 4 operation = select_operation(3) # operation = multiply print(operation(10, 6)) # 60В данном случае функция select_operation в зависимости от значения параметра choice возвращает одну из трех функций - sum, subtract и multiply. Затем мы мы можем получить результат функции select_operation в переменную operation:
operation = select_operation(1)Так, в данном случае в функцию select_operation передается число 1, соответственно она будет возвращать функцию sum. Поэтому переменная operation фактически будет указывать на функцию sum, которая выполняет сложение двух чисел:
print(operation(10, 6)) # 16 - фактически равно sum(10, 6)Аналогичным образом можно получить и выполнить другие функции.