Funktionsparameter Liste

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
CODER123
User
Beiträge: 19
Registriert: Montag 30. Dezember 2019, 13:15

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?
-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]
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

zunächst mal deinen Code und die Fehlermeldung posten, wir haben hier keine Glaskugeln. :)
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

Inputlist hat den Wert None. Warum das so ist, kann man ohne Code nichts sagen.
CODER123
User
Beiträge: 19
Registriert: Montag 30. Dezember 2019, 13:15

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]
Benutzeravatar
sparrow
User
Beiträge: 4533
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

`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?
CODER123
User
Beiträge: 19
Registriert: Montag 30. Dezember 2019, 13:15

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.
-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]
Benutzeravatar
sparrow
User
Beiträge: 4533
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten