Это называется частичными функциями, и есть как минимум 3 способа сделать это. Мой любимый способ - использовать лямбду, потому что она позволяет избежать зависимости от дополнительного пакета и является наименее подробной. Предположим, у вас есть функция add(x, y)
и вы хотите передать add(3, y)
какой-либо другой функции в качестве параметра, чтобы другая функция определяла значение для y
.
Использование лямбда
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = lambda y: add(3, y)
result = runOp(f, 1) # is 4
Создайте свой собственный упаковщик
Здесь вам нужно создать функцию, которая возвращает частичную функцию. Это, очевидно, намного более многословно.
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# declare partial function
def addPartial(x):
def _wrapper(y):
return add(x, y)
return _wrapper
# run example
def main():
f = addPartial(3)
result = runOp(f, 1) # is 4
Использовать частичное из functools
Это почти идентично lambda
, показанному выше. Тогда зачем нам это? Есть несколько причин . Короче говоря, partial
может быть немного быстрее в некоторых случаях (см. Его реализацию ) и что вы можете использовать его для раннего связывания с поздним связыванием лямбды.
from functools import partial
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = partial(add, 3)
result = runOp(f, 1) # is 4