Problem bei der Berechnung von Kommazahlen

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.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Hyperion hat geschrieben:-

- String-Konkatenation mit "+" ist ganz schlecht, per "%"-Operator schon besser, am besten per ``"".format()`` Methode!

- wieso muss die erste Schleife bei "1" anfangen?
das mit format schnall ich nicht, deswegen fang ich die Schleife bei 1 an.
:lol: :lol:
LG Micky2010
P.S. erklär mir das mit dem format bitte.
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, das mit der ersten Schleife war mein Fehler ;-)
Micky2010 hat geschrieben: P.S. erklär mir das mit dem format bitte.
http://docs.python.org/library/string.h ... matstrings
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich verstehs immer noch nicht, ich hab versucht diesen {players[0]} Befehl it listen, Tupels und diesen komischen {} listen von denen ich immer noch immer nich verstehe wie ich sie aufbaue!

LG 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)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Micky2010 hat geschrieben:Ich verstehs immer noch nicht, ich hab versucht diesen {players[0]} Befehl it listen, Tupels und diesen komischen {} listen von denen ich immer noch immer nich verstehe wie ich sie aufbaue!
Ich verstehe den Satz nicht!

Die ``format``-Methode bei Strings hat erst einmal nichts mit Listen oder anderen Datenstrukturen zu tun! Sie ermöglicht es einem, variable Zeichenketten zu generieren, indem man Platzhalter im String einbaut, welche Python dann während der Laufzeit durch die in der ``format``-Methode angegebenen Objekte ersetzt.

Beispiele dazu stehen doch in der Doku!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich hab ein Problem:
Wenn ich die beiden fors mit der liste in eine def packe kommt das:
(code)

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
import sqlite3
var = os.path.exists("notendb.dll")

def main():
    notenliste = []
 
for note in range(1,7):
               noten = input("Bitte anzahl der %i-er eingeben.(Wenn null dann 0 eingeben):\n" % note)
               notenliste.append(noten)
schueler = sum(notenliste)
ges_noten = 0
for y in range(0,6):
    var = notenliste[y]
    y_2 = var * (y + 1)
    ges_noten = ges_noten + y_2



durchs = ges_noten / float(schueler)
print"Der Durchschnitt ist : %.3f" % durchs
if __name__=="__main__":
main()
Fehler:

Code: Alles auswählen

Bitte anzahl der 1-er eingeben.(Wenn null dann 0 eingeben):
5
Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Micky2010\Desktop\Kopie (2) von Notenberechnung.py", line 11, in <module>
    notenliste.append(noten)
