Seite 1 von 1
Funktionsparameter Liste
Verfasst: Dienstag 8. Dezember 2020, 17:16
von CODER123
Guten Abend
Ich habe ein seltsames Problem:
Wenn ich eine Funktion definiere, die eine Liste von Listen als Parameter hat, und danach for i in Inputlist versuche, kommt folgende Fehlermeldung:
TypeError: 'NoneType' object is not iterable
Was kann man da machen?
Re: Funktionsparameter Liste
Verfasst: Dienstag 8. Dezember 2020, 17:17
von Bolitho
zunächst mal deinen Code und die Fehlermeldung posten, wir haben hier keine Glaskugeln.

Re: Funktionsparameter Liste
Verfasst: Dienstag 8. Dezember 2020, 20:44
von Sirius3
Inputlist hat den Wert None. Warum das so ist, kann man ohne Code nichts sagen.
Re: Funktionsparameter Liste
Verfasst: Mittwoch 9. Dezember 2020, 17:44
von CODER123
Code: Alles auswählen
Sorry, hab ich vergessen:
def umformen(i):
rück = []
for j in i:
for k in range(len(Teiler(j[1]))/2):
if Teiler[k]+Teiler[-(k+1)] == j[0]:
if j[2] == "a":
rück.append(Teiler[k])
rück.append(Teiler[-(k+1)])
else:
rück.append(Teiler[-(k+1)])
rück.append(Teiler[k])
break
Re: Funktionsparameter Liste
Verfasst: Mittwoch 9. Dezember 2020, 18:08
von sparrow
Immer auch den kompletten Traceback zeigen, damit wir sehen welcher Fehler wo auftritt. Denn so kann man das schlicht nicht sagen.
Die Benennung der Variablen ist murks. Selbst für Laufvariablen. Gib denen anständige Namen - das kostet nicht extra.
"Teiler" kommt aus dem nichts und ist falsch benannt. Variablen werden in Python klein_mit_unterstrich benannt. Alles was eine Funktion braucht, bekommt sie als Parameter und gibt das Ergebnis per return zurück. Beides tust du hier nicht. Das ist falsch.
Re: Funktionsparameter Liste
Verfasst: Mittwoch 9. Dezember 2020, 18:11
von /me
Wo ist jetzt das von dir erwähnte `for i in inputlist`? Etwas mehr Präzision wäre schon schön, die brauchst du beim Programmieren ohnehin. Solltest du `for j in i` meinen, dann liegt das daran, dass `i` None ist. Und `i` ist None weil du der Funktion den Parameter so übergibst. Auf welche Weise das geschieht können wir allerdings nicht sagen, den Code zeigst du ja nicht.
Re: Funktionsparameter Liste
Verfasst: Mittwoch 9. Dezember 2020, 18:16
von Sirius3
`i` ist ein schlechter Name für irgendein Iterable. Teiler kommt aus dem nichts und ist falsch geschrieben. Entweder ist das eine Konstante TEILER oder eine Variable teiler, dann muß das als Argument übergeben werden.
Was soll denn die Funktion machen? Was ist i? Mit was ruft man die Funktion auf?
Re: Funktionsparameter Liste
Verfasst: Donnerstag 10. Dezember 2020, 20:17
von CODER123
Teiler ist eine Funktion, die die Teiler einer Zahl zurückgibt, also
Code: Alles auswählen
def Teiler(x):
Ret = []
for xy in range(int(x)):
if int(x) % (xy+1) == 0:
Ret.append(xy +1)
return(Ret)
Ich habe zudem eine Zeile zuwenig reinkopiert, nähmlich Return(Rück).
Die Funktion rufe ich als TKinter-Buttonfunktion auf, mit B1 = Button(master, text="Los!", command=umformen(E1.get())), wobei E1 ein TKinter Entry Widget ist. Die Komplette Fehlermeldung, die übrigens schon beim Starten des Programms und nicht erst nach dem Kilck auf den Button, ist:
line 164, in <module>
bE = Button(master, text="Los!", command=(RES.config(text=entschlüsseln(Datennorierung(eE.get())), font=("courier new", 24))))
line 91, in umformen
for j in i:
TypeError: 'NoneType' object is not iterable
Die (sicherlich irrelevanten) genauen Datenpfade habe ich wegen des Datenschutzes entfernt.
Zudem bennene ich meine Variabeln immer so komisch, aber vieleicht sollte ich mir dies mal umgewöhnen.
Re: Funktionsparameter Liste
Verfasst: Donnerstag 10. Dezember 2020, 20:29
von sparrow
Nach Konvention schreibt man Variablennamen klein_mit_unterstrich (und Instanzen von Klassen sind auch Variablen). CapitalCase sind Klassen. Das ist wichtig, weil so jeder Python-Programmierer gedacht hat, dass Teiler eine Klasse ist.
Hinter das return kommen keine Klammern. Return ist keine Funktion, die man aufrufen muss.
Die Benennung deiner Variablen ist durch die Reihe für den Po. x, xy, k, j, i? Benenne sie so, dass der Leser (und der Leser bist auch du!) es auch versteht.
bE, RES, eE? Ist das dein Ernst?
Grundsätzlich funktioniert so schon einmal die Zusweisung vom "command" an einen Button nicht. Man übergibt eine Funktion. Das tust du aber nicht - du rufst die Funktionen auf - das passiert, wenn der Code das erste Mal an der Stelle vorbei kommt - und dann wird der Rückgabewert dauerhaft an command gebunden..
Klammern hinter einem Funktionsnamen sind ein Aufruf.
Re: Funktionsparameter Liste
Verfasst: Donnerstag 10. Dezember 2020, 20:52
von Sirius3
Funktionen wie Variablennamen komplett klein. Die Funktion sollte am besten gleich mit einem int aufgerufen werden. Falls doch nicht, dann wandelt man x einmal um, und nicht bei jedem Schleifendurchlauf. Wenn immer xy+1 benutzt wird, warum läuft dann die Schleife nicht gleich von 1 los? Ret sollte wohl result heißen.
Code: Alles auswählen
def ermittle_teiler(number):
number = int(number)
result = []
for i in range(1, number + 1):
if number % i == 0:
result.append(i)
return result
Der Code in der Fehlermeldung ist nicht der Code, den Du behauptest zu haben, sondern
Code: Alles auswählen
bE = Button(master, text="Los!", command=(RES.config(text=entschlüsseln(Datennorierung(eE.get())), font=("courier new", 24))))
Und dort steht nirgends ein Aufruf von `umformen`, also kann der Fehler auch nicht direkt davon kommen. Wenn man Dir jedes Stückchen Code aus der Nase ziehen muß, brauchen wir noch ewig, um weiter zu kommen.