GOTO in Python

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.
andy65
User
Beiträge: 2
Registriert: Sonntag 23. Mai 2021, 16:17

Hallo Forum,
bisher habe ich in VBA programmiert. Da gibt es den Befehl "GOTO".
Wie aber kann ich ein Programmablauf wieder vom Anfang / Start ausführen?
Hier ein Beispiel:

Code: Alles auswählen

# start
a=1
b=0
print("Beginne mit Abarbeitung")
    # 1. Abschnitt
    if a==1:
        # Bedingung erfüllt, script weiter ausführen
        print("a=1")
    else:
        # Bedingung nicht erfüllt, script weiter ausführen
        print("a ist nicht gleich 1")
    # 2. Abschnitt
    if b==0:
        # Bedingung erfüllt, wieder am Anfang beginnen
        print("Beginne vom Anfang")
        wie komme ich zum Anfang zurück ??????
    else:
        print("script weiter  abarbeiten")
    # 3. Abschnitt
    print("hier geht es weiter")
    # weitere Anweisungen
    # ENDE 
Bitte um Beispiele
Grüße
Andreas
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Es gibt keine Sprungmarken in Python. Gott sei Dank. Das ergibt Spaghetticode, den niemand verstehen oder warten kann.
Ich sehe in dem Beispiel auch bei VBA keine not GOTO zu verwenden. Auch dort würde man eine Schleife verwenden.

Wenn du etwas wiederholen möchtest, dann benutze Schleifen.
Falls 1 und 0 boolsche Wete sein sollen, dann True und False und nicht 0 und 1.

Hast du das Python Tutorial in der Python Dokumentation gelesen?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

andy65 hat geschrieben: Sonntag 23. Mai 2021, 16:44 Bitte um Beispiele
Hallo andy65,
Hier ein einfaches Bespiel einer Wiederholung in Python:

Code: Alles auswählen

beenden = False

# der eingerückte Teil wird wiederholt solange 'beenden' nicht 'Wahr' ist.
while not beenden:

    antwort = input("Bitte gib einen Text ein: ")

    print("Es wurde " + antwort + " eingegeben")

    if antwort == "ende":
        beenden = True


print("Tschüss")


Wie von sparrow erwähnt, würde ich dir auch ein Pythontutorial empfehlen:

Hier z.B.:
https://py-tutorial-de.readthedocs.io/d ... rammierung
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Python Package Index hat da ein `goto-statement`-Package. 🤡

Code: Alles auswählen

#!/usr/bin/env python3
from goto import with_goto


@with_goto
def main():
    # start
    a = 1
    b = 0
    print("Beginne mit Abarbeitung")
    label .begin
    # 1. Abschnitt
    if a == 1:
        # Bedingung erfüllt, script weiter ausführen
        print("a=1")
    else:
        # Bedingung nicht erfüllt, script weiter ausführen
        print("a ist nicht gleich 1")
    # 2. Abschnitt
    if b == 0:
        # Bedingung erfüllt, wieder am Anfang beginnen
        print("Beginne vom Anfang")
        goto .begin
    else:
        print("script weiter  abarbeiten")
    # 3. Abschnitt
    print("hier geht es weiter")
    # weitere Anweisungen
    # ENDE


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@rogerb:

Du setzt ja die Variable "antwort" und deren Werte ändert ggf. die Variable "beenden". Wenn diese Abhängigkeit so besteht, warum nimmst du nicht den Wert von "antwort" als Bedingung im Kopf der while-Schleife?

Tatsächlich ist es aber eher üblich eine while True Schleife zu verwenden und bei setzen des korrekten Wertes diese mit "break" zu verlassen.


@__blackjack__:
Ich mag dein Vertrauen, dass Ironie anhand des Clownsgesichts erkannt wird :P
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: statt eines Flags benutzt man while-True mit break.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.

Code: Alles auswählen

while True:
    antwort = input("Bitte gib einen Text ein: ")
    print(f"Es wurde {antwort} eingegeben")
    if antwort == "ende":
        break

print("Tschüss")
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@sparrow, @Sirius3

