Programmablauf

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
ruschu
User
Beiträge: 4
Registriert: Mittwoch 5. September 2018, 14:53

Hallo,

ich habe neu mit Python begonnen. Kann man, um ein Programm dauerhaft laufen zu lassen, nur mit der While-Schleife arbeiten oder gibt es noch andere Möglichkeiten ? Ich konnte dazu in Dokumentationen nichts finden. Von anderen Programmiersprachen kenne ich z.B. Sprungbefehle, um wieder an den Anfang zu springen.
Im voraus vielen Dank
Gruß
Ruschu
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sprungmarken gibt es nicht. Wenn es ein simples Programm ist, dann ist eine while-Schleife das Mittel der Wahl, ja. Ansonsten gibt es diverse mainloop-Implementierungen, zB fuer tkinter, asyncio und co.
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

@ruschu: was fehlt Dir bei einer while-Schleife an Funktionalität?
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ruschu: Man kann GOTO nachrüsten: https://github.com/snoack/python-goto/ (Nicht ernstgemeinter Vorschlag :-))

@Sirius3: Das ist so furchtbar übersichtlich. ;-)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ruschu
User
Beiträge: 4
Registriert: Mittwoch 5. September 2018, 14:53

vielen Dank für die Antworten.
@Sirius3 Es geht mir hier nicht um Funktionalitäten sondern darum ob es nur mit While geht oder ob ich hier noch was anderes nehmen kann. Ich komme aus dem Bereich SPS wo alle Programme kontinurlich durchlaufen.
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ruschu: Die einfachste Möglichkeit ist ``while True:`` wenn man etwas immer wieder wiederholen möchte. Neben dem `python-goto` das ich verlinkt habe, könnte man sich noch einen „tail call optimization“-Dekorator suchen (oder selber schreiben) und das ``while`` durch Rekursion ersetzen, aber das ist alles eher exotisch. In einigen Fällen geht statt ``while`` auch eine ``for``-Schleife wenn man ein Objekt hat das iterierbar ist, oder sich so eines schreiben kann.

Auf was für eine Ebene bewegen sich denn die Programmiersprachen im SPS-Bereich? Das was ich bisher gesehen habe waren eher Low-Level-Sprachen die eher an Assembler erinnern als an eine Hochsprache. Da ist Python deutlich anders.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ruschu
User
Beiträge: 4
Registriert: Mittwoch 5. September 2018, 14:53

@__Blackjack__ Im SPS-Bereich wird hauptsächlich mit logischen Verknüpfungen gearbeitet, die in Herstellereigenen Sprachen arbeiten. In vielen Bereichen wird auch mit SCL programmiert, was auf Pascal basiert. Der Aufbau dieser Programme ist ganz anders. Es werden am Anfang alle Eingänge eingelesen und mit diesem Abbild gearbeitet. Am Schluß eines Durchlaufs werden ein Abbild der Ausgänge ausgegeben und dann läuft das Programm wieder automatisch von vorne los. Hier werden auch viele Prozesse gleichzeitig abgearbeitet.
Benutzeravatar
kbr
User
Beiträge: 1507
Registriert: Mittwoch 15. Oktober 2008, 09:27

@ruschu: in Python ist das ähnlich umsetzbar, aber eben nicht automatisch. Du bist daher sogar freier bei der Programm-Erstellung. Was Du innerhalb der while Schleife machst, darf beliebig komplex werden.

Code: Alles auswählen

while True:
    data = read_input()
    result = process(data)
    write_output(result)
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und falls man das Lesen der Eingabedaten für jeden Durchlauf schon als iterierbares Objekt hat, oder sich so etwas schreiben kann, dann kann man das auch als ``for``-Schleife ausdrücken:

Code: Alles auswählen

for data in read_inputs():
    result = process(data)
    write_output(result)
Oder:

Code: Alles auswählen

for result in map(process, read_inputs()):
    write_output(result)
Und dann noch ganz ohne Schleife an der Stelle im Code wenn man eine Funktion oder Methode hat die ein iterierbares Objekt von Ergebnissen schreiben kann:

Code: Alles auswählen

write_outputs(map(process, read_inputs()))
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten