Variable in Rechnung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Guardian
User
Beiträge: 3
Registriert: Donnerstag 3. März 2011, 18:31

Hi, ich bin neu hier und sitze auch noch nicht all zu lange an Python, also verzeiht wenn folgendes nicht so vor Ahnung strotzt! :)

Ich versuche einfach mal mein Problem zu benennen:

ich habe eine prozedur in der eine Parabel in ein bestehendes Koordinatensystem geschrieben werden soll.
So weit funktioniert alles wunderbar, nun will ich aber, dass die Funktionsgleichung vom User selber eingegeben werden kann.

zu diesem zwecke hier einfach mal ein ausschnitt:

http://www.python-forum.de/pastebin.php?mode=view&s=159

Funktioniert einwandfrei. Nun soll y= ... sein. ... soll die vom user eingegebene Funktionsgleichung sein.
In meiner Naivität habe ich es einfach mal mit:

y=input('...')

versucht.

Dieser Versuch endete mit: Can't convert 'float' object to str implicitly
Habe schon rumgesucht, da ich die Lösung des Problems fast im 'float' vermute, jedoch zu keinen Ergebnissen gekommen.
Habt ihr einen Lösungsvorschlag, oder einen Tipp wie ich mein Ziel erreiche?

Ich wäre euch sehr dankbar! :)

Bevor es kommt: JA diese Aufgabe ist für den Informatikunterricht, jedoch habe ich ja bereits viel geschrieben und als Mann der Ehre werde ich selbstverständlich auch entsprechende Quellen angeben. Ich hoffe ihr habt dennoch Lust mir zu helfen - wie gesagt, ein Tipp würde vlt. schon reichen! :)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Eingegebenes in Code zu übersetzen geht erst mal so nicht. Wäre ja auch ein ziemliches Sicherheitsproblem, weil man dann z.B. auch Dateien löschen könnte usf.

In deinem Falle wird es aber am einfachsten sein, doch das Eingegebene in Code zu übersetzen. Schau dir dazu mal `exec` an.

Etwa sowas:

Code: Alles auswählen

func = raw_input("Funktion: ")
namespace = {}
code = "def f(x): return %s" % func
exec code in namespace
func = namespace['f']
print func(5)
Wie gesagt, es ist allerdings mit so einer Methode möglich, dass man beliebigen Code ausführt in `f`, dazu gehört auch das Importieren von Modulen, mit denen dann z.B. Dateien gelöscht oder Befehle ausgeführt werden können (also *ALLES*).

Wenn du allerdings weißt, wie die Funktion aussieht (also z.B. Polynomfunktion nten Grades oder eine Exponentialfunktion), würde ich eher die einzelnen Parameter abfragen und dann daraus eine Funktion erzeugen.

Hier zum Beispiel mal für einen Polynomfunktion 3ten Grades:

Code: Alles auswählen

a = int(raw_input('a?'))
b = int(raw_input('b?'))
c = int(raw_input('c?'))
d = int(raw_input('d?'))

def make_cubic_function(a, b, c, d):
    def f(x):
        return a*x**3 + b*x**2 + c*x + d
    return f

f = make_cubic_function(a, b, c, d)
print f(5)
Dann könnte man dal anfangen zu verallgemeinern, also dass man Polynome beliebigen Grades erstellen kann.

Btw, in Python 2.x niemals `input` verwenden, sondern immer `raw_input`. `input` versucht das Eingegebene in einen Python-Typen magisch umzuwandeln. Dadurch kannst du nicht wissen, welchen Typen das eingegebene hat, was eine anständige Korrektheitsprüfung des Eingegebenen unmöglich macht.
Guardian
User
Beiträge: 3
Registriert: Donnerstag 3. März 2011, 18:31

Erst mal ein großes Dankeschön für deine schnelle Antwort und Bereitschaft mir zu helfen, aber das ist etwas zu komplex und erfüllt so wie ich das sehe nicht ganz den Zweck den es erfüllen soll. Wie ich evtl. hätte erwähnen sollen geht es dabei um eine Turtle-Grafik...

Gibt es keinen leichteren Weg das von input nach code umzustellen? :(
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Guardian hat geschrieben:Erst mal ein großes Dankeschön für deine schnelle Antwort und Bereitschaft mir zu helfen, aber das ist etwas zu komplex und erfüllt so wie ich das sehe nicht ganz den Zweck den es erfüllen soll. Wie ich evtl. hätte erwähnen sollen geht es dabei um eine Turtle-Grafik...

Gibt es keinen leichteren Weg das von input nach code umzustellen? :(
Nein. `exec` ist das einfachste.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

btw,
Guardian hat geschrieben:erfüllt so wie ich das sehe nicht ganz den Zweck den es erfüllen soll
was genau hättest du denn erwartet? Mit den beiden vorgestellten Methoden kannst du den User Funktionen eingeben lassen und dann Y-Werte für beliebige X-Werte der so erzeugten Funktion bestimmen. Was will man mehr :-)
Guardian
User
Beiträge: 3
Registriert: Donnerstag 3. März 2011, 18:31

Mh, ok - wie gesagt ich habe echt noch nicht viel Ahnung davon! :D

Bin schon sehr stolz auf das was ich mit diesem 'Programm' bis jetzt geschaffen habe, aber jeder fängt klein an! :P

Ich werde mal gucken wie ich zurecht komme, vielen dank für die kompetente und sehr DAU-freundliche Beratung! :K
Antworten