Подтвердить что ты не робот

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?

4b9b3361

Ответ 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)