Python, как передать аргумент параметру указателя функции?
Я только начал изучать Python и узнал, что могу передать функцию в качестве параметра другой функции. Теперь, если я вызываю foo(bar())
, он не будет передаваться как указатель на функцию, а возвращаемое значение используемой функции. Вызов foo(bar)
передаст функцию, но таким образом я не могу передать никаких дополнительных аргументов. Что делать, если я хочу передать указатель функции, который вызывает bar(42)
?
Я хочу возможность повторять функцию независимо от того, какие аргументы я передал ей.
def repeat(function, times):
for calls in range(times):
function()
def foo(s):
print s
repeat(foo("test"), 4)
В этом случае функция foo("test")
должна быть вызвана 4 раза подряд.
Есть ли способ сделать это без необходимости проходить "тест" до repeat
вместо foo
?
Ответы
Ответ 1
Вы можете использовать lambda
:
repeat(lambda: bar(42))
Или functools.partial
:
from functools import partial
repeat(partial(bar, 42))
Или передайте аргументы отдельно:
def repeat(times, f, *args):
for _ in range(times):
f(*args)
Этот окончательный стиль довольно распространен в стандартной библиотеке и основных инструментах Python. *args
обозначает переменное количество аргументов, поэтому вы можете использовать эту функцию как
repeat(4, foo, "test")
или
def inquisition(weapon1, weapon2, weapon3):
print("Our weapons are {}, {} and {}".format(weapon1, weapon2, weapon3))
repeat(10, inquisition, "surprise", "fear", "ruthless efficiency")
Обратите внимание, что для удобства я поставил число повторений вперед. Это не может быть последним аргументом, если вы хотите использовать конструкцию *args
.
(Для полноты вы также можете добавить аргументы ключевого слова с помощью **kwargs
.)
Ответ 2
Вам нужно будет передать параметры для foo в функцию повтора:
#! /usr/bin/python3.2
def repeat (function, params, times):
for calls in range (times):
function (*params)
def foo (a, b):
print ('{} are {}'.format (a, b) )
repeat (foo, ['roses', 'red'], 4)
repeat (foo, ['violets', 'blue'], 4)