2016-10-29 1 views
4

Ich hoffe, du kannst helfen. Ich suche nach einer Möglichkeit, eine Funktion zu schreiben, die später ein Element einfügt. Lassen Sie mich Ihnen ein Beispiel:Wie schreibe ich Funktion mit Variable von außen?

def general_poly(L): 
     """ 
     L, a list of numbers (n0, n1, n2, ... nk) 
     Returns a function, which when applied to a value x, returns the value 
     n0 * x^k + n1 * x^(k-1) + ... nk * x^0 
     """ 
     x = 1 
     res = 0 
     n = len(L)-1 
     for e in range(len(L)): 
      res += L[e]*x**n 
      n -= 1 
     return res 

Ich dachte, ich nur x hier einen Wert geben könnte und wenn ich general_poly(L)(10) tun wird es ersetzt werden, so dass x = 10 aber anscheinend es nicht so einfach ist. Was muss ich ändern/hinzufügen, damit meine Funktion funktioniert? Woher weiß die Funktion, dass die Multiplikation die x ist? Danke für deine Hilfe, Jungs!

+1

Wenn 'x' global ist, müssen Sie Python das explizit über' global x' mitteilen. –

Antwort

8

Sie aufgefordert werden, eine Funktion zurückzukehren, aber Sie den berechneten Wert zurückgeben:

def general_poly(L): 
    """ 
    L, a list of numbers (n0, n1, n2, ... nk) 
    Returns a function, which when applied to a value x, returns the value 
    n0 * x^k + n1 * x^(k-1) + ... nk * x^0 
    """ 
    def inner(x): 
     res = 0 
     n = len(L)-1 
     for e in range(len(L)): 
      res += L[e]*x**n 
      n -= 1 
     return res 
    return inner 

Jetzt general_poly(L)(10) wird tun, was man erwarten würde, aber es ist wahrscheinlich nützlicher, wenn Sie es auf einen Wert zuweisen, so dass es kann es mehrmals aufgerufen werden, zum Beispiel:

L = [...] 
fn = general_poly(L) 
print(fn(10)) 
print(fn(3)) 

Sie auch inner umschreiben könnte:

def general_poly(L): 
    return lambda x: sum(e*x**n for n, e in enumerate(reversed(L))) 
+0

Es tut tatsächlich was ich will, danke. Aber ich bin immer noch verwirrt: Die Rückkehr von "inner" bringt im Grunde das Setup zurück, so dass, sobald "x" gegeben ist, die innere Funktion gelöst werden kann. Ist das korrekt? Wenn ja, wie weiß general_poly (L), dass das "x" nach dem def von general_poly kommt? Weil inner ist def als inner (x)? –

+0

Ja, 'general_poly' ist eine Funktion eines Parameters (L), der eine Funktion zurückgibt, die einen Parameter (x) benötigt. Offensichtlich sind die tatsächlichen Namen der Parameter unwesentlich. – AChampion

+0

Verstanden, danke! –

0
def general_poly (L): 
    """ L, a list of numbers (n0, n1, n2, ... nk) 
    Returns a function, which when applied to a value x, returns the value 
    n0 * x^k + n1 * x^(k-1) + ... nk * x^0 """ 

    def inner(x): 
     L.reverse() 
     return sum(e*x**L.index(e) for e in L) 
    return inner 
Verwandte Themen