Neuling sucht Rat

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.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@BlackJack: *Der* Kalkül. Auch wenn's komisch klingt. ;)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Code: Alles auswählen

import random

def tabellenkopf():
    print("{0:15}{1:15}{2:15}{3:15}{4:15}".format("Tag","KM Stand","KM Stand","KM in eine","Gesamt KM"))
    print("{0:15}{1:15}{2:15}{3:15}{4:15}".format("   ","Fahrtbeginn", "Fahrtende", "Richtung","  "))

def erzeugenTabelle(kmStand, arbeitsTage):
    zuschussStrecke = 0
    for i in range(1,arbeitsTage+1,1):
        fahrtStreckeGesamt  = random.randint(80,83)
        fahrtStreckeEinfach = fahrtStreckeGesamt/2

        ChancePrivat = random.randint(1,4)
        if ChancePrivat == 1:
            privatStrecke = random.randint(5,25)

        else:
            privatStrecke = 0

        
        print("{0:15}{1:15}{2:15}{3:15}{4:15}".format(i, kmStand, kmStand+fahrtStreckeGesamt, fahrtStreckeEinfach, fahrtStreckeGesamt))
        kmStand         = fahrtStreckeGesamt + kmStand + privatStrecke
        zuschussStrecke += fahrtStreckeEinfach
    return zuschussStrecke
        
        
        
def berechnungZuschuss(zuschussStrecke):
    zuschussJeKM = 0.17
    zuschuss = zuschussStrecke * zuschussJeKM
    print("Der Zuschuss beträgt {0:5.2f} Euro".format(zuschuss))
    









#Hauptprogramm
x=0
while x==0:
    kmStand = input("Kilometerstand am Ende des letzten Monats: ")
    try:
        kmStand = int(kmStand)
        x=1
        
    except:
        print("Falsche Eingabe")
        continue

x==1
while x==1:

    arbeitsTage = input("Wieviel Tage wurden diesen Monat gearbeitet: ")
    try:
        arbeitsTage = int(arbeitsTage)
        x=0
    except:
        print("Falsche Eingabe")
        continue

tabellenkopf()
zuschussStrecke = erzeugenTabelle(kmStand, arbeitsTage)
berechnungZuschuss(zuschussStrecke)




So - das ist dann wohl V.100 aber nehmen wirs einfach mal her um Beispiele zu haben.

Code: Alles auswählen

def tabellenkopf():
    print("{0:15}{1:15}{2:15}{3:15}{4:15}".format("Tag","KM Stand","KM Stand","KM in eine","Gesamt KM"))
    print("{0:15}{1:15}{2:15}{3:15}{4:15}".format("   ","Fahrtbeginn", "Fahrtende", "Richtung","  "))

Ist wohl ein Fehler da es nicht wirklich was "macht" - ich dachte nur - es ist mühsames schreiben - irgendwie liegen mir diese { } noch nicht so - und könnte ja sein das man den "Kopf" an anderer Stelle nochmal braucht.

Code: Alles auswählen

def erzeugenTabelle(kmStand, arbeitsTage):
    zuschussStrecke = 0
    for i in range(1,arbeitsTage+1,1):
        fahrtStreckeGesamt  = random.randint(80,83)
        fahrtStreckeEinfach = fahrtStreckeGesamt/2

        ChancePrivat = random.randint(1,4)
        if ChancePrivat == 1:
            privatStrecke = random.randint(5,25)

        else:
            privatStrecke = 0

        
        print("{0:15}{1:15}{2:15}{3:15}{4:15}".format(i, kmStand, kmStand+fahrtStreckeGesamt, fahrtStreckeEinfach, fahrtStreckeGesamt))
        kmStand         = fahrtStreckeGesamt + kmStand + privatStrecke
        zuschussStrecke += fahrtStreckeEinfach
    return zuschussStrecke
Das macht wohl zuviel und ist nicht im Sinne kurz und übersichtlich? Aber bei meinem momentanen Wissensstand wüsste ich nicht wie ich die Werte von mehreren Funktionen in meine Tabelle geschrieben bekomme.

Code: Alles auswählen

