Как передать функцию в качестве аргумента и вызвать её с передачей параметров?

Как можно написать метод, который будет принимать функцию, передавать ей параметры и выполнять ее, чтобы реализовать цикл map?
  • 14 февраля 2024 г. 18:28
Ответы на вопрос 3
Для передачи функции в качестве аргумента и вызова её с передачей параметров в Python, можно использовать концепцию "функции высшего порядка". Вот пример:

```python
def my_function(arg1, arg2):
    return arg1 + arg2

def execute_function(func, arg1, arg2):
    result = func(arg1, arg2)
    return result

result = execute_function(my_function, 2, 3)
print(result)  # Вывод: 5
```

В данном примере, `my_function` - это функция, которую мы передаем в качестве аргумента `func` в `execute_function`. Затем, мы вызываем `func` с передачей аргументов `arg1` и `arg2`.

Для реализации цикла map, можно написать метод, который будет принимать список и функцию, и затем применять эту функцию к каждому элементу списка. Вот пример:

```python
def my_map(func, lst):
    result = []
    for item in lst:
        transformed_item = func(item)
        result.append(transformed_item)
    return result

def double(x):
    return x * 2

my_list = [1, 2, 3, 4, 5]
mapped_list = my_map(double, my_list)
print(mapped_list)  # Вывод: [2, 4, 6, 8, 10]
```

В данном примере, `my_map` принимает функцию `func` и список `lst`. Он проходит по каждому элементу списка, применяет функцию `func` к каждому элементу и добавляет результат в новый список `result`. Функция `double` принимает число и возвращает его удвоенное значение. Наконец, через вызов `my_map(double, my_list)` мы получаем список, в котором каждый элемент списка `my_list` удвоен.
Самый простейший пример. 
Модифицируйте его если нужны ссылки на аргументы

#include <functional>
#include <iostream>

template <typename Func, typename ... Args>
void foo(Func func, Args ... args) {
    func(args...);
}

int main() {
    foo([](){ std::cout << "endl;" << std::endl; });
    foo([](int i){ std::cout << "int i: " << i << std::endl; }, 123);
}
Вот два простых примера как это можно сделать: 
#include <iostream>
#include <functional>

void f(const std::string& str) {
    std::cout << str;
}

void foo(void (*f)(const std::string&), const std::string& str) {
    f(str);
}

void Foo(std::function<void(const std::string&)> F, const std::string& str) {
    F(str);
}


int main() {
    foo(f, "Hello");
    Foo(f, " world");
    return 0;
}


foo пример без использования STL
Foo пример с использованием STL

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