Можно ли передать функции с аргументами другой функции в Python?
Скажи что-то вроде:
def perform(function):
return function()
Но передаваемые функции будут иметь такие аргументы:
action1()
action2(p)
action3(p,r)
Вы имеете в виду это?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
def action1(arg1, arg2=None, arg3=None)
как вы могли бы передать аргумент, который вы намереваетесь назначить, например, в arg3?perform
иaction1
,action2
в разных файлах? @ С. ЛоттВот для чего лямбда:
источник
Вы можете использовать функцию part из functools следующим образом.
Также работает с ключевыми словами
источник
functools.partial
также более универсален, еслиperform
необходимо передать другие параметрыf
. Например, можно было позвонитьperform(partial(Action3, p))
иperform(f)
сделать что-то подобноеf("this is parameter r")
.Используйте functools.partial, а не лямбды! И ofc Perform - бесполезная функция, вы можете передавать функции напрямую.
источник
(несколько месяцев спустя) крошечный реальный пример, где лямбда полезна, а не частична:
скажем, вы хотите различные одномерные сечения через двумерную функцию, например срезы в ряду холмов.
quadf( x, f )
берет 1-йf
и называет его по-разномуx
.Чтобы вызвать это для вертикальных сокращений в y = -1 0 1 и горизонтальных сокращений в x = -1 0 1,
Насколько я знаю,
partial
не могу этого сделать -(Как добавить теги NumPy, Partical, Lambda к этому?)
источник
Это называется частичными функциями, и для этого есть как минимум 3 способа. Мой любимый способ - использовать лямбду, потому что она позволяет избежать зависимости от дополнительного пакета и является наименее подробной. Предположим, у вас есть функция,
add(x, y)
и вы хотите передатьadd(3, y)
какую-то другую функцию в качестве параметра, так что другая функция решает значение дляy
.Используйте лямбду
Создайте свой собственный упаковщик
Здесь вам нужно создать функцию, которая возвращает частичную функцию. Это, очевидно, намного более многословно.
Используйте частичное из functools
Это почти идентично
lambda
показанному выше. Тогда зачем нам это? Есть несколько причин . Короче говоря,partial
может быть немного быстрее в некоторых случаях (см. Его реализацию ), и что вы можете использовать его для раннего связывания против позднего связывания лямбды.источник
Вот способ сделать это с закрытием:
источник