Hallo, ich beschäftige mich seit ein paar Tagen mit Python und wollte
mal fragen welche Möglichkeiten es gibt das Programm welches am Ende
angekommen ist nochmal auszuführen. Es findet also eine Abfrage statt
möchten Sie einen weiteren Test durchführen (j/n).....
Müsste man das ganze Programm in eine While Schleife einrücken oder gibt
es eine andere Möglichkeit so wie ein jmp oder goto....
Thomas schrieb:> Müsste man das ganze Programm in eine While Schleife einrücken oder gibt> es eine andere Möglichkeit so wie ein jmp oder goto....
Eine Schleife wäre eine Möglichkeit. Eine andere wären die Methoden der
exec*-Familie aus dem Standardmodul os. Mit diesen Methoden wird das
Betriebssystem angewiesen, den aktuell laufenden Prozeß durch einen
frisch neu gestarteten zu ersetzen, der exec*() als Parameter
spezifiziert wird. Das kann natürlich auch das aktuell bereits laufende
Programm sein.
Ein T. schrieb:> Eine andere wären die Methoden der> exec*-Familie aus dem Standardmodul os.
Uhhhhh, das ist aber schon arg von hinten durch die Brust ins Auge
geschossen. ;-)
Aber gut, hier noch einer:
Mittels systemd** einen sich beendenden Prozess endlos automatisch neu
starten.
**oder ähnlichem Mechanismus
Thomas schrieb:> Müsste man das ganze Programm in eine While Schleife einrücken oder gibt> es eine andere Möglichkeit so wie ein jmp oder goto....
Tipp: Mit vi kann man beliebig viele Zeile auf einmal einen weiter
einrücken.
G. K. schrieb:> Thomas schrieb:>>> Müsste man das ganze Programm in eine While Schleife einrücken oder gibt>> es eine andere Möglichkeit so wie ein jmp oder goto....>> Tipp: Mit vi kann man beliebig viele Zeile auf einmal einen weiter> einrücken.> 1,$ >>
Der ist schon ganz gut, wenn auch etwas ›Hau drauf‹ ;-)
Oder zur ersten einzurückenden Zeile gehen, dann:
mx
Zur letzten einzurückenden Zeile gehen,dann:
>'x
Im Grunde genommen ist so ein vi schon ein recht intuitiv zu benutzender
Editor.
Thomas schrieb:> das Programm welches am Ende> angekommen ist nochmal auszuführen. Es findet also eine Abfrage statt> möchten Sie einen weiteren Test durchführen (j/n).....
Die Frage am Ende, die setzt doch schon die Bedingung für eine Schleife.
also danke nach mal für die weiteren Möglichkeiten.
Da das ganze eh wegen des langen Pfades des Netzlaufwerkes per
Batch-Datei aufgerufen wird, werde ich das ganze old school in die Batch
integrieren und das beendete Programm dann einfach nochmals aufrufen.
1
start:
2
python.exe......py
3
4
choice/m"Weiteren Test starten?"#erzeugteineJ/NAbfrage
Ein Gutes Python Programm sollte sowieso immer eine main Funktion haben,
nicht weil sie Gebraucht wird, sondern weil es best pratice ist und
ermöglicht, dass du dein Programm schnell mal zu einem Modul aufwerten
kannst. Außerdem hat das Verwenden einer Main Funktion den Vorteil, das
man dafür Unittest schreiben kann, wenn man es will.
Daher kann die Abfrage durchaus in der Main sein. Die Funktion do_work
ist ein Platzhalter für deinen Code.
1
def do_work():
2
# Dein Python Script
3
pass
4
5
def main():
6
while True:
7
do_work()
8
run_again = input("soll das Programm nochmal laufen (J/N): ")
Norbert schrieb:> Der ist schon ganz gut, wenn auch etwas ›Hau drauf‹ ;-)>> Oder zur ersten einzurückenden Zeile gehen, dann:> mx> Zur letzten einzurückenden Zeile gehen,dann:>>'x>> Im Grunde genommen ist so ein vi schon ein recht intuitiv zu benutzender> Editor.
Ja, schon.
In allen anderen Editoren die ich nutze muss ich immer umständlich die
TAB-Taste drücken.
Das kann sich doch keiner merken! Ich muss das auch jedesmal wieder
googeln.
Le X. schrieb:> Ja, schon.> In allen anderen Editoren die ich nutze muss ich immer umständlich die> TAB-Taste drücken.> Das kann sich doch keiner merken! Ich muss das auch jedesmal wieder> googeln.
Ich sehe und verstehe dein Leid. ;-)
Deshalb mag ich auch die einfache Sequenz: mx … >'x
Zumal man das ›x‹ durch 25 andere Buchstaben ersetzen und so 26
individuelle Blöcke definieren kann.
Mag gar nicht darüber nachdenken, wie schwierig es heutzutage ist, eine
Tastatur mit 26 unterschiedlichen TAB-Tasten zu finden.
Ein Teufelskreis…
sonst springt er nie aus der Schleife raus.
Habs, jetzt aber doch in Python mit einer while Schleife gemacht, falls
es mal auf einem nicht Microsoft System ausgeführt wird, dann ist es
zumindestens im Programm integriert.
Alles markieren und Tab rückt es passend ein.
Harald K. schrieb:> Nun, kennt Python so etwas wie "goto"? Wenn nicht, warum nicht?>> https://www.python-forum.de/viewtopic.php?t=52193
Goto wirst du in modernen Programmiersprachen gar nicht mehr finden. Es
ist eine Ausgeburt der Hölle, die Grundzutat für Spaghetti-Code. Wir
wurde schon in der Schule beigebracht, dass man es nicht verwenden soll,
denn ich hatte es in Pascal verwendet. Ich hatte zuvor viel mit Basic
gemacht und diesen schlechten Programmierspiel rübergenommen.
Oliver hat dir schon das richtige Muster genannt.
Rudi R. schrieb:> Goto wirst du in modernen Programmiersprachen gar nicht mehr finden.
Python wäre aber nicht Python, wenn man goto nicht nachrüsten könnte:
http://entrian.com/goto/download.html> Es ist eine Ausgeburt der Hölle, die Grundzutat für Spaghetti-Code.> Wir wurde schon in der Schule beigebracht, dass man es nicht verwenden> soll
Dann nimm statt goto einfach comefrom. Das wird vom verlinkten Paket
ebenfalls unterstützt.
Alternativ zu while, goto und comefrom kann man Rückwärtssprünge bzw.
Schleifen auch mittels Rekursion realisieren. Leider führt dies in
Python normalerweise schnell zu Stacküberläufen.
Python wäre aber nicht Python, wenn es nicht auch dafür eine Lösung
gäbe:
https://chrispenner.ca/posts/python-tail-recursion
Man kann natürlich für jede extrem einfache Aufgabe über eine Unzahl an
bewusst blödsinnigen Umwegen sinnieren.
Das heißt aber nicht automatisch, dass man es auch tun muss!
Yalu X. schrieb:> Python wäre aber nicht Python, wenn man goto nicht nachrüsten könnte:>> http://entrian.com/goto/download.html
Das ist aber ein Aprilscherz. Guido van Rossum hatte sich aus gutem
Grund gegen Goto entschieden und es wird auch nie kommen. Das scheinen
vor allem Entwickler "aus der guten alten Zeit" zu vermissen. Ich frage
mal morgen unsere Azubis, ob die wissen, was Sprungmarken sind.
Ich hatte mal ein Rüffel erhalten, weil 2008/9 eine Doppelschleife in
Java programmierte.
1
OUTER:
2
for (Obj a in as) {
3
for (Obj b in bs) {
4
5
if (...) {
6
break OUTER;
7
}
8
}
9
}
Das geht ja auch in Java. Es sieht aus wie eine Sprungmarke, ist aber
eine Benamsung der Schleife, dass ich sie mit break oder continue
referenzieren kann. break und continue alleine referenzieren die
innerste Schleife.
Für den Chef waren das Sprungmarken, weil sie so aussahen, und deshalb
böse.
Das mit der Tail-Rekursion werde ich mir bestimmt noch anschauen. Das
Konzept ist ja bekannt. Bei meinen Ausflügen in Scala und Haskell hatte
ich damit Berührung. Und sinnvoll ist allemal. Viele scheuen rekursive
Aufrufe, obwohl viele Dinge rekursiv einfach viel eleganter ausschauen.
Rudi R. schrieb:> ich damit Berührung. Und sinnvoll ist allemal. Viele scheuen rekursive> Aufrufe, obwohl viele Dinge rekursiv einfach viel eleganter ausschauen.
Es geht nicht um aussehen, es geht um Optimierung.
Franko S. schrieb:> Es geht nicht um aussehen, es geht um Optimierung.
die allererste Optimierung ist die, wartbaren, lesbaren und verstehbaren
Quelltext zu schreiben.
D. F. schrieb:> die allererste Optimierung ist die, wartbaren, lesbaren und verstehbaren> Quelltext zu schreiben.
[ ] Du hast den Hintergrund meiner Aussage verstanden.
Thomas schrieb:> Müsste man das ganze Programm in eine While Schleife einrücken oder gibt> es eine andere Möglichkeit so wie ein jmp oder goto....
Man kann auch List Comprehensions in Python einsetzen.
Yalu X. schrieb:> Python wäre aber nicht Python, wenn es nicht auch dafür eine Lösung> gäbe:
Ich musste so lachen..
Tatsächlich lernt man das mit den Schleifen (oder den Tests) nicht an
einem Tag, TE sollte sich einfach selbst ein wenig mehr Zeit zum Lernen
einräumen. Gute Schleifen sind auch Übung- und Probiersache
(Diskutiersache auch gelegentlich) - und ein wenig Abguckerei bei guten
Codern kann auch helfen.
edit: ist eigentlich gerade gut fürs Lernen, wenn man offene Fragen hat,
sich die Antworten dann aber erstmal selbst erarbeitet.