답변:
당신은 이것을 의미합니까?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
perform
와 action1
, action2
다른 파일에? @ S.Lott
이것이 람다의 목적입니다.
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
perform
에 추가 매개 변수를 넘겨야하는 경우에도 더욱 다양합니다 f
. 예를 들어, 전화를 걸 perform(partial(Action3, p))
거나 perform(f)
다음과 같은 작업을 수행 할 수 f("this is parameter r")
있습니다.
(몇 달 후) 람다가 유용한 작은 실제 예는 부분적으로는 아닙니다
.
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)
def action1(arg1, arg2=None, arg3=None)
, 예를 들어 arg3에 할당하려는 인수를 어떻게 전달할 수 있습니까?