Mehrere aufeinander folgende if anweisung in python kürzen

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.
karomi
User
Beiträge: 18
Registriert: Mittwoch 12. Juli 2006, 12:42

Mehrere aufeinander folgende if anweisung in python kürzen

Beitragvon karomi » Dienstag 14. November 2006, 18:19

Hallo Allerseits,
mein python Skript läuft einbahnfrei. Solang ich ein statische Code Analyse durchführe, spuckt mir der Analysator (PyLint) eine Warning aus:
Ich verwende viele if Anweisungen hintereinander in einer Funktion.
Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?
Es gibt ja kein swith und case wie in C oder C++!!!!!!!!!!!!

Kann jemand mir ein Tipp geben??
Vielen Dank
Karomi
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Mehrere aufeinander folgende if anweisung in python kürz

Beitragvon Leonidas » Dienstag 14. November 2006, 18:21

karomi hat geschrieben:Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?

Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.

karomi hat geschrieben:Es gibt ja kein swith und case wie in C oder C++!!!!!!!!!!!!

Brauchts auch nicht (und ein Ausrufezeichen reicht, bei dir klingt es so, als wäre es sehr schlimm, dass es kein Switch/Case gibt).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Mehrere aufeinander folgende if anweisung in python kürz

Beitragvon gerold » Dienstag 14. November 2006, 18:39

karomi hat geschrieben:Ich verwende viele if Anweisungen hintereinander in einer Funktion.

Hi Karomi!

Solange dein Code funktioniert, gut lesbar ist und du nicht zehn oder zwanzig unnötige If-Anweisungen untereinander stehen hast, würde ich mir keine Sorgen machen.

Gerade in die "zuviele IF"-Geschichte wird manchmal zu viel Energie gesteckt. Oft ist es die Aufregung nicht wert. Und andere Lösungen sind auch nicht gerade einfacher und übersichtlicher.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Re: Mehrere aufeinander folgende if anweisung in python kürz

Beitragvon jens » Dienstag 14. November 2006, 18:53

Leonidas hat geschrieben:Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.

So würde ich das auch machen ;)

@karomi: Zeig doch mal den Code an dieser Stelle.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Dienstag 14. November 2006, 19:16

Ich denke man sollte diese Warnung von PyLint ernst nehmen wenn es sich um verschachtelte ``if``-Anweisungen handelt, denn dann hat man es mit erhöhter und wahrscheinlich zu hoher Komplexität in einer Funktion zu tun.

Wenn die ``if``/``elif``-Anweisungen linear als switch/case Ersatz benutzt werden, dann kann man dem Quelltext in der Regel einfach folgen.

Man kann natürlich trotzdem kurz überlegen ob ein Dictionary oder eine Schleife benutzt werden kann.
karomi
User
Beiträge: 18
Registriert: Mittwoch 12. Juli 2006, 12:42

Noch eine Frage

Beitragvon karomi » Mittwoch 15. November 2006, 09:11

Hallo,
ijr habt geschrieben:
Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.

Was ist ein Hastables?
Kann jemand ein Beispiel hier schreiben???

Noch was?
ich konnte mir nicht vorstellen wie ich IF Anweisungen durch ein Dictionary ersetzen kann, kann jemand ein Beispiel geben???

Vielen Dank
Karomi
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Re: Mehrere aufeinander folgende if anweisung in python kürz

Beitragvon sape » Mittwoch 15. November 2006, 09:23

Leonidas hat geschrieben:
karomi hat geschrieben:Wie kann man das verhindern dass ich weniger if Anweisungen schreibe?

Mit der Benutzung eines Hastables, d.h. eines Dicts, an das Funktionen gebunden werden.
[...]

ich verstehe nicht was du meinst :? Wie kann ein Dict ifs ersetzen?

lg
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 15. November 2006, 10:09

Hoi,

etwas Pseudocode zur Erklärung wie ein dict (hashtable in anderen Sprachen) switch oder case Statements ersetzen kann:

