Seite 1 von 1

Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 12:57
von Kirarara
Hi Leute,

Ich schreibe ein Programm, dass eine große Schleife enthält.
Ich fände es super, wenn nach Beendigung einer Schleife eine Ausgabe in der Konsole kommt, das Programm weiter läuft und dann wenn die Schleife wieder beendet ist, soll wieder eine Konsolenausgabe erfolgen usw.
Die möchte ich, weil diese Große Schleife ins unendlich geht und mein Prof keine wirkliche Einschränkung will, aber ich bekomme ja ohne Einschränkung keine Ausgabe,

Vielleicht hat jemand von euch eine Idee und ich hoffe ich habe mein Problem ausreichend beschrieben,
mit freundlichen Grüßen
Kira

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 13:13
von Melewo
Nicht das ich Deine Frage richtig verstanden hätte, doch Du könntest zum Beispiel ein Countdown-Script schreiben, welches nach dem Countdown etwas ausgibt und danach einen neuen Countdown startet.

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 13:15
von Kirarara
Danke, das hört sich gut an, das versuche ich mal

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 13:27
von BlackJack
@Kirarara: Ich verstehe das Problem nicht so wirklich. Wenn Du möchtest das nach dem abarbeiten einer Schleife etwas ausgegeben wird, dann schreib doch nach der Schleife einfach Code der etwas ausgibt‽

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 13:59
von Kirarara
ja das macht es ja auch, aber es gibt nicht nach jedem schleifen durchgang eine ausgabe, sondern wenn die schleife komplett durchgelaufen ist,

zb könnte man sagen ich habe eine schleife für p von 1 bis 10
ich möchte, dass wenn das programm für p=1 durchgelaufen ist den wert schon sehen wärend das programm für p=2 weiter durchgeht dann öchte ich das ergebnis sehen wären das für p=3 weiter läuft usw.
ich möchte also nicht erst das ergebnis, wenn das p durh alle werte durch ist.

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 14:33
von skirnir
Was spricht denn gegen ein

Code: Alles auswählen

print(ergebnis)
am Ende der Schleife?

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 14:49
von Zizibee
@Kirarara:
Ich denke du musst uns echt noch mal erklären, warum ein einfaches print(p) nicht das macht, was du willst.
Also warum so etwas es nicht macht was du willst (ungetestet):

Code: Alles auswählen

liste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p = 0

for element in liste:
    p += element
    print('p am Schleifenende: {}'.format(p))
    
print('Endergebnis von p: {}'.format(p))

Re: Zwischenausgabe durch Konsole, ohne das Pogramm zu beenden

Verfasst: Donnerstag 20. Juli 2017, 16:08
von DeaD_EyE
Wie sieht die verschachtelte Schleife denn aus?

Meine erste Idee: Schleife in einer Funktion auslagern und pro Durchlauf das Ergebnis ausgeben.
In einer Schleife kannst du dann über den Generator iterieren und z.B. nach jedem 100. Aufruf irgendeinen Text ausgeben.

Falls ich jetzt gerade keinen Knoten im Kopf habe, müsste er richtig zählen. Nagelt mich nicht drauf fest.

Code: Alles auswählen

def verarbeitung(datensatz):
    # code zur Verarbeitung
    daten = datensatz.upper()
    # verarbeitete Daten ausgeben
    return daten


def generator(eingabedatei):
    # liest ausschließlich die Daten
    with open(eingabedatei) as fd:
        for zeile in fd:
            # Verarbeitung findet hier statt
            yield verarbeitung(zeile)


def main(eingabedateien):
    # kümmert sich nur um die Ausgabe
    for eingabedatei in eingabedateien:
        for n, datenausgabe in enumerate(generator(eingabedatei)): # enumerate fängt bei 0 an zu zählen, kann mit start geändert werden
            if n % 100 == 0: # n / 100 -> rest == 0
                # bei dem 1. und jedem 100. Aufruf irgendwas ausgeben
                print('Durchlauf:', n+1, datenausgabe)
            # irgendwas mit den verarbeiteten Daten machen, z.B. abspeichern
        # nächste Datei
        print('----\nDruchlauf von {} beendet\n----'.format(eingabedatei))


if __name__ == '__main__':
    dateien = ['/var/log/auth.log', '/var/log/auth.log.1']
    main(dateien)
Kann natürlich sein, dass du etwas ganz anderes noch machst und ggf. Daten hin und her schieben musst.
Ohne Beispiel ist das schwierig.

Auf jeden Fall kannst du mit der Funktion enumerate() arbeiten, um die Anzahl der Durchläufe zu erfassen.
Effizient ist diese Funktion auch noch. D.h. wenn du 1e6 Iterationen hast, wirst du dadurch keine großen Nachteile haben.
Anders sieht es aus, wenn du anfängst das selbst zu implementieren.

EDIT: Hab ich irgendwelche Code-Tags falsch gesetzt oder wieso gibt es bei meinem Beitrag kein Syntax Highlighting?