문제

인수가있는 기능을 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 )

다른 팁

이것이 Lambda의 것입니다.

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))

lambdas가 아닌 functools.partial을 사용하십시오! OFC Perform은 쓸모없는 기능이며 기능을 직접 전달할 수 있습니다.

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

(몇 달 후) Lambda가 유용한 작은 실제 예, 부분적이지 않습니다.
언덕을 통과하는 슬라이스와 같은 2 차원 기능을 통해 다양한 1 차원 단면을 원한다고 가정 해 봅시다.
quadf( x, f ) 1D를 취합니다 f 그리고 다양한 것을 호출합니다 x.
y = -1 0 1에서 수직 절단을 위해 호출하고 x = -1 0 1에서 수평 절단,

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, Pertial, Lambda이 이것에?)

이것을 부분 함수라고하며이를 수행하는 방법은 3 가지 이상 있습니다. 내가 가장 좋아하는 방법은 Lambda를 사용하는 것입니다. 여분의 패키지에 대한 의존성을 피하고 최소한의 장점이기 때문입니다. 기능이 있다고 가정합니다 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top