Code: Alles auswählen

def f1(): pass
def f2(): pass
def f3(): pass

function_dict = {
'parameter1' : f1,
'parameter2' : f2,
'parameter3' : f3}

#entweder:
function_to_call = function_dict[paramter]
function_to_call()
#oder in einer Zeile:
function_dict[paramter]()


Gruß,
Christian
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 15. November 2006, 11:26

Hmm, allso stat so...

Code: Alles auswählen

[...]
para = "parameter1"
if para == "parameter1":
    f1()
elif para == "parameter2":
    f2()
elif para == "parameter3":
    f3()
[...]

...schreibe ich das so?

Code: Alles auswählen

[...]
para = "parameter1"
function_dict[para]()

Hmm, das funtzt aber nur mit Funktionen/Methoden und nciht für mehrere Zeilen code in nem if-block.

Oder anders: Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?

lg
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Beitragvon r2d2 » Mittwoch 15. November 2006, 11:33

vielleicht hilft das hier:

Code: Alles auswählen

def f0(): print "0"
def f1(): print "1"
def f2(): print "2"

fx = [f0,f1,f2]

dann:
for i in range(0,3):
    fx[i]()
    '''statt:
    if i == 0: f0()
    if i == 1: f1()
    if i == 2: f2()'''


die funktionen werden einfach in einer liste gespeichert.

r2d2
äh, nimm diese schlange von meinem hals.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 15. November 2006, 11:37

XtraNine hat geschrieben:Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?

Hi XtraNine!

Sicher nicht! Das würde die Sache nur verkomplizieren.

Du kannst auch einfache Werte zurück geben lassen. Z.B. so:

Code: Alles auswählen

def is_ok(parameter):
    d = {
        "TRUE": "ok",
        "OK": "ok",
        "FALSE": "nicht ok"
    }
    return d[parameter]
print is_ok("TRUE")


Das kann aber kein Ersatz für das wirklich einfach zu verwendende if-elif-else sein, wenn einfach nur ein paar logische Bedingungen ausgewertet werden sollen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Beitragvon BlackJack » Mittwoch 15. November 2006, 12:21

XtraNine hat geschrieben:Oder anders: Sol das ein Wink mit den Zaunpfahl sein, das man Anweisungen die man in if-blöcke packt (wo man sehr viel if-blöcke hat ca. um die 20), lieber in Funktionen aufteilen sollte, die dann über ein hashtable aufgerufen werden um sich die ifs zu sparren?


Im Fall von 20 ``if``-Blöcken, die mehrere Zeilen Quelltext enthalten, würde sagen ja. Wenn diese Blöcke komplett unterschiedlichen Code enthalten, macht die Funktion zu viele verschiedene Dinge auf einmal und wenn nahezu das gleiche mit leichten Variationen gemacht wird, dann braucht man nicht für jeden Block eine andere Funktion, sondern kann die Gemeinsamkeiten in einer oder zwei parametrisierten Funktionen herausziehen.

Aber das kommt wie gesagt auch immer auf den konkreten Fall und ein wenig auf den eigenen Geschmack an, wie man das am "besten" löst.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 15. November 2006, 15:47

r2d2 hat geschrieben:vielleicht hilft das hier:
...
die funktionen werden einfach in einer liste gespeichert.

Na, das allerdings ist Code schön nach der Reihe ausführen - nur etwas verkompliziert.

Im Übrigen habe ich nichts zu meinen Vorschreibern hinzuzufügen - manches ist Geschmackssache. Ich wollte nur die Eingabe von 'Leonidas' erläutern.
Gruß,
Christian
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Beitragvon r2d2 » Mittwoch 15. November 2006, 17:07

@CM

der code sollte lediglich die prinzipielle funktionsweise veranschaulichen. klar, dass das beispiel sinnfrei ist.

r2d2
äh, nimm diese schlange von meinem hals.

Wer ist online?

Mitglieder in diesem Forum: WhiteyW