Flexible Funktionsparameter

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
Freitag
User
Beiträge: 5
Registriert: Sonntag 5. November 2017, 02:50

Mahlzeit zusammen,
meine Aufgabe ist es hier eine Funktion zu schreiben, welche eine Liste und mehrere Zahlen (beliebig und unbekannt) als Keyword Parameter übergeben bekommt. Diese soll True zurückgeben, wenn jedes Keyword mindestens in der übergebenen Anzahl in der Liste enthalten ist.
Das ist mein Ansatz dafür, ich bin für jede Hilfe dankbar!

Code: Alles auswählen

def check_list(*arg,**kwargs):
    for item in kwargs:
        kwarg.count(item)
        if kwarg.count(item) <= arg:
            return True
        else: 
            pass
        return arg, kwarg
Freitag
User
Beiträge: 5
Registriert: Sonntag 5. November 2017, 02:50

Momentan tritt dieser Fehler auf: name 'kwarg' is not defined, ich weiß jedoch nicht richtig damit umzugehen
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Freitag: was fängt man mit der Meldung »kwarg« ist nicht definiert an? Vielleicht, dass »kwarg« nicht definiert ist, also nie einen Wert erhalten hat. Ein else-Zweig, der nur `pass` enthält, kann man auch gleich ganz weglassen. Eine Zahl mit einer Liste zu vergleichen, wird nicht funktionieren und Deine `return`s solltest Du Dir auch nochmal anschauen.
Freitag
User
Beiträge: 5
Registriert: Sonntag 5. November 2017, 02:50

Ich weiß nicht wie ich das korrigieren soll. Wir sollen die Aufgabe hochladen und dann wird das mit asserts kontrolliert. ich hatte gedacht kwargs ist dann definiert, wenn die Kontrolle, Beispielwerte drüber laufen lässt aber dem ist anscheinend nicht so. Die else Zeile habe ich entfernt...
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Code: Alles auswählen

kwarg.count(item)
Du rufst hier die Methode `count` des Objekts `kwarg` auf. Nur: `kwarg` gibt es nicht -> Fehlermeldung. Völlig logisch :-)

Entweder meinst du `kwargs` oder du meinst was, was du vorher nicht definiert hast. Das müsstest du dann machen.

Was _erwartest_ du denn, welchen Wert `kwarg` haben sollte?

Gruß, noisefloor
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Freitag hat geschrieben:Mahlzeit zusammen,
meine Aufgabe ist es hier eine Funktion zu schreiben, welche eine Liste und mehrere Zahlen (beliebig und unbekannt) als Keyword Parameter übergeben bekommt.
Keyword-Parameter bestehen aus einem Schlüssel und einem Wert. Die Zahlen sind die Werte (da Schlüssel keine Zahlen sein können) -- aber was sind die Schlüssel? Irgendetwas Beliebiges? Kannst du einen Beispielaufruf der Funktion zeigen?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schlüssel können Zahlen sein. Alles was hashbar ist, kann ein Schlüssel sein. Wichtig ist, dass der Hashwert sich nicht verändert.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Offtopic: Eine völlig valide Hash-Funktion könnte wie folgt aussehen:

Code: Alles auswählen

def hash(value):
    return 0
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

snafu hat geschrieben:Schlüssel können Zahlen sein. Alles was hashbar ist, kann ein Schlüssel sein. Wichtig ist, dass der Hashwert sich nicht verändert.
Ja, für Dictionaries hast du recht. Für Keyword-Parameter, um die es ja ging, gilt das aber meines Wissens nicht:

Code: Alles auswählen

In [1]: def func(**kwargs):
   ...:     print(kwargs)
   ...:     

In [2]: func(a=1)
{'a': 1}

In [3]: func(1=1)
  File "<ipython-input-3-b103a6d28baf>", line 1
    func(1=1)
Vielleicht hätte ich nicht den Begriff "Schlüssel" verwenden sollen; ich habe sie so genannt, weil sie ja innerhalb der Funktion als Schlüssel eines Dictionarys verfügbar gemacht werden.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das stimmt. Für Funktionsaufrufe müssen Strings als Schlüssel verwendet werden. Python wandelt für func(foo=True) automatisch das foo in einen String um. Wobei es das bei numerischen Schlüsseln nicht tut. Es meckert dann mit einem SyntaxError, weil es 1='foo' für einen Ausdruck hält. IMHO ist das ein Bug oder zumindest sonderbares Verhalten. Gern höre ich mir eine sinnvolle Begründung dafür an...
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: Parameter einer Funktion sind ganz normale Variablen, also müssen die Namen auch den Regeln für Variablen folgen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay. Leuchtet mir jetzt ein, dass hier die selben Regeln gelten wie für alle anderen Bezeichner. Denn die sind im Kontext des für den Namensraum verwendeten dicts ja letztlich auch Strings, die als Schlüssel zum Einsatz kommen.
Antworten