def berechnungZuschuss(zuschussStrecke):
    zuschussJeKM = 0.17
    zuschuss = zuschussStrecke * zuschussJeKM
    print("Der Zuschuss beträgt {0:5.2f} Euro".format(zuschuss))
Das müsste wenn ich es richtig verstanden habe "ideal" sein - es bekommt Parameter übergeben - bearbeitet diese und gibt diese aus - evtl .sollte man hier noch ein return einbauen - aber bei meiner momentanen Version benötige ich diesen Wert ja nicht mehr weiter.


Abschließend noch die Frage ob

Code: Alles auswählen

#Hauptprogramm
x=0
while x==0:
    kmStand = input("Kilometerstand am Ende des letzten Monats: ")
    try:
        kmStand = int(kmStand)
        x=1
        
    except:
        print("Falsche Eingabe")
        continue

x==1
while x==1:

    arbeitsTage = input("Wieviel Tage wurden diesen Monat gearbeitet: ")
    try:
        arbeitsTage = int(arbeitsTage)
        x=0
    except:
        print("Falsche Eingabe")
        continue

das so ok ist - oder sollte das auch in eine(oder zwei) Funktionen?
lunar

@BlackJack Nun, "quickcheck" ist auch ein Feature von Isabelle, womit man durchaus die Korrektheit von Funktionen mittels Hoare-Kalkül beweisen kann. Der Kreis schließt sich ;)
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das mit der Formatierung im Tabellenkopf könnte man auch so machen:

Code: Alles auswählen

>>> ueberschriften = ["Tag","KM Stand","KM Stand","KM in eine","Gesamt KM"]
>>> kopfzeile = ''.join('{:15}'.format(text) for text in ueberschriften)
>>> print(kopfzeile)
Tag            KM Stand       KM Stand       KM in eine     Gesamt KM 
Oder als Funktion:

Code: Alles auswählen

def gib_kopfzeile(ueberschriften):
    return ''.join('{:15}'.format(text) for text in ueberschriften)

print(gib_kopfzeile(["Tag","KM Stand","KM Stand","KM in eine","Gesamt KM"]))
Oder vielleicht auch so:

Code: Alles auswählen

>>> print((len(ueberschriften) * '{:15}').format(*ueberschriften))
Tag            KM Stand       KM Stand       KM in eine     Gesamt KM
Möglich wäre aber auch dies:

Code: Alles auswählen

>>> print(*map('{:15}'.format, ueberschriften), sep='')
Tag            KM Stand       KM Stand       KM in eine     Gesamt KM      
Letzteres in Funktionsform und ein bißchen erweitert:

Code: Alles auswählen

def gib_kopfzeile_aus(ueberschriften, spaltenbreite=15):
    vorlage = '{{:{}}}'.format(spaltenbreite)
    print(*map(vorlage.format, ueberschriften), sep='')
Wie immer gilt der Hinweis, dass `print` in einer Funktion meistens keine gute Idee ist, da nicht wirklich testbar und eingeschränkt in der Verwendbarkeit.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Also hab ich mal wieder die schlechteste Möglichkeit getroffen ja -.-" ....is auch ein Talent
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tengel: es ist sehr schwierig, beim ersten Schritt perfekten Code zu schreiben. Jeder verbessert seinen Code kontinuierlich. Extrahiert Funktionen, schreibt sie allgemeiner, fügt Optionen hinzu, usw.
Ich hab an Deinem Programm noch ein paar Kleinigkeiten geändert:

Code: Alles auswählen

from itertools import zip_longest, chain
import random

def input_int(prompt):
    """Input an int"""
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("Falsche Eingabe")


def str_table(header, data, column_width=15):
    """Convert table to string representation"""
    header_lines = [text.split('\n') for text in header]
    head = zip_longest(*header_lines, fillvalue='')
    template = "{{:{}}}".format(column_width)*len(header)
    return '\n'.join(template.format(*line)
        for line in chain(head, data))
    