NameError: name 'notenliste' is not defined
ohne def gehts!!!(und ohne das main..
was mach ich falsch??
LG Micky2010
P.S. die module verwende ich noch!
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was Du falsch machst? Gehen wir mal durch:

- Du gibst einer Variable* "var" einen Wahrheitswert, den Du nie abfragst - aber "var" wird weiter unten einfach so überschrieben.
- Du definierst eine Funktion "main", die keine Funktionalität enthält - außer in ihrem Namensraum eine leere Liste zu kreieren.
- Du verkapselst die nachfolgende Funktionalität nicht, sondern läßt den Interpreter in einer Schleife in die nicht definierte "notenliste" schreiben - und wunderst Dich über die Fehlermeldung.
- Noch davor verwendest Du "input" in Python 2.x, was ich nicht weiter kommentieren möchte.
- Du bindest eine Summe, also eine Zahl, an einen Namen "schueler", der semantisch keine Zahl sein kann - das weiß der Interpreter nicht, führt aber auch bei Dir zu Verwirrung, wenn Du mal was Größeres schreibst und Dir dieses nicht ganz schnell abgewöhnst.
- Du berechnest einen Durchschnitt auf eine denkbar komplizierte Weise: 1. kann man in Python direkt über die Elemente einer Liste iterieren (z. B. "for var in notenliste"), 2. gibt es den "+=" Operator für Summen und 3. gibt es enumerate und 4. - aber das ist noch mehr meine Meinung als der Rest des Beitrags - kann man das ziemlich einfach zusammendampfen und dennoch Übersicht behalten.
- Und kurz nach der letzten Ausgabe läßt Du die sinnlose main-Funktion aufrufen (s.o.)

Hinweise: Lies Dir mal das Tutorial zu Python durch. Und dann gehe mit dem neu erworbenen Wissen Deine Aufgabe Schritt für Schritt an - Was erfährt der Interpreter von Deinem Code in welcher Zeile? Das wird Dir weiterhelfen.

HTH
Christian

* Ja, in Python stimmt das mit den Variablen nicht so ganz ...
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

CM hat geschrieben:Was Du falsch machst? Gehen wir mal durch:
- Du gibst einer Variable* "var" einen Wahrheitswert, den Du nie abfragst - aber "var" wird weiter unten einfach so überschrieben.
Ja, mein Fehler, den os Teil hatte ich nur schnell dazugeschrieben,
Und das mit der Notenliste, ich hab die "große" bedeutung der einrückungen vergessen.
wieso raw_input? achso, ja, die "werte",
und das mit den schueler kapier ich nicht, warum das jetzt falsch ist, achso ja, strings, mach ich noch dazu(string in int umwandlung)
das mit der notenliste, gut mach ich auch noch.
Danke für die Anregung.
LG 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)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ein "Schüler" ist eine Person - keine Zahl. Deswegen sprach ich die Semantik an. Das mag Dir pedantisch vorkommen, es ist jedoch einfacher die Dinge nach dem zu benennen, was sie darstellen. Oft verwenden Leute - damit die Bezeichner nicht ewig lang werden - einfach ein 'n', stehend für 'number', als Präfix für Zahlen. Das wäre dann z. B. 'nstudents'. Du kannst das auch anders sehen oder anders umsetzen, aber, Amen ich sage Dir: Wenn Du Monate nach dem Schreiben einiger tausend Zeilen wieder auf Deinen Code schaust, wirst Du Probleme bekommen, wenn die Bezeichner, die Du verwendest, nicht so weit wie möglich für sich selbst sprechen.

Bzgl. der "großen" Bedeutung der Einrückung in Python: Sorry, da sind die Anführungsstriche unangebracht und das hat auch nix mit Pedantik zu tun - da fehlt auch alle Ironie ;-). Die Einrückung ist Teil der Syntax und damit werden wir Forumsteilnehmer den Code so lesen wie der Interpreter und nur manchmal so kreativ sein können den OPs zu sagen, dass hier ein Problem liegt.

Das mit 'input' vs. 'raw_input' hat man schon versucht Dir zu erklären - es gibt aber auch 1001 Threads in denen das hier im Forum beackert wird. Alternativ kannst Du auf Python 3.x umsteigen.

