OOP 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.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 14. März 2007, 16:49

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:
Zuletzt geändert von Masaru am Mittwoch 14. März 2007, 16:53, insgesamt 1-mal geändert.
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

Mittwoch 14. März 2007, 16:53

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 ..)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 14. März 2007, 16:54

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 14. März 2007, 17:00

...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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 14. März 2007, 17:02

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.
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

Mittwoch 14. März 2007, 17:05

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 ..
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 14. März 2007, 17:15

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.
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

Mittwoch 14. März 2007, 17:20

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.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 14. März 2007, 17:25

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.
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

Mittwoch 14. März 2007, 17:31

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?
Zuletzt geändert von Drake am Mittwoch 14. März 2007, 17:34, insgesamt 1-mal geändert.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 14. März 2007, 17:33

*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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Donnerstag 15. März 2007, 07:51

EDIT: Ups, habe die zweite Seite nicht gesehen! -- Frage wurde ja schon beantwortet.
Antworten