ist das euer Ernst? Wenn ihr unbedingt was zum Kommentieren braucht kann ich gerne ein paar dummy Fragen posten
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Ich kann nicht für sparrow oder Sirius3 sprechen, aber eine ``while True:``-Schleife mit einem ``if``/``break`` ist in Python idiomatischer Code für nachprüfende Schleifen, weil es dafür keine Syntax gibt. Wenn das in einer Funktion steckt und beim ``break`` deren Ergebnis feststeht, kann man es auch durch ein ``return result`` ersetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jede Vermeidung von Zustand ist ein Gewinn. Und String-formatting als Tool so viel mächtiger und einfacher gleichzeitig, das ich nicht nachvollziehen kann, warum man das nicht nutzt. Es ist auch nicht “Anfängerfreundlicher”, denn spätestens wenn Zahlwerte ins Spiel kommen, fliegt einem das ohne explizite Typwandlung um die Ohren.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

__blackjack__ hat geschrieben: Sonntag 23. Mai 2021, 18:44 @rogerb: Ich kann nicht für sparrow oder Sirius3 sprechen, aber eine ``while True:``-Schleife mit einem ``if``/``break`` ist in Python idiomatischer Code für nachprüfende Schleifen, weil es dafür keine Syntax gibt. Wenn das in einer Funktion steckt und beim ``break`` deren Ergebnis feststeht, kann man es auch durch ein ``return result`` ersetzen.
Absolute, richtig! Sehe ich genau so, hatte, ich auch erst so, hab mich dann aber für die andere Möglichkeit entschieden, da ich jemandem auf diese Weise zeigen wollte, dass eine while -Schleife einen Code-Abschnitt wiederholt, solange eine Bestimmte Bedingung erfüllt ist. Ich denke es gibt viele Tutorials, in denen die while-Schleife auch genauso erklärt wird.

String concatenation kann man sehr gut durch '+' erreichen. Python legt Wert auf einfache und direkte Umsetzung. f-Strings sind ein mächtiges Werkzeug um die Formatierung z.B. von numerischen Werten zu steuern. Hier kommt man sehr gut ohne aus und für ein einfaches Beispiel ist das einfache '+' sehr gut geeignet.

Aber was mich eigentlich jedesmal wieder aufs neue umhaut ist dieses jämmerliche Reingrätschen. Als ob manche Leute nur an den Bildschirmen warten, würden bis sie etwas zum Auseinandernehmen vorgeworfen kriegen.
Wenn ihr der Meinung seit, ihr hättet eine bessere Lösung für den Fragesteller, warum richtet ihr euch nicht an den Fragesteller und bietet diese an?
Auf Stackoverflow gehen die Antworten, fast immer auf den Kern der Frage ein. Durch Upvotes der Community wird dann die beste Ermittelt. Hier kommt es ständig zu irgendwelchen Nebendiskussionen, die überhaupt nichts mehr mit dem Kern der Frage zu tun haben. Die Threads ziehen sich wegen irgendwelcher Diskussionen endlos in die Länge und die Fragesteller kratzen sich nur verwundert am Kopf.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@rogerb: Du hast dich absichtlich dafür entschieden, nicht idiomisches Python zu zeigen? Wie soll das jemandem helfen? In der Fahrschule bekommt man doch auch nicht das Abbiegen ohne Blinker gezeigt, weil es erst einmal einfacher ist, und wenn das dann geht, dann muss man plötzlich doch diesen Hebel da am Lenkrad drücken.

Und das Zusammensetzen von Zeichenketten mit + ist unter Python sowohl schlecht zu lesen als auch die schlechteste Wahl, was die Performanc betrifft. Nur weil es möglich ist, ist es trotzdem die falsche Lösung - auch in einem einfachen Beispiel. Ein Werkzeug nicht zu nutzen, weil es in der Anwendung einfach aber mächtig ist, macht in meinen Augen keinen Sinn.

Wenn ich hier Kommentare zu Code schreibe, dann mache ich das ja nicht, um denjenigen zu gängeln, sondern um sowohl dem Autor des Codes als auch Menschen, die zufällig auf den Thread stoßen, den Hinweis zu geben, wie man es eigentlich in Python umsetzt. Davon kannst du dich "umgehauen" fühlen - oder die Hinweise umsetzen.
Es passiert mir nicht selten, dass ich hier von Benutzern mit deutlich mehr Erfahrung korrigiert und kommentiert werde. Das nehme ich gerne mit um zu lernen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@rogerb du hast scheint es nicht viel Erfahrung mit SO, wenn du denkst, du würdest dort nicht für deinen Code kritisiert. Oder “reingegrätscht” bekommen. Im Gegenteil. Da wird andauernd rumgekrittelt, um aus einer Antwort eine bessere Antwort zu machen. Das voting ist am Ende nur ein Teil des ganzen, die Revisionen der Antworten können durchaus signifikant sein. Siehst du nur nicht.
andy65
User
Beiträge: 2
Registriert: Sonntag 23. Mai 2021, 16:17

