2015-05-13 6 views
6

Chcę napisać funkcję w Pythonie, która zwraca mnożenie funkcji n (f1(x) * f2(x) * f3(x) * ... * fn(x)).Mutlikacja funkcji n

Myślałam coś jak:

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

ale nie wiem dokładnie, jak pętli funkcji n w args.

Dziękuję.

+4

'dla func w args: prod * = func (x)'? – Veedrac

Odpowiedz

6

Jego bardzo proste - wystarczy użyć zmniejszyć:

from operator import mul  

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

To tylko wyrażenie generator krążący funkcji oraz zmniejszenie przez mnożenie.

+4

Zamiast tego użyj 'operator.mul'; nie ma gwarancji, że funkcje zwracają liczby całkowite. – chepner

+0

@chepner ah, dobry punkt, dzięki. – Maltysen

+0

'operator.mul' jest znacznie wydajniejszy niż równoważne wyrażenie' lambda'; takie przypadki powodują, że moduły 'operator' udostępniają operatorom funkcje. – chepner

5

args jest tylko krotka, ale trudno będzie iteracyjne nad nimi drogę trzeba w wyrażeniu lambda (chyba, że ​​używasz reduce). Zamiast tego należy zdefiniować funkcję zagnieżdżoną.

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

Czy wykonanie funkcji zagnieżdżonej jest naprawdę konieczne? Czy nie byłoby łatwiej utrzymać całkowitą sumę w zmiennej podczas iteracji przez args? –

+2

Opierając się na próbach OP, myślałem, że szuka funkcji, która stworzy funkcję, która oblicza produkt, zamiast natychmiastowego obliczenia produktu dla konkretnej wartości 'x'. ('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 

Bardzo prostu zwraca iloczyn wszystkich args z wejściem x.

Krótki przykład:

def square(n): 
    return n**2 

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

To o tej porze nocy, więc oto wzajemnie rekurencyjne rozwiązanie:

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

Nie powinien zwracać 1, a nie x, jeśli funcs jest puste. ... czy 1 jest tożsamością mnożenia? – Shashank

+0

Powinieneś także użyć składni asterisk, ponieważ jest bardziej elastyczny. Można to zrobić zastępując funki * funcs w liście parametrów i zastępując (funcs [1:]) (* funcs [1:]). – Shashank

+0

W przeciwnym razie, fajne rozwiązanie ... ale idź spać :) – Shashank