def create_table(km_stand, arbeits_tage):
    result = []
    zuschuss_strecke = 0
    for tag in range(1,arbeits_tage+1):
        fahrtstrecke_gesamt  = random.randint(80,83)
        fahrtstrecke_einfach = fahrtstrecke_gesamt/2
        privatstrecke = random.randint(5,25) if random.randint(1,4)==1 else 0
        result.append((tag, km_stand, km_stand+fahrtstrecke_gesamt, fahrtstrecke_einfach, fahrtstrecke_gesamt))
        km_stand += fahrtstrecke_gesamt + privatstrecke
        zuschuss_strecke += fahrtstrecke_einfach
    return result, zuschuss_strecke
        

def calc_zuschuss(zuschuss_strecke):
    return 0.17 * zuschuss_strecke
    

HEADER = ("Tag","KM Stand\nFahrtbeginn","KM Stand\nFahrtende","KM in eine\nRichtung","Gesamt KM")

def main():
    km_stand = input_int("Kilometerstand am Ende des letzten Monats: ")
    arbeits_tage = input_int("Wieviel Tage wurden diesen Monat gearbeitet: ")
    data, zuschuss_strecke = create_table(km_stand, arbeits_tage)
    zuschuss = calc_zuschuss(zuschuss_strecke)
    print(str_table(HEADER, data))
    print("Der Zuschuss betraegt {0:5.2f} Euro".format(zuschuss))

if __name__=='__main__':
    main()
Jede Funktion sollte nur eine Sache machen, und die so allgemein wie möglich/nötig.
Zum Beispiel »erzeugenTabelle« erzeugt eine Tabelle, wandelt sie in einen String um und gibt diesen aus.
Was passiert, wenn Du die Ausgabe in eine Datei schreiben, oder die Tabelle in Excel importieren willst?
Du brauchst eine komplett neue Funktion.
Ich habe drei Funktionen, »create_table« erzeugt nur die Daten, »str_table« wandelt sie in einen String, »print« gibt sie auf dem Bildschirm aus.

Code: Alles auswählen

with open('datei','w') as output:
    output.write(str_table(HEADER, data))
schreibt die selbe Ausgabe in eine Datei.

Code: Alles auswählen

import csv
with open('datei.csv','w') as output:
    csv_out = csv.writer(output)
    csv_out.writerow(HEADER)
    csv_out.writerows(data)
erzeugt eine csv-Datei.
Dadurch bin ich viel freier, und kann einmal geschriebenen Code viel öfter wiederverwenden.
Lass Dich nicht entmutigen. Ich will Dir nur zeigen, wohin Dein Weg noch gehen kann. Bis ich auf diesem Niveau war, sind einige Jahre vergangen. Aber ich finde, an guten Beispielen lässt sich am besten lernen.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tengel hat geschrieben:Also hab ich mal wieder die schlechteste Möglichkeit getroffen ja -.-" ....is auch ein Talent
Du hast halt noch nicht die Erfahrung, um zu wissen, dass es auch anders geht. Zum einen muss man ja erstmal die Standardbibliothek von Python sowie dessen Sprachmittel in ausreichendem Umfang kennen. Und zum anderen ist auch die "Programmier-Denke", sowie die Fähigkeit, möglichst idiomatischen Code in der jeweiligen Sprache (anders ausgedrückt: "sprachtypischen" Code) zu schreiben, eine reine Trainingssache, wenn du so willst.

Ich selbst bin vor circa 5 Jahren mit Python angefangen und habe mit dieser Sprache gelernt, zum ersten Mal "richtig" zu programmieren. Dabei habe ich mich je nach Zeit und Motivation mal mehr, mal weniger mit der Materie befasst. Meine Programme von damals waren in einer Qualität, die ich schon fast gar nicht mehr zeigen möchte. Vielleicht höchtens noch als Beispiel für die typische Weiterentwicklung vom totalen Anfänger zum - wenn ich das so sagen darf - Fortgeschrittenen.

Will sagen: Wenn du am Ball bleibst und dich wirklich stetig verbesseren willst, wenn du vor allem auch in fremdem Code nach Vorbildern guckst und wenn du dich nicht allzu dumm bei der Sache anstellst, dann wird das schon. Es ist halt so, dass man im wahrsten Sinne des Wortes eine neue Sprache lernt. Mit allem, was dazu gehört: Vokabeln, Grammatik, Ausdrucksweise, etc. Das alles muss erstmal in einem reifen und verstanden werden. Das braucht halt seine Zeit.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Wie wichtig ist den ein Kapitel über Datenbanken?

