Seite 5 von 14

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 17:38
von Tengel

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?

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 17:45
von 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.

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 18:58
von Tengel
Hmmmm und wie kann man das dann sinnvoll einsetzen?

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 19:09
von 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.

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 21:24
von Tengel
Hm - ka - wundert mich nur wie das sinnvoll bei z. B. Dictionarys sein soll wenn man nicht weiß welche Werte das zuweist.

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 21:41
von 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.

Re: Neuling sucht Rat

Verfasst: Montag 25. März 2013, 23:07
von Tengel
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.

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 00:00
von 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‽

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 00:42
von Tengel
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.

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 00:50
von Leonidas
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.

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 01:10
von Tengel
Hm und wenn man was vom Rechner aufn Laptop packen will?

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 01:18
von 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``.

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 01:27
von Tengel
Ah ok -danke nun hab ich so in etwa ein Bild wie das abläuft.

Re: Neuling sucht Rat

Verfasst: Dienstag 26. März 2013, 21:30
von Tengel
So - morgen gehts mit OOP los - ich weiß nicht ob ich mich freuen oder fürchten soll.

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 00:15
von Tengel
Ich meine gelesen zu haben das wenn eine Variable nicht local gefunden wird - überprüft wird ob es davor global im Programm vorkam - richtig?

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 01:40
von Tengel
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.

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 01:58
von Leonidas
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.

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 06:29
von Sirius3
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

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 11:40
von 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. :-)

Re: Neuling sucht Rat

Verfasst: Mittwoch 27. März 2013, 16:53
von Tengel
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.