Seite 1 von 1
Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 19:38
von Freitag
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
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 19:40
von Freitag
Momentan tritt dieser Fehler auf: name 'kwarg' is not defined, ich weiß jedoch nicht richtig damit umzugehen
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 19:51
von Sirius3
@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.
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 20:15
von Freitag
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...
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 20:33
von noisefloor
Hallo,
Du rufst hier die Methode `count` des Objekts `kwarg` auf. Nur: `kwarg` gibt es nicht -> Fehlermeldung. Völlig logisch
Entweder meinst du `kwarg
s` 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
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 21:40
von nezzcarth
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?
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 22:00
von snafu
Schlüssel können Zahlen sein. Alles was hashbar ist, kann ein Schlüssel sein. Wichtig ist, dass der Hashwert sich nicht verändert.
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 22:39
von bwbg
Offtopic: Eine völlig valide Hash-Funktion könnte wie folgt aussehen:
Re: Flexible Funktionsparameter
Verfasst: Mittwoch 15. November 2017, 22:44
von nezzcarth
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.
Re: Flexible Funktionsparameter
Verfasst: Donnerstag 16. November 2017, 16:01
von snafu
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...
Re: Flexible Funktionsparameter
Verfasst: Donnerstag 16. November 2017, 16:50
von Sirius3
@snafu: Parameter einer Funktion sind ganz normale Variablen, also müssen die Namen auch den Regeln für Variablen folgen.
Re: Flexible Funktionsparameter
Verfasst: Donnerstag 16. November 2017, 18:20
von snafu
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.