Probleme mit Mathematischer Formel

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
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Freitag 14. September 2007, 23:22

Hallo,

ich habe mich jetzt endlich durchgerungen mit Python anzufangen. Es geht auch ganz gut voran aber nun habe ich ein paar Probleme. Ich will ein Pogramm schreiben das eine Mathematische Formel berechnet. Diese Formel soll als Funktion geschrieben werden. Um das alles noch etwas zu erschweren wollte ich diese Funktion in ein externes Modul packen und per 'import' laden.

Hier mal der Code der Funktion:

Code: Alles auswählen

def calc_awp(a,b):
	c = ((2 * a) / (a + b)) * b
	print c


Und nun mal die Fehler Meldung des Python Interpreters:

Code: Alles auswählen

Traceback (most recent call last):
  File "ofmtrainer.py", line 9, in <module>
    mymodule.calc_awp(ep,tp)
  File "/home/nico/Scripting/mymodule.py", line 5, in calc_awp
    c = ((2 * a) / (a + b)) * b
TypeError: unsupported operand type(s) for /: 'str' and 'str'
besonders irritierend finde ich den letzten Teil: TypeError: unsupported operand type(s) for /: 'str' and 'str'

Kann mir evtl jemand Helfen wo der Fehler ist? Folgende dinge habe ich schon getan zur Fehlerüberprüfung:

- Die Funktion in die eigtl Datei kopiert und von dort aufgerufen
- Die Formel komplett auseinandergenommen und mit mehreren Variablen berechnet
- den Divisionsoperator '/' als Test durch andere Operatoren ersetzt, allerdings wird dann nur ein anderer Operator als Fehlerhaft angezeigt

Mit freundlichen Grüßen

bankkind[/quote][/code]
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. September 2007, 23:28

Ich tippe mal, das a und b keine Zahlen sind, sondern Strings... Füge mal ein print type(a), type(b) ein...

Die Frage ist, woher kommen deine Zahlen überhaupt? Zeig mal den gesamten Quellentext aller Dateien...

Schau mal hier:

Code: Alles auswählen

>>> a = "1"
>>> print a
"1"
>>> print type(a)
<type 'str'>
>>> a = int(a)
>>> print a
1
>>> print type(a)
<type 'int'>
>>>

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Freitag 14. September 2007, 23:46

Ja der Tip war schon mal gut, der typ bei den entscheidenden Variablen ist 'str'.

Hier aber erstmal der Komplette Code. Das Programm ist also noch recht klein.

Code: Alles auswählen

import mymodule

print 'EP:'
ep = raw_input()
print 'TP:'
tp = raw_input()

print type(ep), type(tp)

mymodule.calc_awp(ep,tp)
Ich habe jetzt den dummen verdacht das durch 'raw_input()' der Typ in str gewandelt wird. Kann das so sein?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Freitag 14. September 2007, 23:51

bankkind hat geschrieben:Ich habe jetzt den dummen verdacht das durch 'raw_input()' der Typ in str gewandelt wird.
Hallo bankkind!

Willkommen im Python-Forum!

Ja. ``raw_input()`` gibt immer einen String zurück. Diesen String kannst du mit ``int()`` in eine Ganzzahl und mit ``float()`` in eine Fließkommazahl umwandeln. Danach kann damit gerechnet werden.

Achte auch darauf, dass mit ``/`` Ganzzahldivisionen durchgeführt werden, wenn beide Werte Ganzzahlen sind. Wenn mindestens einer der Werte eine Fließkommazahl ist, dann gibt ``/`` eine Fließkommazahl zurück.

mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Samstag 15. September 2007, 00:09

Super, Danke.

Klappt alles so wie ich was wollte. Jetz kann ich morgen weiter machen.

Bis dann
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 15. September 2007, 08:27

Du hättest natürlich statt raw_input() nur input() nehmen können, was aber eigentlich keine gute Idee ist, siehe: [wiki]Thema Sicherheit#Input[/wiki]

Um das umwandeln, kann man prima ein try-except machen, wenn jemand statt einer Zahl ein anderes Zeichen eingibt... Ein Beispiel dafür findest du hier: http://www.python-forum.de/post-75859.html#75859

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

Samstag 15. September 2007, 09:03

jens hat geschrieben:Du hättest natürlich statt raw_input() nur input() nehmen können, was aber eigentlich keine gute Idee ist, siehe: [wiki]Thema Sicherheit#Input[/wiki]
Warum erwähnst du es dann eigentlich? ;)
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Sonntag 16. September 2007, 16:16

Ich muss das Thema nocheinmal aufgreifen.

Ich will das Modul jetzt nämlich so ändern, dass ich die Variable 'c' aus dem Modul abfragen will im Hauptprogramm. Geht das irgendwie?

ich hatte es so probiert:

Code: Alles auswählen

awp = mymodule.calc_awp.c
das hat allerdings nicht funktioniert.

Also die Frage: Gibt es eine Möglichkeit eine Variable abzufragen aus einer externen Funktion? Die Funktion wurde eine Zeile davor aufgerufen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 16. September 2007, 16:30

bankkind hat geschrieben:Ich will das Modul jetzt nämlich so ändern, dass ich die Variable 'c' aus dem Modul abfragen will im Hauptprogramm. Geht das irgendwie?
Ja, mit globals. Nicht empfehlenswert, lass so etwas lieber.
bankkind hat geschrieben:ich hatte es so probiert:

Code: Alles auswählen

awp = mymodule.calc_awp.c
das hat allerdings nicht funktioniert.
Wenn ``calc_awp()`` ein ``return c`` machen würde (wozu ich sowieso raten würde), dann könntest du ``awp = mymodule.calc_awp()`` machen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten