Czy można przekazać funkcje z argumentami do innej funkcji w Pythonie?
Powiedz coś takiego:
def perform(function):
return function()
Ale funkcje do przekazania będą miały takie argumenty jak:
action1()
action2(p)
action3(p,r)
Masz na myśli to?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
def action1(arg1, arg2=None, arg3=None)
w jaki sposób mógłbyś przekazać argument, że zamierzasz zostać przypisany na przykład do arg3?perform
iaction1
,action2
na różnych plików? @ S.LottPo to jest lambda:
źródło
Możesz użyć funkcji częściowej z funools takich jak to.
Działa również ze słowami kluczowymi
źródło
functools.partial
jest również bardziej wszechstronny, jeśliperform
trzeba przekazać dalsze parametryf
. Np. Można zadzwonićperform(partial(Action3, p))
iperform(f)
zrobić coś takiegof("this is parameter r")
.Używaj funools.partial, a nie lambdów! I Ofc Perform jest bezużyteczną funkcją, możesz przekazywać funkcje bezpośrednio.
źródło
(miesiące później) mały prawdziwy przykład, w którym lambda jest przydatna, częściowo nie:
powiedz, że chcesz różnych 1-wymiarowych przekrojów poprzez funkcję 2-wymiarową, takich jak przekroje przez rząd wzgórz.
quadf( x, f )
bierze 1-df
i nazywa go różnymix
.Aby nazwać to cięciem pionowym przy y = -1 0 1 i cięciem poziomym przy x = -1 0 1,
O ile mi wiadomo,
partial
nie mogę tego zrobić -(Jak dodać do tego tagi numpy, częściowy, lambda?)
źródło
Nazywa się to funkcjami częściowymi i można to zrobić na co najmniej 3 sposoby. Moim ulubionym sposobem jest użycie lambda, ponieważ pozwala uniknąć zależności od dodatkowego pakietu i jest najmniej gadatliwy. Załóżmy, że masz funkcję
add(x, y)
i chcesz przejśćadd(3, y)
do innej funkcji jako parametru, tak aby inna funkcja decydowała o wartościy
.Użyj lambda
Stwórz własne opakowanie
Tutaj musisz utworzyć funkcję, która zwraca funkcję częściową. To oczywiście dużo bardziej szczegółowe.
Użyj częściowego z Funkools
Jest to prawie identyczne jak
lambda
pokazano powyżej. Dlaczego więc tego potrzebujemy? Jest kilka powodów . Krótko mówiąc,partial
w niektórych przypadkach może być nieco szybszy (zobacz jego implementację ) i można go użyć do wczesnego wiązania w porównaniu do późnego wiązania lambda.źródło
Oto sposób na to z zamknięciem:
źródło