Função Python como argumento de função?


116

Uma função Python pode ser um argumento de outra função?

Dizer:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

Portanto, são basicamente duas perguntas:

  1. Isso é permitido?
  2. E se for, como faço para usar a função dentro da outra função? Eu precisaria usar exec (), eval () ou algo parecido? Nunca precisei mexer com eles.

BTW, extraArgs é uma lista / tupla dos argumentos de outro função.


Respostas:


138

Uma função Python pode ser um argumento de outra função?

Sim.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

Para ser mais específico ... com vários argumentos ...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

extraArgs pode ser uma função também? se sim, como você chama isso?
Aysennoussi

@sekai Sim, extraArgs também pode ser uma função.
Manuel Salvadores

3
onde isso está documentado?
4dc0

32

Esta é outra maneira de usar *args(e também opcionalmente) **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Resultado

hello dude
world

Note-se que function, *args, **kwargstem que ser nessa ordem e têm que ser os últimos argumentos para a função de chamar a função.


3
Mais informações sobre * args & ** kwargs podem ser encontradas aqui pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo


4

Claro, é por isso que o python implementa os seguintes métodos em que o primeiro parâmetro é uma função:

  • map (função, iterável, ...) - Aplica a função a cada item do iterável e retorna uma lista dos resultados.
  • filtro (função, iterável) - Constrói uma lista a partir dos elementos de iterável para os quais a função retorna verdadeiro.
  • reduz (função, iterável [, inicializador]) - Aplica função de dois argumentos cumulativamente aos itens de iterável, da esquerda para a direita, de modo a reduzir o iterável a um único valor.
  • lambdas

2
  1. Sim, é permitido.
  2. Você usa a função como faria com qualquer outra: anotherfunc(*extraArgs)

2
  1. Sim. Incluindo a chamada de função em seu (s) argumento (s) de entrada, você pode chamar duas (ou mais) funções de uma vez.

Por exemplo:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

Quando você liga para myfunc, você faz o seguinte:

myfunc(anotherfunc(inputarg1, inputarg2))

Isso imprimirá o valor de retorno de anotherfunc.

Espero que isto ajude!


2

Função dentro da função: também podemos usar a função como parâmetro ..

Em outras palavras, podemos dizer que a saída de uma função também é uma referência para um objeto, veja abaixo como a saída da função interna está se referindo à função externa como abaixo.

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

o resultado será .. 14

Espero que isto ajude.


1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))

2
Considere adicionar alguma explicação à sua resposta.
HMD

Você não está passando função como um argumento aqui, em vez do valor de retorno.
Bob Bobster

1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

Acho que seria uma amostra mais adequada. Agora, o que me pergunto é se há uma maneira de codificar a função para usar no envio do argumento para outra função. Acredito que haja em C ++, mas em Python não tenho certeza.


1

Os decoradores são muito poderosos em Python, pois permitem que os programadores passem a função como argumento e também podem definir a função dentro de outra função.

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

Resultado

  • Esta é uma função interna antes da execução
  • Eu sou função de argumento
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.