[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 Perform(f):
    f()

Perform(lambda: Action1())
Perform(lambda: Action2(p))
Perform(lambda: Action3(p, r))


답변

functools에서 부분 기능을 사용할 수 있습니다.

from functools import partial

def perform(f):
    f()

perform(Action1)
perform(partial(Action2, p))
perform(partial(Action3, p, r))

키워드와도 작동

perform(partial(Action4, param1=p))


답변

람다가 아닌 functools.partial을 사용하십시오! 그리고 ofc Perform은 쓸모없는 기능이므로 직접 함수를 전달할 수 있습니다.

for func in [Action1, partial(Action2, p), partial(Action3, p, r)]:
  func()


답변

(몇 달 후) 람다가 유용한 작은 실제 예는 부분적으로는 아닙니다
.
quadf( x, f )1-d를 취하여 다양한를 f호출합니다 x.
y = -110에서 수직 절단과 x = -110에서 수평 절단에 대해 호출하려면,

fx1 = quadf( x, lambda x: f( x, 1 ))
fx0 = quadf( x, lambda x: f( x, 0 ))
fx_1 = quadf( x, lambda x: f( x, -1 ))
fxy = parabola( y, fx_1, fx0, fx1 )

f_1y = quadf( y, lambda y: f( -1, y ))
f0y = quadf( y, lambda y: f( 0, y ))
f1y = quadf( y, lambda y: f( 1, y ))
fyx = parabola( x, f_1y, f0y, f1y )

내가 아는 한, partial이것을 할 수 없습니다.

quadf( y, partial( f, x=1 ))
TypeError: f() got multiple values for keyword argument 'x'

(이에 numpy, partial, lambda 태그를 추가하는 방법은 무엇입니까?)


답변

이를 부분 함수라고하며이를 수행하는 방법에는 최소한 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


답변

클로저로 수행하는 방법은 다음과 같습니다.

    def generate_add_mult_func(func):
        def function_generator(x):
            return reduce(func,range(1,x))
        return function_generator

    def add(x,y):
        return x+y

    def mult(x,y):
        return x*y

    adding=generate_add_mult_func(add)
    multiplying=generate_add_mult_func(mult)

    print adding(10)
    print multiplying(10)