Laufvariable ausgeben

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.
Antworten
Kobra23759
User
Beiträge: 61
Registriert: Donnerstag 9. April 2020, 18:47

Hallo,
ich habe eine Klasse Hund mit der Methode Schleife erstellt.
Ich möchte gern die Laufvariable i ausgeben.
wenn ich einen Print-Befehl ausgebe, würde die Konsole volllaufen, was jetzt bei mir der Fall ist.
Ich habe an ein TK-Inter Fenster gedacht.
kann mir da jemand weiterhelfen.
Vielen Dank

class Hund():
def schleife(self):
for i in range(1000000):
if i%10000==0:
print(str(i))

lassy=Hund()
lassy.schleife()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Klasse macht so ja keinen Sinn. Warum kann ein Hund schleifen? Was möchtest du eigentlich lernen? Schleifen oder Klassen? Jetzt noch GUI drauf zu packen, ist noch zu früh.
Die Konsole kann auch nicht volllaufen. Da kann man beliebig viel ausgeben.
Der `str`-Aufruf ist unnötig, print macht den Aufruf intern automatisch.
Kobra23759
User
Beiträge: 61
Registriert: Donnerstag 9. April 2020, 18:47

Lieber Sirius,
ich möchte auf der Konsole nicht, dass dort hunderte Zeilen ausgegeben werden.
Es ist doch völlig egal ob ein Hund schleifen kann. Das sind doch nur Beispiele.
Eigendlich will ich nur die Laufvariable ausgeben.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kobra23759: Warum möchtest Du in der Konsole keine hunderte Zeilen ausgeben? Warum wäre das in einer GUI okay hunderte Zeilen auszugeben? Letztlich ist eine Konsole doch auch eine GUI für die Textein und -ausgabe.

Da immer wieder betont wird, dass Namen *wichtig* sind, ist es auch wichtig warum ein `Hund` eine Methode `schleife()` hat. Weil Namen zum Verständnis beitragen sollen. Wenn sie Fragen aufwerfen, dann hat man genau das Gegenteil von dem was man mit Namen erreichen will, und darum ist `Hund` hier kein guter Name. Wenn das ein generisches Beispiel ist, dann wäre `Klasse` ein Klassenname der deutlich macht, dass es sich um irgendeine Klasse handelt.

Wobei sowohl die Klasse, als auch die Methode anscheinend gar keine Rolle spielen, wenn das Hauptproblem die Ausgabe einer Laufvariablen ist. Da reicht eine Funktion, denn eine Methode ist das gezeigte ja auch nicht wirklich, weil da nichts mit dem Objekt gemacht wird, auf dem die ”Methode” aufgerufen wird.

Edit: Kann es sein, dass Du so etwas suchst?

Code: Alles auswählen

#!/usr/bin/env python3
import time


def main():
    for i in range(1_000_000):
        if i % 10_000 == 0:
            print(f"\r{i}", end="", flush=True)
        time.sleep(1e-6)
    print()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bis du eine Tkinter-Anwendung gebaut hast, die auch nur Ansatzweise die Möglichkeiten eines Terminals in Bezug auf Geschwindigkeit und Features hat, vergehen ein paar Wochen.

Vor allem aber nötigen dir GUIs ihre Ereignis-basierten Architektur auf. Da ist nix mit lange laufenden Schleifen (mit oder ohne Hund), sondern Zustandsmaschinen, Timer, Threads, Inter-Thread-Kommunikation etc pp bestimmen das Bild. Deutlich komplizierter als ein simples print.
Kobra23759
User
Beiträge: 61
Registriert: Donnerstag 9. April 2020, 18:47

Ja so soll es aussehen, Danke, nur das vor dem i noch etwas stehen sollte " Iteration="
kannst du den print-Befehl etwas erläutern
Ich benutze Spyder
Es entsteht ewas ungewöhnliches : das i wird angezeigt und zum Ende erscheint auf der Konsole folgender Ausdruck
runfile('C:/Users/Alf/untitled0.py', wdir='C:/Users/Alf')
99900099800099700099600099500099400099300099200099100099000098900098800098700098600098500098400098300098200098100098000097900097800097700097600097500097400097300097200097100097000096900096800096700096600
import time

Es scheint mit der Anzahl der print-Befehle zusammen zuhängen
def main():
for i in range(1_000_000):
if i % 10_00 == 0:
print(f"\r{i}", end="", flush=True)
#time.sleep(1e-6)
print()

if __name__ == "__main__":
main()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kobra23759: Das "\r" ist das Steuerzeichen für den Wagenrücklauf („carriage return“) das die Schreibposition wieder an den Anfang der Zeile setzt. Dann wird der Wert von `i` ausgegeben. ``end=""`` sorgt dafür das `print()` am Ende nichts ausgibt, also insbesondere kein Zeilenendezeichen ("\n"). ``flush=True`` sorgt dafür, dass die Daten sofort ausgegeben werden, und nicht erst gepuffert werden bis ein Zeilenendezeichen ausgegeben wurde (oder der Ausgabepuffer voll ist).

Das Programm ist tatsächlich für die Konsole gedacht, und IDEs die eine Konsole bieten, und nicht einfach nur ein Textausgabefenster das sich nicht wie eine echte Konsole verhält. Spyder scheint also nicht wirklich geeignet um Konsolenanwendungen zu schreiben. So etwas wie `curses`, `rich`, oder `urwid` werden dort dann wohl auch nicht funktionieren. Oder das `tqdm`-Modul, falls man nur einen Fortschritt darstellen möchte. Das, oder eine Alternative wäre nämlich meine nächste Empfehlung gewesen, statt sich so etwas selbst zu basteln. Bei den meisten bekommt man da dann beispielsweise auch noch die vergangene Zeit und die ungefähre Zeit wann es fertig ist, automagisch ausgegeben.

Code: Alles auswählen

#!/usr/bin/env python3
import time
from rich.progress import track


def main():
    for i in track(range(1_000_000)):
        time.sleep(1e-6)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Kobra23759
User
Beiträge: 61
Registriert: Donnerstag 9. April 2020, 18:47

Danke für die Erklärung
Antworten