Code: Alles auswählen


import sqlite3

#Verbindung zur Datenbank erzeugen
connection = sqlite3.connect("firma.db")

#Datensatzcursor erzegen
cursor = connection.cursor()

#Tabelle erzeugen
sql = "Create Table personen("\
      "name Text,"\
      "vorname Text,"\
      "personalnummer INTEGER PRIMARY KEY,"\
      "gehalt FLOAT,"\
      "geburtstag TEXT)"
cursor.execute(sql)

#Datensatz erzeugen
sql = "Insert INTO personen VALUES('Maier',"\
      "'Hans',6714, 3500,'15.03.1962')"
cursor.execute(sql)
connection.commit()

#Datensatz erzeugen
sql = "Insert INTO personen VALUES('Schmitz',"\
      "'Peter', 81343, 3750, '12.04.1958')"
cursor.execute(sql)
connection.commit()

connection.close()




Aha - nur gut das ich gar nichts verstehe und nur die Hälfte der 100.000 neuen Befehle/Funktionen erklärt wird und um sich das dann auch "anschauen" zu können muss man nochmal was umständliches schreiben oO?

Ich glaub ich mach doch erst das Kapitel übers Internet - evtl. sind da die Dinge die mir fehlen ....

Hm - laut Buch soll ich XAMPP benutzen um einen lokalen Server(mit Apache) zu erstellen - nun wird der Fehler angezeigt das SSL 443 bereits genutzt wird??
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Wenn Du etwas mit Datenbanken machen möchtest, ist es wichtig. Wenn nicht, dann nicht. Zumal man mit SQL eine neue Sprache lernen muss.

Bevor man in weitergehende Themen einsteigt, sollte man meiner Meinung nach die Grundlagen sehr gefestigt haben.

Wenn Du die Grundlagen drin hast, schnappst Du Dir ein Themengebiet, das Dich interessiert und motivieren kann (!). Damit ist man dann gut ein Leben lang beschäftigt ;) und lernst die Sprache(n) richtig.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Tengel,
solche Bücher sind meistens so aufgebaut, dass sie alles ein bisschen abdecken. Dabei wird meist leider mehr Wert auf Quantität statt auf Qualität gesetzt, weil man auf dem Umschlag eine sehr lange Liste an Themen aufführen kann :evil: .

Such Dir die Themen raus, die für Dich wichtig sind. Vertieftes Wissen findest Du dann wahrscheinlich sowieso nur im Internet.
Warum man für ein Internet-Kapitel in Python Apache braucht müsste mir mal der Autor noch erklären???

Zum Thema Datenbanken. Der Beispielcode ist mal wieder Schrott.
Bei mehrzeiligen Strings »\« zu benutzen ist Quatsch, führt nur zu seltsamen Fehlermeldungen.
Werte direkt in Strings zu packen ist nicht nur blöd sondern höchst gefährlich, wenn dann der unwissende Leser anfängt Strings aus unbekannter Quelle zusammenzustückeln.
Warum also dann nicht gleich den richtigen Umgang zeigen:

Code: Alles auswählen

import sqlite3

connection = sqlite3.connect("firma.db")
cursor = connection.cursor()

cursor.execute("""CREATE TABLE personen (
    name TEXT,
    vorname TEXT,
    personalnummer INTEGER PRIMERY KEY,
    gehalt FLOAT,
    geburtstag DATE
)""")

INSERT_PERSON = """INSERT INTO personen (
    name, vorname, personalnummer, gehalt, geburtstag
) VALUES (:name, :vorname, :personalnummer, :gehalt, :geburtstag)"""

cursor.executemany(INSERT_PERSON, [
    {'name':'Maier', 'vorname':'Hans', 'personalnummer': 6714, 
        'gehalt': 3500, 'geburtstag':'15.03.1962'},
    {'name':'Schmitz', 'vorname':'Peter', 'personalnummer': 81343,
        'gehalt': 3750, 'geburtstag':'12.03.1958'},
])

