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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Code: Alles auswählen

# Mehrere iterierbare Objekte
plz = [49808, 78224, 55411]
stadt = ["Lingen", "Singen", "Bingen"]
bundesland = ["NS", "BW", "RP"]

#verbinden
kombi = zip(plz,stadt,bundesland)

#ausgabe
for element in kombi:
    print(element)
Frage zu iterierbaren Objekten:
Das zip() fügt von den Listen jeweils die Elemente der gleichen Position zusammen - im Buch steht das auch Dictionarys iterierbar sind - aber wie funktioniert das wenn die eine zufällige Reihenfolge haben?
BlackJack

@Tengel: Dem `zip()` ist die Position der Elemente egal, im Grunde komplett der Typ. Das fügt einfach die Elemente in der Reihenfolge zusammen wie sie vom iterierbaren Objekt geliefert.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hmmmm und wie kann man das dann sinnvoll einsetzen?
BlackJack

@Tengel: Was jetzt genau? `zip()` funktioniert mit jedem iterierbaren Objekt. Das heisst ja nicht das man es auch mit jedem iteriebaren Objekt benutzen muss. Objekte sind ja nicht speziell für die `zip()`-Funktion iterierbar.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm - ka - wundert mich nur wie das sinnvoll bei z. B. Dictionarys sein soll wenn man nicht weiß welche Werte das zuweist.
BlackJack

@Tengel: Wie schon gesagt: Es muss ja nicht für jede der unendlich vielen Möglichkeiten von Kombinationen von iterierbaren Objekten für irgendetwas sinnvoll sein, es reicht doch völlig *das* es sinnvolle Anwendungen für `zip()` und bestimmte iterierbare Objekte gibt. Andererseits kann es sicher auch Fälle geben wo die Reihenfolge egal ist. Wenn ich mir jetzt mal zwanghaft ein Beispiel ausdenken soll:

Code: Alles auswählen

# ...

    for key, worker in zip(dictionary, itertools.cycle(workers)):
        worker.process(key)
Wobei `workers` ein iterierbares Objekt darstellt was Elemente enthält mit denen man Arbeit in jeweils unterschiedlichen Prozessen oder über eine Web-API oder so anstossen kann. Die Reigenfolge ist egal, wichtig ist hier nur das alle Schlüssel aus dem Wörterbuch gleichmässig reihum auf die `workers` verteilt werden.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ok - verstehe - thx

Mal fernab von meinem momentanen Wissenstand/Kapitel, in C++ war es ja so das da immer ne .exe erzeugt wurde - das ist in Python ja nicht so und man hat die Ausgaben in der Shell - was momentan für mein Zeug auch ok ist - nur würde mich interessieren wie "kompliziert/aufwändig" es ist eine .exe zu erstellen.
BlackJack

@Tengel: Warum willst Du das machen? Und was hat das mit Ausgaben in der Shell zu tun? Das ist doch bei C++-Programmen nicht anders‽
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ka - nur interesse - bei mir war C++ immer Konsole - aber da konnte ich die gespeicherten Programme halt immer über eine .exe aufrufen und musst nicht erst den Quellcode öffnen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Tengel hat geschrieben:da konnte ich die gespeicherten Programme halt immer über eine .exe aufrufen und musst nicht erst den Quellcode öffnen.
Das ist doch bei Python nicht anders: ``python programmname.py`` statet das Programm, ohne dass man selbst den Quellcode öffnen muss.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm und wenn man was vom Rechner aufn Laptop packen will?
BlackJack

@Tengel: Dann installiert man dort *einmal* Python. EXE bedeutet es wird für jede EXE die man erstellt ein kompletter Python-Interpreter plus mindestens die Module aus der Standardbibliothek die verwendet werden mitgeliefert. Für Anwendungen ab einer bestimmten Grösse mag das vertretbar sein, aber für kleine Skripte ist das ziemlicher Overkill.

Wenn unter Windows die Dateiendung *.py mit dem Python-Interpreter verknüpft ist, muss man noch nicht einmal ``python programmname.py`` schreiben — es reicht dann nur ``programmname.py``.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ah ok -danke nun hab ich so in etwa ein Bild wie das abläuft.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

So - morgen gehts mit OOP los - ich weiß nicht ob ich mich freuen oder fürchten soll.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich meine gelesen zu haben das wenn eine Variable nicht local gefunden wird - überprüft wird ob es davor global im Programm vorkam - richtig?
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

So die aktuelle Version meines KM-Arbeitsfahrten Programmes das ich gerade neu geschrieben hab.

Code: Alles auswählen

