Seite 1 von 2

Verfasst: Mittwoch 14. März 2007, 16:49
von Masaru
Das "raw_input" solltest Du mit in die Schleife packen, damit bei Falscheingaben die Schleife im erneuten Zuge einen neuen Wert vergleichen kann.

Du kannst z.B. auch in Python aus Schleifen mit dem break Statemen ausbrechen.

Beispiel:

Code: Alles auswählen

i = 0
while True
    if i > 10:
        break
    i += 1
In Python verwendet man gerne für eine immer fortwährende Schleife die Kopfdefinition:

Code: Alles auswählen

while True
oder

Code: Alles auswählen

while 1:

Verfasst: Mittwoch 14. März 2007, 16:53
von Drake

Code: Alles auswählen

import sys
i = 0
print "Zum schließen bitte exit eingeben!"
exit = ""

while i < 1:
    stop = raw_input().upper()
    while stop == "stopit":
        if stop == "stopit":
            sys.exit(0)
        else:
            "Programm wird weitergeführt!"

    
Geht trotzdem noch nicht ..

(Hab das exit mal in stopit umbenannt ..)

Verfasst: Mittwoch 14. März 2007, 16:54
von gerold
Drake hat geschrieben:Es läuft zwar weiter aber die Eingabe von exit hat keine Wirkung .. Woran liegt das?
Hallo Drake!

Da musst du wohl noch ein wenig an der Programmlogik arbeiten. :shock:

Viele Wege führen nach Rom -- so auch dieser:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

print "Zum Schliessen bitte 'exit' eingeben!"
while not raw_input().upper() == "EXIT":
    print "Programm wird weitergefuehrt!"
mfg
Gerold
:-)

Verfasst: Mittwoch 14. März 2007, 17:00
von gerold
...und hier eine andere Variante. ;-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

print "Zum Schliessen bitte 'exit' eingeben!"
while True:
    if raw_input().upper() == "EXIT":
        break
    print "Programm wird weitergefuehrt!"
mfg
Gerold
:-)

Verfasst: Mittwoch 14. März 2007, 17:02
von Masaru
Kurz zum Beispiel von gerold (meins sieht ähnlich grad hier aus *g*, war nur langsamer).

1.) Wenn Du Sonderzeichen in Deinem Code mit eincodieren möchtest, musst Du die Datei in einem Encoding abspeichern, welches ein gültiger in Codec in der sogenannten "Magic-Line" (die 1. oder 2. Zeile, mit einem # Zeichen eingeleitet) ist, und diesen Codec dort mit auch angeben.

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
2.) Die Methode <string>.upper() wandelt Buchstabe in Großbuchstaben um, <string>.lower() in Kleinbuchstaben ... falls halt nicht eh schon so vorhanden.

3.) Manchmal ist es geschickter kein explizites sys.exit() zu setzen, auch wenn es verlockt. Wenn ein Programmdurchlauf sein Ende ohne Fehler erreicht hat, beendet der Python Interpreter eh den Aufruf mit dem Exitcode 0.

Verfasst: Mittwoch 14. März 2007, 17:05
von Drake
Viele Wege führen nach Rom -- so auch dieser:
Da hast du Recht, dieser Weg führt nach Rom! Doch dieser nicht:

Code: Alles auswählen

import sys
sys.exit(0)
Denn das Programm wird nicht geschlossen sonder es taucht folgende Fehlermeldung auf:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Eigene\exit.py", line 10, in <module>
    sys.exit(0)
SystemExit: 0
EDIT: Hab grad den Beitrag vior mir gelesen .. Wie soll ich das Programm denn sonst beenden?

Code: Alles auswählen

        if stop == "STOPIT":   
        else:
            "Programm wird weitergeführt!"
Dabei meckert er rum ..

Verfasst: Mittwoch 14. März 2007, 17:15
von Masaru
Drake hat geschrieben:... Da hast du Recht, dieser Weg führt nach Rom! Doch dieser nicht:

Code: Alles auswählen

import sys
sys.exit(0)
sys.exit schleudert eigentlich nichts anderes als die Exception "SystemExit" hinnaus. Einige Umgebungen catchen leider auch diese mit ... könnte mir vorstellen, dass Du Dein Script nicht einfach als Python-Script aus der CMD aufrufst, oder?
Drake hat geschrieben:

