Seite 8 von 14

Re: Neuling sucht Rat

Verfasst: Freitag 5. April 2013, 21:50
von snafu
@BlackJack: *Der* Kalkül. Auch wenn's komisch klingt. ;)

Re: Neuling sucht Rat

Verfasst: Freitag 5. April 2013, 22:16
von Tengel

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?

Re: Neuling sucht Rat

Verfasst: Freitag 5. April 2013, 22:52
von 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 ;)

Re: Neuling sucht Rat

Verfasst: Freitag 5. April 2013, 22:59
von snafu
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.

Re: Neuling sucht Rat

Verfasst: Freitag 5. April 2013, 23:49
von Tengel
Also hab ich mal wieder die schlechteste Möglichkeit getroffen ja -.-" ....is auch ein Talent

Re: Neuling sucht Rat

Verfasst: Samstag 6. April 2013, 00:20
von Sirius3
@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.

Re: Neuling sucht Rat

Verfasst: Samstag 6. April 2013, 05:37
von snafu
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.

Re: Neuling sucht Rat

Verfasst: Sonntag 7. April 2013, 04:43
von Tengel
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??

Re: Neuling sucht Rat

Verfasst: Sonntag 7. April 2013, 07:34
von bwbg
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

Re: Neuling sucht Rat

Verfasst: Sonntag 7. April 2013, 10:15
von Sirius3
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()

Re: Neuling sucht Rat

Verfasst: Sonntag 7. April 2013, 15:58
von Leonidas
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.

Re: Neuling sucht Rat

Verfasst: Sonntag 7. April 2013, 20:47
von Tengel
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.

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 20:45
von Tengel
Hm es scheint als hätten nun alle genug von mir

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 20:57
von jerch
Hattest Du jetzt eine konkrete Frage? :D

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 21:00
von Tengel
Wie ich an einen lokalen "Host" komme wen das Apache nicht funktioniert^^

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 21:12
von jerch
@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.

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 21:35
von Tengel
Hm ich will halt das Forum nicht mit Threads überschwemmen^^

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 22:10
von Tengel
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? -.-

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 22:37
von BlackJack
@Tengel: Nein, das ist nicht so schwer. Steckt in dieser Aussage jetzt eine Frage drin? :-)

Re: Neuling sucht Rat

Verfasst: Montag 8. April 2013, 22:39
von Tengel
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?