def eingabe():
    kmStand     = input("Bitte KM Stand anfang des Monates eingeben  : ")
    arbeitsTage = input("Wieviele Tage wurden diesen Monat gearbeitet: ")

    kmStand = int(kmStand)
    arbeitsTage = int(arbeitsTage)
    
    return kmStand, arbeitsTage


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 ergebnisBerechnung(kmStand):
    ZuschussStrecke = 0
    for x 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(x,kmStand,kmStand+fahrtStreckeGesamt,fahrtStreckeEinfach,fahrtStreckeGesamt)) 
        kmStand         = kmStand+fahrtStreckeGesamt+privatStrecke
        
        ZuschussStrecke = ZuschussStrecke+fahrtStreckeEinfach
    return ZuschussStrecke

def fahrtGeldBerechnung(ZuschussStrecke):
    fahrtGeld = ZuschussStrecke*0.17
    print("{0:15}{1:7.2f}{2:6}".format("Der Zuschuss beträgt",fahrtGeld," Euro"))
    
    




# Hauptprogramm
import random

kmStand, arbeitsTage = eingabe()

tabellenkopf()

ZuschussStrecke = ergebnisBerechnung(kmStand)

print()

fahrtGeldBerechnung(ZuschussStrecke)
Ich hoffe mal es ist wenigstens etwas "besser" wie der erste Versuch.

sry - irgendwie bin ich zu unfähig das es bunt wird.
Zuletzt geändert von Tengel am Mittwoch 27. März 2013, 16:55, insgesamt 4-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Tengel hat geschrieben:Ich meine gelesen zu haben das wenn eine Variable nicht local gefunden wird - überprüft wird ob es davor global im Programm vorkam - richtig?
Ja, das stimmt. Und das geht rekursiv, also wenn du eine Funktion in einer Funktion in einer Funktion usw. hast, dann wird erst in der innersten Funktion geschaut, dann in der darüber, dann in der darüber usw. und wenn es dann nicht gefunden wird, dann wird modulglobal geschaut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Tengel,

zu eingabe:
ich würde gleich x=int(Input('bla')) schreiben, dann wird nicht erst ein String und dann eine Zahl an den selben Variablennamen gebunden, was u.U. verwirren kann. Das Abfangen eines ValueErrors hilft, sich nicht zu ärgern, wenn man sich mal vertippt und deshalb das ganze Programm abbricht.

zu ergebnisBerechnung:
arbeitsTage wird benutzt aber nicht als Parameter übergeben.
Die Konstanten sammelt man am besten irgendwo in den ersten Zeilen zentral:

Code: Alles auswählen

FAHRT_STRECKE_MIN = 80
FAHRT_STRECKE_MAX = 83
CHANCE_PRIVAT = 25 # Prozent
# usw.
Wird die Variable der for-Schleife nicht benutzt wird gerne ein _ vorangestellt, um dies deutlich zu machen.

zu fahrtGeldBerechnung:
Warum setzt Du konstante Strings als Variablen in .format ein?
Zumal der erste davon mehr als 15 Zeichen hat und die anderen Formatangaben mit dem darüberliegenden Raster gar nichts mehr zu tun haben.
Es fehlt ein Punkt hinter Euro.
Das Hauptprogramm packt man gerne in eine Funktion mit Namen main:

Code: Alles auswählen

def main():
  tu_dies_tu_das

if __name__ == '__main__':
    main()
Das vereinfacht u.a. das Testen, da das Programm als Modul geladen und die Funktionen einzeln aufgerufen werden können.

Irgendwann wird Dir die Vermischung von Berechnungen und Ausgabe auf die Füße fallen. Aber erst später.

Grüße
Sirius
BlackJack

@Tengel: Wegen der Farbe: Geh doch mal auf Ändern bei einem Deiner Beiträge wo ein Moderator nachträglich Farbe hinzugefügt hat, oder auf Zitieren bei einem anderen Beitrag mit farbigem Quelltext. Dann siehst Du ja den Quelltext von dem Beitrag und wie das dort gemacht wurde. :-)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Uhh schon wieder soviel falsch :(
ich würde gleich x=int(Input('bla')) schreiben
ja stimmt - hab mich da hier auch schon mal erkundigt deswegen - weil das in meinem Buch immer so umständlich gemacht wird - jetzt hab ich es mir vor lauter Übungen abtippen selbst angewöhnt>.>

arbeitsTage wird benutzt aber nicht als Parameter übergeben.
Öhm - ok und an welcher Stelle hab ich versucht das als Parameter zu übergeben?

Warum setzt Du konstante Strings als Variablen in .format ein?
Weil ich an sich nur die fahrtGeld Varialbe auf 2 Stellen gerundet haben wollte und da ich mein Buch nicht dabei hatte hab ich es auf diese umständliche Weise gemacht.
Antworten