IF ELSE und richtig beenden

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
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Hallo Allerseits,

Ich habe ein Problem mit der If Else Konstruktion. Es soll in ein If konstruktion reinlaufen dort ein paar Funktionen ausführen und sich beenden.

Mein Programm in Pseudo Code
from sys import exit # habe ich noch nicht wirklich erfahrung

Code: Alles auswählen

if string01 in temp:
    #führe funktionen aus
    # und das reicht da sollte das Programm fertig sein 
    # hier exit() ??
if string02 in temp:
    #führe funktionen aus
    # und das reicht da sollte das Programm fertig sein 
    # hier exit() ??
else:
    print "FEHLER"
Kann ich dann exit() am schluss des If Blocks schreiben ist das ein sauberer ausgang ?
weil sonnst immer else ausgeführt wird als letztes obwohl es in den If Block geht.

Hat jemand einen Vorschlag ?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

du könntest `elif` anstatt des zweiten `if`benutzen und dann terminiert das script am ende wie es sein sollte ;)
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Müsste ich mal ausprobieren, das Problem ist ich habe viele von den strin01 so zu sagen bis string08

Code: Alles auswählen

if string01 in temp:
    #funktionen 

elif string02 in temp:
    #funktionen 
...

elif string08 in temp:
    #funktionen 

else:
    print "Fehler"
ich vermute aber jetzt schon, dass das else immer ausgeführt wird.
Die frage ist wie sauber ist exit()

Aber danke für deine Antwort
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Geh mal einen Schritt zurueck und beschreibe uns das eigentliche Problem das du loesen willst.
BlackJack

@Praktikant03: Dein Verdacht ist falsch und das hätte man auch ganz einfach herausfinden können.

Wenn die Tests so regelmässig sind, dann würde man wohl eher eine Schleife über die `string01` bis `string??` und eine jeweilige dazugehörige Funktion schreiben.
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Das eigentliche Problem ist, dass immer die else anweisung am Schluss ausgeführt wird.
Wenn ich diese aber wegnehme bekomme ich keine Information ob das Skript gut gelaufen ist oder nicht.

Auch weiß ich leider nicht genau wie man ein Python Programm korrekt beendet bzw. Es sich selbst korrekt beendet
und falls nicht ich wenigstens eine Fehlermedung bekomme wo es hängen geblieben ist.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Praktikant03. Du hast die Frage von Blackjack falsch verstanden. Es geht nicht darum, ihm dasselbe wie oben nochmal in anderen Worten zu erklären, sondern zu erklären, wozu du überhaupt ein if-elif-else Statement verwenden willst? Was ist das Ziel deines Programms? Hast du deinen Editor heute aufgemacht mit dem Ziel, ein Programm zu schreiben das einen else-Block beinhaltet, oder mit dem Ziel, ein Programm zu schreiben, das etwas bestimmtes tut? Was ist es, das dein Programm tun soll? Und was soll der Teil desselben tun, um den es gerade geht?
In specifications, Murphy's Law supersedes Ohm's.
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Es ist eigentlich nicht kompliziert.
Es wird einfach nur überprüft ob die Strings01 bis String08 in einer variablen namens temp existieren (die eine Textdatei ist)

Falls ja führe für den jeweiligen String z.b String03 einige Funktionen aus. Das funktioniert auch super ohne Problem.

Es ist wohl nur eine verständnis Frage weil wenn ich nur if´s benutze was passiert wenn keins ausgeführt wird ?

Setze ich nun aber ein else am schluss wird dieses obwohl es in den IF Block kommt und alles gut abgearbeitet wird, ausgeführt.

Die Frage die ich mir stelle ist kann ich nicht am Schluss der IF anweisung den Programm sagen beende dich ordentlich und falls etwas schief läuft
gib nur noch den Fehlercode 1 aus.

Hm hoffe es ist etwas verständlicher
BlackJack

@Praktikant03: Der ``else``-Zweig wird nur dann ausgeführt wenn weder der ``if``-Zweig, noch einer der ``elif``-Zweige ausgeführt wurde. Wenn Du nur ``if``\s benutzt dann gilt das ``else`` nur für das ``if`` zu dem es gehört. Also benutze nicht nur ``if``\s wenn du eigentlich *ein* Konstrukt haben willst zu dem das ``else`` gehört.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Praktikant03 hat geschrieben:Es wird einfach nur überprüft ob die Strings01 bis String08 in einer variablen namens temp existieren (die eine Textdatei ist)
Sobald du anfängst Variablennamen durchzunummerieren machst du in der Regel etwas falsch.