Danke für eure Beiträge.
@__blackjack__
Ein interessanter Vorschlag. Auf http://entrian.com/goto/download.html ist das Tool zu finden. Die Installation scheint auch funktioniert zu haben, aber der Aufruf „from goto import with_goto“ endet mit dem Fehler: „ModuleNotFoundError: No module named 'goto'“
An die anderen Schreiber richte ich den Appell, doch bitte konkrete Vorschläge zu unterbreiten, wie das Problem gelöst werden kann.
Danke
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@andy65: das hatte sparrow ja schon befürchtet, dass Du die Ironie in __blackjacks__` Antwort nicht begreifst.

Der Hinweis, dass Du Schleifen brauchst, war eigentlich konkret genug, der Rest ist, dass Du selbst lernen mußt, wie man Python programmiert.

Aber bitte sehr, für den konkreten Code sieht eine Schleife so aus:

Code: Alles auswählen

#!/usr/bin/env python3
def main():
    # start
    a = 1
    b = 0
    print("Beginne mit Abarbeitung")
    while True:
        # 1. Abschnitt
        if a == 1:
            # Bedingung erfüllt, script weiter ausführen
            print("a=1")
        else:
            # Bedingung nicht erfüllt, script weiter ausführen
            print("a ist nicht gleich 1")
        # 2. Abschnitt
        if b == 0:
            # Bedingung erfüllt, wieder am Anfang beginnen
            print("Beginne vom Anfang")
        else:
            print("script weiter abarbeiten")
            break
    # 3. Abschnitt
    print("hier geht es weiter")
    # weitere Anweisungen
    # ENDE

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

@andy65: Das was Du gefunden hast ist ein anderes Modul als das auch dem Python Package Index. Das funktioniert anders. Da steht aber sogar dabei das es sich um einen (funktionierenden!) Aprilscherz handelt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

andy65 hat geschrieben: Sonntag 23. Mai 2021, 22:49 An die anderen Schreiber richte ich den Appell, doch bitte konkrete Vorschläge zu unterbreiten, wie das Problem gelöst werden kann.
Konkrete Vorschläge sind:
1) lerne Python, vergiß goto
2) bleib bei goto, vergiß Python
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

__deets__ hat geschrieben: Sonntag 23. Mai 2021, 22:30 @rogerb du hast scheint es nicht viel Erfahrung mit SO, ...
@__deets__, eine einfach gestrickte aber dennoch leicht durchschaubare Argumentationsweise: Dem Gegenüber sagen, dass er keine Erfahrung hat um die eigene Glaubwürdigkeit zu aufzuwerten und dann irgend etwas behaupten ohne es zu belegen.

Man kann sich ja zum Glück ein eigenes Bild machen und vergleichen. Unter einer Frage auf Stackoverflow sieht man oft mehrere Antworten die versuchen eine bessere Lösung anzubieten. Die beste Antwort bekommt durch die Votes der Community den höchsten Rang. Upvotes bekommen in der Regel nur Antworten die auch konstruktiv eine bessere Lösung anbieten.

Was ich hier kritisiere, ist diese offensichtlich klein-karierte Art, etwas negatives an der Antwort eines Anderen zu suchen. Wenn jemand eine bessere Lösung hat soll er sich die Mühe machen und die posten. Ein gesunder Wettkampf um die bessere Antwort ist hilfreich. Der Fragestelle kann davon nur profitieren sich dann selber entscheiden, welche Antwort ihm am meisten weiterhilft.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

rogerb hat geschrieben: Montag 24. Mai 2021, 11:23 @__deets__, eine einfach gestrickte aber dennoch leicht durchschaubare Argumentationsweise: Dem Gegenüber sagen, dass er keine Erfahrung hat um die eigene Glaubwürdigkeit zu aufzuwerten und dann irgend etwas behaupten ohne es zu belegen.
Wir muessen da ja gar nicht im ungefaehren bleiben - hier ist mein SO-Profil: https://stackoverflow.com/users/84308/d ... reputation

Wie man sehen kann unter den top 7%. Das ist unter normalen Umstaenden nix, womit ich hausieren gehe. Aber es belegt, dass ich mich auf der Plattform durchaus umtreibe, und entsprechend auskenne. Vielleicht willst du deines danebenhalten? So als Beleg fuer das Ausmass, in dem *DU* dich mit der Plattform auskennst? Denn Belege fuer *deine* Behauptungen bist du ja auch schuldig geblieben. Die belegen bis dato nur, dass du nur oberflaechlich geschaut hast, und danach dein Urteil gebildet. Das man da einfach sub-par Code einkippt, und durch die Magie des Votings alles geloest wird. Unsichtbare Hand des Marktes, und so.

Und nur weil deine oberflaechliche Betrachtung der Wirkungsweise von SO hier zum Strohmann aufgebaut wird, entspricht es eben nicht den Tatsachen. Wer dort eine Antwort einstellt, muss sich auf "jaemmerliches reingraetschen" "kleinkarierter" anderer User gefasst machen, die einen auf Fehler oder Verbesserungen hinweisen.

Siehe zB https://stackoverflow.com/questions/315 ... 7#31503117

Oder hier: https://stackoverflow.com/questions/268 ... 7#26809037

Wie man sieht: auch auf SO muss man sich der Kritik anderer Entwickler stellen. Und erreicht auch meistens eine Verbesserung der eigenen Antwort. Womit er oder sie im Zweifel mit einer hohen Bewertung belohnt wird. So funktioniert SO, und deine unterkomplexe Betrachtung wird dem halt nicht gerecht. Genug belegt?

Was uebrigens auf SO sofort aggressiv wegmoderiert wird sind Kommentare, die andere User mit herabwuerdigenden Ausdruecken wie "jaemmerlich", "kleinkariert" und aehnlichem belegen. Kannst du ja mal probieren.

Das SO *eine* (unzweifelhaft erfolgreiche) Form des Frage/Antwort-Forums bereitstellt, bedeutet nicht, dass es die einzige valide Form darstellt, und es keine Nachteile dieser Form gaebe. Es eignet sich zB notorisch schlecht dazu, XY-Probleme zu einem erfolgreichen Abschluss zu bringen. Denn es erlaubt eben genau KEINE Diskussion, in der ein groesserer Kontext exploriert wird. Der Vergleich hinkt also. Und auch wenn es als Resource zum nachschlagen durch sein System gut geeignet ist, ist es auch eine Frage der Oekonomie: wenn jemand hier eine Frage stellt "wie mache ich XY mit Pandas", dann reicht bei SO ein simlper Hinweis auf die entsprechende Methode genau nicht. Sondern es muss ein komplettes Beispiel sein. Dazu fehlen aber vielleicht Zeit und Moeglichkeit. Dem User ist aber oft schon mit dem reinen Hinweis geholfen.

Und dann frage ich mich, was du erreichen willst. Ausser abzukotzen, und dem TE das eigene Thema zuzumuellen, eine Praxis, die du bei anderen ja kritikwuerdig findest....
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Seit nicht mal 2 Wochen ernsthaft aktiv und den Regulars das Forum erklären wollen. So macht man sich beliebt. 👍

Und falls einem das, was sich seit Jahren eingebürgert und bewährt hat, nicht passt, dann kann sich ja mal woanders umschauen. Zwingt einen ja niemand zum Hierbleiben... 🤷‍♂️
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__deets__, tolles Profil. Ich habe viel weniger.
Ich verstehe aber nicht was du mit den Links zeigen willst. Beide deiner Antworten wurden als am nützlichsten eingestuft.
Beim ersten Post hat dir der Fragesteller in den Kommentaren geantwortet, dass es für ihn nicht funktioniert hat.
Beim zweiten Post fand jemand deine Antwort grundsätzlich gut, hat aber auf eine möglich Schwachstelle hingewiesen.
So etwas finde ich völlig normal und in Ordnung.

Aber: Das was für mich das Problem ist, dass dir hier im Forum jemand gekommen wäre und dir vorgeworfen hätte dass man keine Ein-Buchstaben-Variablen, verwendet.
Das ist, zwar richtig ist, wäre an der Stelle aber ein total unnötiger Kommentar.
Das man da einfach sub-par Code einkippt, und durch die Magie des Votings alles geloest wird. Unsichtbare Hand des Marktes, und so.
So etwas habe ich nie behauptet.
Und dann frage ich mich, was du erreichen willst.
Dass man sich entspannt zusammen am Python-Problemen-Lösen üben kann, ohne gleiche ne Einrückungsklage am Hals zu haben, weil das HTML-Formular mal wieder einen eigenen Willen hatte.
Antworten