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?
Funktionsparameter Liste
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
-Wer Rechtschreibfehler findet, darf sie behalten
-Es gibt nur 2 unnendliche Dinge: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir noch nicht ganz sicher.[Albert Einstein]
-Es gibt nur 2 unnendliche Dinge: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir noch nicht ganz sicher.[Albert Einstein]
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.
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.
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.
`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?
Was soll denn die Funktion machen? Was ist i? Mit was ruft man die Funktion auf?
Teiler ist eine Funktion, die die Teiler einer Zahl zurückgibt, also
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.
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)
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.
-Wer Rechtschreibfehler findet, darf sie behalten
-Es gibt nur 2 unnendliche Dinge: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir noch nicht ganz sicher.[Albert Einstein]
-Es gibt nur 2 unnendliche Dinge: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir noch nicht ganz sicher.[Albert Einstein]
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.
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.
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.
Der Code in der Fehlermeldung ist nicht der Code, den Du behauptest zu haben, sondern
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.
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
Code: Alles auswählen
bE = Button(master, text="Los!", command=(RES.config(text=entschlüsseln(Datennorierung(eE.get())), font=("courier new", 24))))