Polynom generator

Code-Stücke können hier veröffentlicht werden.
Antworten
Jogusa
User
Beiträge: 2
Registriert: Donnerstag 21. Mai 2009, 13:57

Guten Tag zusammen!

Habe im Nov.'08 diese Seite im Netz gefunden:
http://projecteuler.net/
und brauchte eine Sprache um die Aufgaben zu lösen. So bin ich nach ein wenig hin und her bei Python gelandet,
also Vorsicht, Anfänger! ;-) Gestern brauchte ich für Testzwecke eine Funktion, die mir ein Polynom zurückgibt. Habe
im Netz auf die Schnelle nichts gefunden und mir das hier zusammen gebastelt:

Code: Alles auswählen

def getFuncPoly(max_exp, ratio, facts):
    """ Bsp: ratio=(numerator, denominator)
             facts=(k3, k2, k1, k0)
             max_exp=3
             p(x)= 5/4(3x^2 + 2x) => max_exp=2, ratio=(5,4), facts=(3,2,0)"""
    return lambda x: ( float(ratio[0]) * reduce(lambda x1, y1: x1+y1, \
                                                map(lambda k, p: k*x**p, facts, range(max_exp, -1, -1))))\
                                                /ratio[1]
Bsp.:
p(x) = (7/11) * (3*x^5 + 2*x^4 + x + 13)

>>> p = getFuncPoly(5, (7,11), (3,2,0,0,1,13))
>>> p(1)
12.090909090909092
>>> p(0)
8.2727272727272734

Parameter ratio braucht man nicht unbedingt, aber wegen meiner Daten ist es so bequemer für mich :-)

Vielleicht habt ihr ein paar Tips, wie man es besser machen kann und könnt mich auf ein paar Schwach- u./o. Fehlerstellen hinweisen.
Vielen Dank im voraus!
Grüße
BlackJack

@Jogusa: Man könnte es weniger kryptisch schreiben, mit nicht ganz so vielen ``lambdas``, einem Funktionsnamen der sich an PEP8 hält und mindestens eine Abkürzung weniger: `facts` ist ein englisches Wort mit einer anderen Bedeutung als `factors`. An den zwei Buchstaben mehr stirbt niemand. ;-)

Innerhalb von Klammern braucht man kein '\' um die (logische) Zeile fortzusetzen. Und Zeilen sollten nicht länger als 80 Zeichen werden.

Ungetestet:

Code: Alles auswählen

def make_polynom_function(max_exponent, factors, ratio=(1, 1)):
    """Bsp: ratio=(numerator, denominator) 
            facts=(k3, k2, k1, k0) 
            max_exp=3 
            p(x)= 5/4(3x^2 + 2x) => max_exp=2, ratio=(5,4), facts=(3,2,0)
    """
    numerator, denominator = ratio

    def polynom_function(x):
        return (float(numerator)
                * sum(map(lambda k, p: k*x**p,
                          reversed(factors),
                          xrange(0, max_exponent + 1)))) / denominator

    return polynom_function
Jogusa
User
Beiträge: 2
Registriert: Donnerstag 21. Mai 2009, 13:57

Wow!
Gracias @BlackJack, I like the python way :!:

Dein Code finde ich viel besser (und schöner!). Habe viel neues :idea: gelernt von nur ein paar Zeilen. (Also stimmt es doch: Use de Source, Luke!) Diese PEPs werde ich mir mal bald anschauen, kannte ich nicht.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Ich würde ggfs. noch den ersten Parameter der Funktion (max_exponent) weglassen. Bekommt man doch aus factors.
Antworten