HTH
Christian
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hyperion hat geschrieben:
pillmuncher hat geschrieben:"Zur Sicherheit" ein int in ein int wandeln ist wie wenn man mit der Taschenlampe nachschaut, ob die Deckenlampe leuchtet.
LOL - Deine Erfindung oder ist das ein bekanntes "Gleichnis"?
Ist doch voll pragmatisch und so. 8)
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich hab ein Problem, unzwar bei dieser eingabe kommt diese doofe Fehlermeldung!
(

Code: Alles auswählen

Bitte anzahl der 1-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 2-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 3-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 4-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 5-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 6-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte Klasse eingeben5
Der Durchschnitt ist : 3.500
['5', 3.5, (2011, 8, 13)]
Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\*\Desktop\Ergebnis.py", line 46, in <module>
    funktion()
  File "C:\Dokumente und Einstellungen\*\Desktop\Ergebnis.py", line 43, in funktion
    Notenberechnung()
  File "C:\Dokumente und Einstellungen\R*\Desktop\Ergebnis.py", line 36, in Notenberechnung
    %s, %.F3, '%.F3')"""% Argumente)
TypeError: not enough arguments for format string
)
Ja gut der Code ist noch in Bearbeitung!! Also bitte keine Allzuharte kritik!
Hier der code:

Code: Alles auswählen

import sqlite3 
import time
def db():
    connection = sqlite3.connect("noten_db.dll")
    global cursor
    cursor = connection.cursor()
    cursor.execute("Select name FROM sqlite_master") 
    row = cursor.fetchone()
    if row == None:
        cursor.execute("""CREATE TABLE noten (
        Klasse TEXT, Durchschnitt REAL, Datum REAL)""")  
    
def Notenberechnung():
    liste = []
    Argumente = []
    for note in range(1,7):
               noten = input("Bitte anzahl der %i-er eingeben.(Wenn null dann 0 eingeben):\n" % note)
               liste.append(noten)
    klasse = raw_input("Bitte Klasse eingeben")
    Argumente.append(klasse)
    nstudents = sum(liste)
    n_notsum = 0
    for y in range(0,6):
        var = liste[y]
        y_2 = var * (y + 1)
        n_notsum = n_notsum + y_2
        n_durchs = n_notsum / float(nstudents)

    print"Der Durchschnitt ist : %.3f" % n_durchs
    Argumente.append(n_durchs)
    x = time.localtime()
    Datum = x[0:3]
    Argumente.append(Datum)
    print Argumente
    cursor.execute("""INSERT INTO noten VALUES (
    %s, %.F3, '%.F3')"""% Argumente)
    
    


def funktion():
    db()
    Notenberechnung()


funktion()
#%d, %d, '%s', '%s', %d)" % werte  Das ist eine Notiz
Wie kann ich dieses Problem beheben??
LG 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)
BlackJack

@Micky2010: In der Zeichenkette sind drei Platzhalter, Du übergibst aber nur *ein* Objekt, nämlich eine Liste. Wenn dort mehrere Objekte übergeben werden sollen, dann müssen die in einem Tupel stecken. Dann ist das nächste Problem aber, dass der dritte Platzhalter für eine Gleitpunktzahl ist, Du aber ein Tupel übergibst. Und die 3 bei den Platzhaltern ist ziemlich sicher an der falschen Stelle.

Die Werte sollte man allerdings nicht in die Zeichenkette hineinformatieren, sondern die für den verwendeten Datenbankadapter vorgesehenen Platzhalter und das zweite Argument der `execute()`-Methode benutzen.

Last but not least solltest Du das ``global`` loswerden. Werte ausser Konstanten sollten Funktionen als Argumente übergeben werden und nicht magisch irgendwo aus der Umgebung kommen.

Die Dateiendung 'dll' für eine Datenbankdatei ist etwas ungünstig. Das ist unter Windows eine übliche Endung für dynamisch ladbare Bibliotheken mit Maschinencode, beziehungsweise seit einiger Zeit auch .NET-Bytecode.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Das hab ich geändert, aber wenn ich warte kommt dann diese Fehlermeldung:

Code: Alles auswählen

Bitte anzahl der 1-er eingeben.(Wenn null dann 0 eingeben):
0
Bitte anzahl der 2-er eingeben.(Wenn null dann 0 eingeben):
0
Bitte anzahl der 3-er eingeben.(Wenn null dann 0 eingeben):
0
Bitte anzahl der 4-er eingeben.(Wenn null dann 0 eingeben):
5
Bitte anzahl der 5-er eingeben.(Wenn null dann 0 eingeben):
0
Bitte anzahl der 6-er eingeben.(Wenn null dann 0 eingeben):
6
Bitte Klasse eingeben:
5
Der Durchschnitt ist : 5.091
(5, 5.0909090909090908, 2011, 8, 13)
Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\*\Desktop\Ergebnis.py", line 49, in <module>
    Notenberechnung()
  File "C:\Dokumente und Einstellungen\*\Desktop\Ergebnis.py", line 46, in Notenberechnung
    connection.commit()
OperationalError: database is locked
Der Python code:

Code: Alles auswählen

import sqlite3 
import time
def Notenberechnung():
    liste = []
    for note in range(1,7):
               noten = input("Bitte anzahl der %i-er eingeben.(Wenn null dann 0 eingeben):\n" % note)
               liste.append(noten)
    klasse = input("Bitte Klasse eingeben:\n")
    nstudents = sum(liste)
    n_notsum = 0
    for y in range(0,6):
        var = liste[y]
        y_2 = var * (y + 1)
        n_notsum = n_notsum + y_2
        n_durchs = n_notsum / float(nstudents)

    print"Der Durchschnitt ist : %.3f" % n_durchs
    x = time.localtime()
    Date1 = x[0:3]
    Date2 = Date1[0]
    Date3 = Date1[1]
    Date4 = Date1[2]
    Argumente = (klasse,n_durchs,Date2,Date3,Date4)
    print Argumente
    connection = sqlite3.connect("noten_db2.db")
    cursor = connection.cursor()
    cursor.execute("Select name FROM sqlite_master") 
    row = cursor.fetchone()
    if row == None:
        cursor.execute("""CREATE TABLE noten (
        Klasse TEXT, Durchschnitt REAL, Date INTEGER, Date2 INTEGER, Date3 INTEGER)""")  
    if row != None:
        pass
    cursor.execute("""INSERT INTO noten VALUES (
    %s, %f, %d, %d, %d )"""% Argumente)
    connection.commit()

    
Notenberechnung()
Wenn die db noch nicht da war, gents einwandfrei, aber wenns die db schon ibt, dann ist meckern angesagt für Python
LG 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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich gebe mal einen Tipp ab: du arbeitest mit Idle?
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich tippe eher auf ein fehlendes `connection.close()` und das deshalb das lock nich aufgeraeumt wird.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Gut hab ich gemacht, das Programm schreibt aber immer noch nicht die neuen Daten in die DB!!

LG 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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

cofi hat geschrieben:Ich tippe eher auf ein fehlendes `connection.close()` und das deshalb das lock nich aufgeraeumt wird.
Deshalb mein Tipp mit Idle.
Das Leben ist wie ein Tennisball.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Ich arbeite mit IDLE!!!!
LG 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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Wie sieht denn der aktuelle Stand deines Codes aus?

Sebastian
Das Leben ist wie ein Tennisball.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Code: Alles auswählen

import sqlite3 
import time
def Notenberechnung():
    liste = []
    for note in range(1,7):
               noten = input("Bitte anzahl der %i-er eingeben.(Wenn null dann 0 eingeben):\n" % note)
               liste.append(noten)
    klasse = input("Bitte Klasse eingeben:\n")
    nstudents = sum(liste)
    n_notsum = 0
    for y in range(0,6):
        var = liste[y]
        y_2 = var * (y + 1)
        n_notsum = n_notsum + y_2
        n_durchs = n_notsum / float(nstudents)

    print"Der Durchschnitt ist : %.3f" % n_durchs
    x = time.localtime()
    Date1 = x[0:3]
    Date2 = Date1[0]
    Date3 = Date1[1]
    Date4 = Date1[2]
    Argumente = (klasse,n_durchs,Date2,Date3,Date4)
    print Argumente
    connection = sqlite3.connect("noten_db2.dll")
    cursor = connection.cursor()
    cursor.execute("Select name FROM sqlite_master") 
    row = cursor.fetchone()
    if row == None:
        cursor.execute("""CREATE TABLE noten (
        Klasse TEXT, Durchschnitt REAL, Date INTEGER, Date2 INTEGER, Date3 INTEGER)""")  
    if row != None:
        pass
    cursor.execute("""INSERT INTO noten VALUES (
    %s, %f, %d, %d, %d )"""% Argumente)

    connection.close()
    
Notenberechnung()

Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

*kleinlaut* bekomm ich bitte noch eine antwort :shock: :shock: :shock: :shock: :K :K
LG
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)
Antworten