2015-05-13 8 views
6

Ich möchte eine Funktion in Python schreiben, die die Multiplikation von n Funktionen (f1(x) * f2(x) * f3(x) * ... * fn(x)) zurückgibt.Mutiplikation von n Funktionen

ich an etwas denken wie:

def mult_func(*args): 
    return lambda x: args(0)(x) * args(1)(x) ... 

aber ich weiß nicht genau, wie durch die n Funktionen in args Schleife.

Vielen Dank.

+4

'für func in args: prod * = func (x)'? – Veedrac

Antwort

6

Ganz einfach - nutzen Sie einfach reduzieren:

from operator import mul  

def mult_func(*args): 
    return lambda x: reduce(mul, (n(x) for n in args), 1) 

Das ist nur ein Generator Ausdruck durch die Funktionen Looping, und die Verringerung der durch Multiplikation.

+4

Verwenden Sie stattdessen 'operator.mul'; Es gibt keine Garantie, dass die Funktionen Ganzzahlen zurückgeben. – chepner

+0

@chepner ah, guter Punkt, danke. – Maltysen

+0

'operator.mul' ist weit effizienter als der äquivalente' lambda' Ausdruck; In solchen Fällen legen die Operator-Module die Operatoren als Funktionen offen. – chepner

5

args ist nur ein Tupel, aber es wird schwierig sein, über sie zu iterieren, wie Sie in einem lambda Ausdruck benötigen (es sei denn, Sie verwenden reduce). Definieren Sie stattdessen eine verschachtelte Funktion.

def mult_func(*args): 
    def _(x): 
     rv = 1 
     for func in args: 
      rv *= func(x) 
     return rv 
    return _ 
+0

Ist eine verschachtelte Funktion wirklich notwendig? Wäre es nicht einfacher, eine laufende Summe in einer Variablen zu halten, während man über Args iteriert? –

+2

Basierend auf den Versuchen des OP, dachte ich, dass er nach einer Funktion suchte, die eine Funktion erzeugen würde, die das Produkt berechnet, anstatt sofort ein Produkt für einen bestimmten Wert von "x" zu berechnen. ('f = mult_func (f1, f2, f3); f (3) == f1 (3) * f2 (3) * f3 (3)') – chepner

2
def mult_func(x, *args): 
    total = 1 
    for func in args: 
     total *= func(x) 
    return total 

kehrt Sehr einfach das Produkt aller args mit Eingang von x.

Schnell Beispiel:

def square(n): 
    return n**2 

>>> print mult_func(2, square, square) 
16 
>>> print mult_func(2, square, square, square) 
64 
0

Es ist die Zeit der Nacht, also hier eine für beide Seiten rekursive Lösung:

def multiply_funcs(funcs): 
    def inner(x): 
     if not funcs: 
      return 1 
     return funcs[0](x) * multiply_funcs(funcs[1:])(x) 
    return inner 
+1

Sollte es nicht 1 zurückgeben und nicht x wenn funcs leer ist. ..sind 1 die Identität der Multiplikation? – Shashank

+0

Auch sollten Sie die Stern-Syntax verwenden, da es flexibler ist. Dies kann durch Ersetzen von Funktionen in der Parameterliste durch * funcs und Ersetzen von (funcs [1:]) durch (* funcs [1:]) erreicht werden. – Shashank

+0

Sonst, nette Lösung ... aber geh ins Bett :) – Shashank

Verwandte Themen