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

У меня есть эта функция f(x, a, b):

def f(x, a, b):
    return a*x + b

и я должен передать эту функцию другому с предустановленными значениями «a» и «b», например:

def print2(f):
    x = np.linspace(0,1,10)
    print(f(x))

print2(f( , 1, 1))

Я знаю, что есть другие способы решить эту конкретную проблему, однако это всего лишь пример, а не реальная проблема, и я хотел бы знать, можно ли вообще сделать что-то вроде этого "print2(f(, 1, 1) )". Другими словами, есть ли способ сделать это, не передавая аргументы полностью? Нравиться,

def print3(f, a, b):
    x = np.linspace(0, 1, 10)
    print(f(x, a, b))
print3(f, a, b)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 187
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать functools.partial именно для этого!

def print2(f):
    x = np.linspace(0,1,10)
    print(f(x))
f2 = functools.partial(f, a=1, b=2)
print2(f2)

Чтобы узнать о многих возможных преимуществах использования частичного доступа, см. это.

Вкратце:

и многое другое...

Вы можете просто обернуть его в другую функцию:

g = lambda x: f(x, 1, 1)

print2(g)

Сделайте аргументы внешней функции любыми данными, которые все еще необходимо предоставить, и передайте эти данные.


Мне говорят, что этот подход не идеален в Python. Ответ @Bharel, вероятно, более уместен.

Не проголосовал, но хотя вы можете использовать лямбду, это не очень хорошая идея по сравнению с частичными функциями.

Bharel 04.04.2019 19:26

Нет, по целому ряду причин. От самоанализа к совместимости.

Bharel 04.04.2019 19:31

@Bharel Ну, мой плохой. Именно так я бы сделал это на других языках. Я не знал о проблемах в Python.

Carcigenicate 04.04.2019 19:34

О, конечно, как и я не знаю всех мелких нюансов в Java, о которых вы могли не знать :-) Что касается других причин, см. это

Bharel 04.04.2019 19:36

И lambda, и partial — причудливые способы создания новой функции. Вы также можете просто написать это самостоятельно:

def f2(x):
    return f(x, 1, 1)

Что делает lambda и partial особенными, так это то, что они являются выражениями и могут быть переданы в качестве аргументов напрямую функциям более высокого порядка.

Другие вопросы по теме