Ich habe ein Problem unzwar,
Ich will das bei einer Rechnung eine Kommazahl herauskommt ( nicht wie bei x=25 y=13 Z=x/y rauskommen tut 1) kommt immer diese Meldung: (Ich hab' die Werte über easygui herausgekriegt (AS und AD6 und P = ad6 * 6))
Traceback (most recent call last):
File "...", line 6, in <module>
P2 = P/AS
TypeError: unsupported operand type(s) for /: 'str' and 'str'
ich habs schon so probiert (variablen nehmen wir jetzt mal an haben den Wert AS=25 und AD6 = 13)
P = AD6 * 6
P2 = str(P) / str(AS)
auch schon so
P2 = str(P) / AS
so :
P2 = P / str(AS)
und so:
P2 = P / AS
könnt ihr mir helfen, dass am ende eine Kommazahl eherauskommt? :K
Viele Grüße Micky2010
Problem bei der Berechnung von Kommazahlen
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Die Meldung sagt doch alles. Du hast Strings und musst diese in ein passendes Zahlenformat wandeln. Dazu schau Dir in der Doku die Built-in Functions an.TypeError: unsupported operand type(s) for /: 'str' and 'str'
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Wie du dir die Built-in Functions in der Dokumentation anschauen kannst?Micky2010 hat geschrieben:Wie mache ich das?
Öffne einen Webbrowser. Gehe auf die Webseite http://www.python.org. Klicke auf "Documentation". Such die passende Python-Version und klick dort auf "Library Reference". Klicke dort auf "Built-in Functions".
Im Tutorial ist im 3. Kapitel übrigens ebenfalls die Funktion erwähnt, mit der du z.B. einen String in eine Fließkommazahl verwandeln kannst. Vielleicht solltest du dich wirklich erst einmal im Tutorial etwas weiter durcharbeiten bevor du an jeder Ecke mit einem Problem hängen bleibst.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Indem du hier draufklickst: http://docs.python.org/library/functions.html.Micky2010 hat geschrieben:Wie mache ich das?Hyperion hat geschrieben:[...] schau Dir in der Doku die Built-in Functions an.
In specifications, Murphy's Law supersedes Ohm's.
Hab' das Problem gelöst (selber) unzwar mit:
P2 = float(P) / float(AS)
print(P2)
Trotzdem, ihr habt mir sehr geholfen, danke
Frage geschlossen
_______________________________________________________________________________________________________________________
P2 = float(P) / float(AS)
print(P2)
Trotzdem, ihr habt mir sehr geholfen, danke
Frage geschlossen
_______________________________________________________________________________________________________________________
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Manus manum lavat (Eine Hand wäscht die andere)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Vielleicht ist das hier noch hilfreich:
Code: Alles auswählen
In [14]: import locale
In [15]: locale.setlocale(locale.LC_NUMERIC, "de_DE")
Out[15]: 'de_DE'
In [16]: locale.atof('2,3')
Out[16]: 2.2999999999999998
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Die Lösung ist, ich wandle die Strings in int's um.
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Manus manum lavat (Eine Hand wäscht die andere)
Ich meine so, hier der Quelltext:
Das ist der Code.
Viele Grüße Micky2010
Code: Alles auswählen
# -*- coding: cp1252 -*-
import easygui # importiert easygui ( Ein Modul)
def Notenberechnung():
pass
easygui.msgbox(msg="Wenn z.b. niemand eine 1 oder eine 5 geschrieben hat, bitte 0 eingeben, sonst funktioniert's nicht!", title="Wichtiger Hinweis")
AS = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche die Arbeit geschrieben haben eingeben', title='Bitte Schüleranzahl eingeben')
AD1 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 1 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 1 eingeben')
AD2 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 2 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 2 eingeben')
AD3 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 3 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 3 eingeben')
AD4 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 4 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 4 eingeben')
AD5 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 5 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 5 eingeben')
AD6 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 6 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 6 eingeben')
# holt die Werte durch easygui
AD1=int(AD1)#wandelt sie in ints um
AD2=int(AD2)
AD3=int(AD3)
AD4=int(AD4)
AD5=int(AD5)
AD6=int(AD6)
P6 = AD6 * 6 # rechnet anzahl der Schüler welche eine 6 geschrieben haben mal 6 wie bei 5,4,3,2,1
P5 = AD5 * 5
P4 = AD4 * 4
P3 = AD3 * 3
P2 = AD2 * 2
P1 = AD1 * 1
Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6) # rechnet die zuvor errechneten Werte zusammen
DS = float(Y) / float(AS) # rechnet Y durch die Anzahl der Schüler welche die Arbeit geschrieben haben
print(DS) # schreibt DS
if __name__ == '__main__':
Notenberechnung()
Viele Grüße Micky2010
Mal abgesehen, daß das eine umständliche Art ist ein gewichtetes Mittel zu berechnen ...
Was ist denn der Typ von P1-P6? Und wieso mußt Du diesen Typ dann in Integer wandeln? Und was wäre wenn AD1-AD6 schon floats wären, würde sich das Ergebnis verändern, würden alle weiteren Umwandlungen weggelassen? Und wenn man schon die Zahl der geschriebenen Arbeiten gesondert eingeben läßt, statt sie zu berechnen: Wäre es dann nicht sinnvoll eine Kontrolle einzubauen, ob die übrigen Nutzerangaben stimmig sind?
Und wozu eine Funktion, die nichts macht, hinter der __name__-Abfrage?
Nur mal so als Anregungen,
Gruß,
Christian
PS Vielleicht wären Funktionen wie 'map' auch mal interessant angeschaut zu werden?
Was ist denn der Typ von P1-P6? Und wieso mußt Du diesen Typ dann in Integer wandeln? Und was wäre wenn AD1-AD6 schon floats wären, würde sich das Ergebnis verändern, würden alle weiteren Umwandlungen weggelassen? Und wenn man schon die Zahl der geschriebenen Arbeiten gesondert eingeben läßt, statt sie zu berechnen: Wäre es dann nicht sinnvoll eine Kontrolle einzubauen, ob die übrigen Nutzerangaben stimmig sind?
Und wozu eine Funktion, die nichts macht, hinter der __name__-Abfrage?
Nur mal so als Anregungen,
Gruß,
Christian
PS Vielleicht wären Funktionen wie 'map' auch mal interessant angeschaut zu werden?
Das mit den Int's mach ich lieber zur Sicherheit, ich könnte es aber auch weglassen und dieser Weg ist der einfachste der mir eingefallen ist.
Viele Grüße Micky2010
Viele Grüße Micky2010
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Manus manum lavat (Eine Hand wäscht die andere)
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet. Außerdem bezog sich CMs Nachfrage nicht auf die Zeilesondern explizit auf die Zeilenwo du einen String in einen numerischen Typ umwandelst, und da kannst du gleich nach float umwandeln, statt nach int. Außerdem solltest du lernen, was es mit Schleifen und Listen auf sich hat.
Code: Alles auswählen
Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6)
Code: Alles auswählen
ADn=int(ADn)
In specifications, Murphy's Law supersedes Ohm's.
Warum sollte man einen Wert, der eine ganze Zahl sein muss besser gleich in eine Fließkommazahl umwandeln?pillmuncher hat geschrieben:"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet. Außerdem bezog sich CMs Nachfrage nicht auf die Zeilesondern explizit auf die ZeilenCode: Alles auswählen
Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6)
wo du einen String in einen numerischen Typ umwandelst, und da kannst du gleich nach float umwandeln, statt nach int.Code: Alles auswählen
ADn=int(ADn)
Weil am Ende ein float bei der Division herauskommen soll.
OK, jetzt ist natürlich wichtig zwischen Python 2.x und 3.x zu unterscheiden, aber ich habe mal 2.x unterstellt.
Gruß,
Christian
OK, jetzt ist natürlich wichtig zwischen Python 2.x und 3.x zu unterscheiden, aber ich habe mal 2.x unterstellt.
Gruß,
Christian
Naja, bei 2.x sollte man sowieso immer "from __future__ import division" in einer der ersten Zeilen haben wenn man etwas ausrechnen will. Anders darf man sich sowieso zu Tode debuggen.CM hat geschrieben:Weil am Ende ein float bei der Division herauskommen soll.
OK, jetzt ist natürlich wichtig zwischen Python 2.x und 3.x zu unterscheiden, aber ich habe mal 2.x unterstellt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
LOL - Deine Erfindung oder ist das ein bekanntes "Gleichnis"?pillmuncher hat geschrieben:"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ich habe das Programm umgeschrieben mit arrays und erstmal ohne easygui, mit inputs.
Bitte schreibt eure kritik dazu,
gut ich könnte die fors umbenennen.
LG Micky2010
P.S. kennt jemand ein gutes SQlite tutorial und kann man auch SQL importieren /benutze?
Code: Alles auswählen
# -*- coding: cp1252 -*-
noten = []
for z in range(1,7):
note = input("Bitte anzahl der "+str(z)+"-er eingeben.(Wenn null dann 0 eingeben):\n")
noten.append(note)
for y in range(0,6):
var = noten[y]
schueler = schueler + var
y_2 = var * (y + 1)
ges_noten = ges_noten + y_2
durchs = ges_noten / float(schueler)
print"Der Durchschnitt ist : %.3f" % durchs
gut ich könnte die fors umbenennen.
LG Micky2010
P.S. kennt jemand ein gutes SQlite tutorial und kann man auch SQL importieren /benutze?
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Manus manum lavat (Eine Hand wäscht die andere)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
- wieso codierst Du in diesem kruden Windows-Encoding und nicht in etwas sinnvollem wie utf-8? Es fehlt der Shebang.
- benutzt Du Python3 oder 2? Wenn 2, dann bitte ``raw_input`` nutzen!
- String-Konkatenation mit "+" ist ganz schlecht, per "%"-Operator schon besser, am besten per ``"".format()`` Methode!
- wieso muss die erste Schleife bei "1" anfangen?
- wieso fängt die zweite bei "0" an, wo Du dort wohl die "1" benötigst? Du willst Dort aber auch einfach ``enumerate`` nutzen - dann sparst Du Dir diese Überlegungen (ok, da solltest Du auch den Start auf "1" setzen)
- ``y`` und ``y_2`` sind sehr schlechte Namen - was soll man mit ``y`` anfangen? Da denkt man eher an eine Koordinate... (``ges_noten`` und vor allem ``durchs`` sind das natürlich auch)
- die Anzahl der Schüler kannst Du einfacher so berechnen:
- die letzte for-Schleife kann man auch durch einen Generator-Ausdruck ersetzen:
Aber ok, dass muss man als Anfänger nicht Immerin habe ich Dir schon mal die Verwendung von ``enumerate`` verraten...
- Du verwendest also doch Py2 (hab das ``print`` erst jetzt gesehen). Also beachte die obigen Hinweise!
- Code auf Modulebene - das solltest Du in Funktionen auslagern.
@SQL-Fragen: Für neues Thema bitte einen neuen Thread erstellen. Klar sind mir diese Fragen so auch noch nicht. Also formuliere das am besten in einem separaten Thread noch mal neu
- benutzt Du Python3 oder 2? Wenn 2, dann bitte ``raw_input`` nutzen!
- String-Konkatenation mit "+" ist ganz schlecht, per "%"-Operator schon besser, am besten per ``"".format()`` Methode!
- wieso muss die erste Schleife bei "1" anfangen?
- wieso fängt die zweite bei "0" an, wo Du dort wohl die "1" benötigst? Du willst Dort aber auch einfach ``enumerate`` nutzen - dann sparst Du Dir diese Überlegungen (ok, da solltest Du auch den Start auf "1" setzen)
- ``y`` und ``y_2`` sind sehr schlechte Namen - was soll man mit ``y`` anfangen? Da denkt man eher an eine Koordinate... (``ges_noten`` und vor allem ``durchs`` sind das natürlich auch)
- die Anzahl der Schüler kannst Du einfacher so berechnen:
Code: Alles auswählen
>>> noten = [2, 5, 8, 5, 2, 0]
>>> sum(noten)
22
Code: Alles auswählen
>>> sum((count*note for count, note in enumerate(noten, 1)))
66
- Du verwendest also doch Py2 (hab das ``print`` erst jetzt gesehen). Also beachte die obigen Hinweise!
- Code auf Modulebene - das solltest Du in Funktionen auslagern.
@SQL-Fragen: Für neues Thema bitte einen neuen Thread erstellen. Klar sind mir diese Fragen so auch noch nicht. Also formuliere das am besten in einem separaten Thread noch mal neu
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert