2015-05-13 16 views
6

Python'da, n işlevlerinin çoğaltılmasını (f1(x) * f2(x) * f3(x) * ... * fn(x)) döndüren bir işlev yazmak istiyorum.n işlevlerinin karşılıklı işlenmesi

ben gibi bir şey düşünüyordum:

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

ama bilmiyorum tam olarak nasıl args n fonksiyonlar döngü.

Teşekkür ederiz. -

+4

'args fonksiyon için: prod * = fonksiyon (x)'? – Veedrac

cevap

6

Onun çok basit sadece azaltmak kullanın:

sadece jeneratör fonksiyonları arasında döngü ifadesi ve çarpma yoluyla azaltılması var
from operator import mul  

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

.

+4

'operator.mul' yerine kullanın; işlevlerin tamsayıları döndürdüğü garantisi yok. – chepner

+0

@chepner ah, iyi nokta, teşekkürler. – Maltysen

+0

'operator.mul', eşdeğer“ lambda ”ifadesinden çok daha verimlidir; Bunun gibi durumlar “operatör” modüllerinin operatörleri fonksiyon olarak ortaya çıkarmasıdır. – chepner

5

args yalnızca bir tuple'dır, ancak lambda ifadesinde ihtiyacınız olan şekilde yineleme yapmak zor olacaktır (reduce'u kullanmadığınız sürece). Bunun yerine yuvalanmış bir işlev tanımlayın.

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

İç içe geçmiş bir işlev gerçekten gerekli mi? Args üzerinde yineleme yaparken sadece bir değişkende bir koşu toplamı tutmak daha kolay olmaz mıydı? –

+2

OP'nin teşebbüslerine dayanarak, bir ürünü, x'in belirli bir değeri için derhal hesaplamaktan ziyade, ürünü hesaplayan bir fonksiyon yaratacak bir fonksiyon aradığını düşündüm. ('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 

Çok basit x girişi ile tüm args ürününü verir.

Hızlı örnek:

def square(n): 
    return n**2 

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

Gecenin o zaman karşılıklı özyinelemeli çözüm, işte bu:

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

Funcs boşsa, x değil, 1 döndürmelidir. ..Sonra 1 çarpmanın kimliğidir? – Shashank

+0

Ayrıca, daha esnek olduğundan yıldız işareti sözdizimini kullanmalısınız. Bu, func'leri parametre listesindeki * funcs ile değiştirerek ve (funcs [1:]) yerine (* funcs [1:]) ile değiştirerek yapılabilir. – Shashank

+0

Aksi takdirde, güzel bir çözüm ... ama yatağa git :) – Shashank

İlgili konular