kleine if -Abfrage mit drei Optionen elegant gestalten?!

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
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

Dienstag 24. Februar 2009, 10:10

Hallo,

ich möchte eine Abfrage gestalten die etwas tut, wenn die Eingabe entweder 2007, 2008 oder 2009 entspricht.

Alles was mir einfällt ist sehr umständlich (elif, elif...?!)

datumsabfrage = ['2007', '2008', '2009']
if abfrageErgebnis == datumsabfrage[0]:
print "OK"

-> kann man das schöner machen?!
Danke, Grüße,
Christine
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Dienstag 24. Februar 2009, 10:14

Code: Alles auswählen

if wert in [2007, 2008, 2009]:
    pass
if 2007 <= wert <= 2009:
    pass
[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 24. Februar 2009, 10:19

Hallo christine, willkommen im Forum!

Ich sehe einen Widerspruch zwischen deiner Problembeschreibung und dem Code. Meinst du so etwas?

Code: Alles auswählen

if jahr in [2007, 2008, 2009]:
    print "jahr ist drin"
Falls sicher ist, dass jahr ganzzahlig ist, ginge auch:

Code: Alles auswählen

if 2006 < jahr < 2010:
    print "jahr ist drin"
Oder ist es das:

Code: Alles auswählen

if jahr == 2007:
    print "2007"
elif jahr == 2008:
    print "2008"
elif jahr == 2009:
    print "2009"
else:
    print "nix"
Dann hängt es davon ab, was du im Anweisungsblock vorhast. Auf jeden Fall ließe sich das durch ein dictionary ersetzen. Ob sich das bei drei zu unterscheidenden Möglichkeiten schon lohnt, ist Geschmackssache.
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

Dienstag 24. Februar 2009, 10:32

Hey,

vielen Dank für die schnellen Antworten.
Ich währe z.B.: nicht darauf gekommen die Liste direkt in die Abfrage zu
setzen.
Hab auch schon mit Regulären Ausdrücken usw rumprobiert...

mercy 8)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 25. Februar 2009, 16:36

Manchmal ist es aus sinnvoll, direkt oder indirekt über Directory-Objekte zu dispatchen. Dieses Beispiel passt nicht direkt auf die Aufgabe mit den drei Daten, aber mir war gerade danach :)

Code: Alles auswählen

class Foo:
    def a(self): print "A"
    def b(self): print "B"
    def c(self): print "C"
    
    def dispatch(self, code): getattr(self, code)()

Foo().dispatch("a")
Stefan
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 26. Februar 2009, 14:37

Ach, da geht noch einiges ... ^^

Code: Alles auswählen

import functools

def dispatchable(name):
    def marker(func):
        func.dispatch_name = name
        return func

    return marker


class NotDispatchable(Exception):
    pass


class DispatchableMeta(type):
    def __init__(cls, name, bases, dct):
        type.__init__(cls, name, bases, dct)
        
        def disp(self, name):
            try:
                return functools.partial(self.dispatchables[name], self)
            except KeyError:
                raise NotDispatchable()
        
        dispatchables = {}
        
        for value in dct.itervalues():
            try:
                dispatchables[value.dispatch_name] = value
            except AttributeError:
                pass

        try:
            old = cls.dispatchables
        except AttributeError:
            old = {}
        
        cls.dispatchables = dispatchables
        for key, value in old.iteritems():
            if key not in cls.dispatchables:
                dispatchables[key] = value
        
        cls.dispatch = disp



class Spam:
    __metaclass__ = DispatchableMeta

    @dispatchable("eggs")
    def la_function(self):
        print "eggs"

test = Spam()
test.dispatch("eggs")()
Das Leben ist wie ein Tennisball.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 27. Februar 2009, 18:46

Noch ein paar mehr Features, und du kannst es als Teil von PEAK veröffentlichen...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 27. Februar 2009, 20:33

Hallo christine

Hier noch zwei abstrakte Varianten:

Code: Alles auswählen

year = '2007'

year_check = {
    '2007': True,
    '2008': True,
    '2009': True
    }.get(year, False)

print "Jahr-Check", year_check

Code: Alles auswählen

def year_checker(year):
    return {
        '2007': True,
        '2008': True,
        '2009': True
        }.get(year, False)

year = '2007'
print "Jahr-Check", year_checker(year)
Gruss wuf :wink:
Take it easy Mates!
Antworten