Code: Alles auswählen

        if stop == "STOPIT":   
        else:
            "Programm wird weitergeführt!"
Dabei meckert er rum ..
Klar .. if-else erfordert jeweils mindestens eine Zeile und dann um 4 Zeichen dadrunter eingerückt irgend etwas ... und sei es das Statement pass:

Code: Alles auswählen

if stop == "STOPIT":
    pass
else:
    "Programm wird weitergeführt"
In Deinem falle aber wäre ein "break" als Folge des IF-Blockes die gewünschte Wahl.

Verfasst: Mittwoch 14. März 2007, 17:20
von Drake

Code: Alles auswählen

import sys
i = 0
print "Zum schließen bitte exit eingeben!"
exit = ""

while i < 1:
    stop = raw_input().upper()
    while stop == "STOPIT":
        if stop == "STOPIT":
            break
        else:
            "Programm wird weitergeführt!"

2 Probleme:

1.) Bei Eingabe von stopit wird das Programm weitergeführt

2.) Bei Eingabe von irgendwas anderem wird nich "Programm wird weitergeführt" ausgegeben.

Verfasst: Mittwoch 14. März 2007, 17:25
von Masaru
Lies einmal am besten Dir Deine Schleifen- und Bedingungskonstrukte "laut" vor ...
  • - ersetze die Wörter "While" mit "solange"
    - "if" mit "wenn"
    - Boolsche Ausdrücke wie "i < 0" mit "i ist kleiner als 0"
... und dann geh nochmal durch Deinen Code durch.

Du wirst sehen, dass Du zum einen an einigen Stelle eine unglücklich gewählte Programmlogik verwendest, und an anderen es überhaupt keinen Sinn macht.

Gerold hat Dir zwei funktionierende Beispiele geliefert, welche im Vergleich mit Deinen gut Aufschluss über den Aufbau und die Funktion geben sollten.

Vielleicht als Information: mit einem break kannst Du immer nur aus dem aktuellen Schleifen-Kontrukt ausbrechen, in dem es eingegliedert ist (nicht aber evntuellen dort drum liegenden).

EDIT:
Wenn Du also zwei geschachtelte Schleifen (wie in Deinem Falle) hast, und brichts aus der "inneren" aus, so bleibt die "äussere" dennoch weiterhin bestehen.

Verfasst: Mittwoch 14. März 2007, 17:31
von Drake
Das habe ich mal gemacht und komme auf folgendes Ergebnis:

Code: Alles auswählen

import sys
i = 0
print "Zum schließen bitte exit eingeben!"
exit = ""

while i < 1:
    stop = raw_input().upper()
    if stop == "STOPIT":
        pass
    else:
        print "Programm wird weitergeführt!"


Pseudocode:

Code: Alles auswählen

solange i kleiner is als 1
eingabeaufforderung erstellen
wenn stop den wert "stopit" enthält
"Beende"
sonst
schreibe "Programm wir weitergeführt!"
Funzt alles ausser das beenden ...

EDIT: pass durch break ersetzt .. Wenn ich STOPIT eingebe geht es, bei stopit allerdings nicht .. Wie kann ich case-sensetive aussschalten?

Verfasst: Mittwoch 14. März 2007, 17:33
von Masaru
*hustet*

Code: Alles auswählen

...
    if stop == "STOPIT":
        i = 1    # <--- Abbruchbedingung für die äussere Schleife
        # pass   # <--- kann nun weggelassen werden
...
oder

Code: Alles auswählen

...
    if stop == "STOPIT":
        break    # <--- aus der aktuellen Schleife 'while i < 1' ausbrechen
        # pass   # <--- kann nun weggelassen werden
...
EDIT:
und was Deine Eingabe "STOPIT" vs. "stopit" angeht ... wenn Dir die case-sensitive Schreibweise egal ist, dann lower() oder upper() einfach sowohl den Eingabe, wie auch den Vergleichswert, bevor Du den tatsächlichen Vergleich durchführst.

Verfasst: Donnerstag 15. März 2007, 07:51
von sape
EDIT: Ups, habe die zweite Seite nicht gesehen! -- Frage wurde ja schon beantwortet.