Ein Ansatz mit einer geeigneten Datenstruktur wie z.B. einer Liste könnte hier helfen, diese elend langend if-elif-Kaskaden zu vermeiden.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

vielleicht hilft Dir das a bisl weiter:

Code: Alles auswählen

patterns = ['eins', 'zwei', 'drei', 'vier',
            'fuenf', 'sechs', 'sieben', 'acht']

def start():
    while True:
        text = raw_input('Ctrl-C beendet!\n> ')
        results = [(p, p in text) for p in patterns]
        print results

if '__main__' in __name__:
    start()

Code: Alles auswählen

>>> start()
Ctrl-C beendet!
> Das ist ein Text mit ein, zwei oder sogar mehr als sieben Begriffen!
[('eins', False), ('zwei', True), ('drei', False), ('vier', False), ('fuenf', False), ('sechs', False), ('sieben', True), ('acht', False)]
Ctrl-C beendet!
> Das ist ein Text mit null Treffern!
[('eins', False), ('zwei', False), ('drei', False), ('vier', False), ('fuenf', False), ('sechs', False), ('sieben', False), ('acht', False)]
Ctrl-C beendet!
>
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@Praktikant03: Zumindest der Beschreibung nach möchtest Du wohl so etwas:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys


def process_spam(content):
    pass


def revive_exotic_bird(content):
    pass


def make_omelette(content):
    pass


def main():
    with open('test.txt') as data_file:
        data = data_file.read()

    for keyword, function in [
        ('spam', process_spam),
        ('parrot', revive_exotic_bird),
        ('eggs', make_omelette),
    ]:
        if keyword in data:
            function(data)
            break
    else:
        print 'Fehler'
        sys.exit(1)



if __name__ == '__main__':
    main()
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Ok vielen dank an euch alle sorry hatte gestern schon feierabend und heute ist ein neuer Tag
ich probiere die Anregungen heute mal aus und poste nochmal

aber danke an alle
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Ah sorry,
die Else Funktion wird nicht ausgelöst habe nochmal nachgeschaut. Genau BlackJack so etwa sieht das ganze aus.

Ist es nicht etwas gefährlich mit "break" zu beenden ?

Genau ich lese eine txt datei ein, wie etwa

Code: Alles auswählen

with open('test.txt') as data_file:
        data = data_file.read()
die ich durch

Code: Alles auswählen

subprocess.call('irgendwas -argument', shell=True) 
bekomme. Gibt es einen direkten Weg
es als string Variable zu bekommen ohne den Umweg über eine textdatei ? Durch vllt. stdout oder so ?

Irgendwelche Ideen ? Danke
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Praktikant03 hat geschrieben:Ist es nicht etwas gefährlich mit "break" zu beenden ?
break steht ja nun nicht dafür, dass dadurch der Computer zerstört wird, sondern dass die umschließende for-Schleife verlassen wird.
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Ok, bins nur so vom Unterricht gewohnt break mit großen bedacht ein zu setzten vorallem in C.
BlackJack

@Praktikant03: Mal davon abgesehen dass ich ``break`` auch in C nicht mit besonderer Vorsicht einsetze, sondern eben dann wenn es passt und Sinn macht, hat C kein ``else`` was zusammen mit ``for`` oder ``while`` benutzt werden kann. Python hat das und es benötigt ein ``break`` um diesen ``else``-Zweig *nicht* auszuführen. Zusätzlich kennt Python's Syntax keine ``do {…} while(condition)``-Schleife, also muss man das mit einer Endlosschleife und einem ``if`` + ``break`` ausdrücken.

Die Dokumentation zum `subprocess`-Modul hat einen Haufen Beispiele. Und ``shell=True`` sollte man vermeiden. Da setzt man sich unnötigerweise eine Shell zwischen das eigene Programm und den externen Prozess, mit all den Problemen die sich daraus ergeben können.
Antworten