connection.commit()

connection.close()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sirius3 hat geschrieben:solche Bücher sind meistens so aufgebaut, dass sie alles ein bisschen abdecken. Dabei wird meist leider mehr Wert auf Quantität statt auf Qualität gesetzt, weil man auf dem Umschlag eine sehr lange Liste an Themen aufführen kann :evil: .
Genau so ist es. Daher habe ich das gefühl dass je dicker ein Buch wird, desto wertloser, weil dann alles mögliche an Quatsch besprochen wird und vieles davon zweifelhafter Qualität weils reingehamstert wird. Da lobe ich mit K&R oder The D Programming Language, gerade letzteres geht echt in die Tiefe aber bleibt immer relevant. Ich denke so 300-400 Seiten ist das Optimum. Den Vogel abgeschossen aht Programming Python, wo die damals aktuelle Fassung Grail besprochen hat, einen Browser der damals schon seit ca. 10 Jahren tot war. Einfach aus der vorherigen Ausgabe übernommen, ohne zu schauen ob es relevant ist.

Seitdem habe ich etwas den Glauben an O'Reilly-Bücher verloren. In letzter Zeit wurden die von Addison Wesley, Manning, PragProg, No Starch und Packt im wesentlichen überholt.
Sirius3 hat geschrieben:Warum man für ein Internet-Kapitel in Python Apache braucht müsste mir mal der Autor noch erklären???
PHP-Bücher machen das auch so!!!1!

@Sirius3: du kannst auch das ``with``-Statement noch einbauen, evtl. mit dem ``closing``-Contextmanager, dann ist es noch schicker.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Also momentan wüsste ich erstmal nicht was ich mit Datenbanken anfangen sollte - dann doch eher Internet da wär am ehesten interessant wie ich ein geschriebenes Programm auf eine Website bekomme(nicht das ich behaupten würde ich könnte was brauchbares von mir geben^^).

Mein super tolles! Buch hat noch 3 Kapitel
- Internet
hab ich nur etwas lustlos rumgeplättert, irgendwie war es auch klar das es zu einfach wäre so print... einfach fürs Web nutzen zu können ...nein das muss natürlich wieder ganz anders aufgebaut sein -.-"
- Datenbanken
wie gesagt - jucken mich jetzt momentan nicht so besonders
- GUI
am meisten wäre da GUI interessant aber das sind wohl 100000 neue Dinge auf einmal - und wenn ich mir die Codes die ihr hier schreibt anschaue ...denke ich doch das ich die Basics noch nicht wirklich drin hab :(

Warum man dafür unbedingt Apache nehmen soll ka - aber ich muss mich hier wohl leider outen ...ich bin zwar mit all dieser tollen Technik "groß" geworden - aber für das eigentliche "dahinter" interessiere ich mich erst seit kurzem weswegen ich mich auf das im Buch verlassen habe/ verlassen muss.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm es scheint als hätten nun alle genug von mir
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hattest Du jetzt eine konkrete Frage? :D
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Wie ich an einen lokalen "Host" komme wen das Apache nicht funktioniert^^
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Tengel:
Da die Frage doch sehr weit von der Eingangsfragestellung abweicht, solltest Du besser einen neuen Thread aufmachen. Am besten unter "Offtopic", da es nichts Pythonspezifisches ist. Ein Mamutthread wie dieser mit zig verschiedenen Fragestellungen ist für andere wenig hilfreich.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm ich will halt das Forum nicht mit Threads überschwemmen^^
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Es kann doch nicht so schwer sein - eine Zahl aus einer Datei zu lesen diese mit einer neuen Zahl zu addieren und die Summe in die ursprüngliche Datei zu schreiben? -.-
BlackJack

@Tengel: Nein, das ist nicht so schwer. Steckt in dieser Aussage jetzt eine Frage drin? :-)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ja warum ich mich zu dumm anstelle ...das kann doch nicht sein ..ich weiß nicht wie lange ich das jetzt Versuche.
Gebt mir bitte einen Tipp - ist da pickle modul nötig oder nicht?
Antworten