У меня есть эта функция 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)






Вы можете использовать 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 Ну, мой плохой. Именно так я бы сделал это на других языках. Я не знал о проблемах в Python.
О, конечно, как и я не знаю всех мелких нюансов в Java, о которых вы могли не знать :-) Что касается других причин, см. это
И lambda, и partial — причудливые способы создания новой функции. Вы также можете просто написать это самостоятельно:
def f2(x):
return f(x, 1, 1)
Что делает lambda и partial особенными, так это то, что они являются выражениями и могут быть переданы в качестве аргументов напрямую функциям более высокого порядка.
Не проголосовал, но хотя вы можете использовать лямбду, это не очень хорошая идея по сравнению с частичными функциями.