Funktion returnt None

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
Frostie
User
Beiträge: 15
Registriert: Freitag 14. April 2017, 18:16

Hallo liebe Mitglieder des Python-Forums!

Ich habe hier folgende Funktion, aber sie gibt mir ständig None zurück. Eine Zeile über dem return habe ich die variable sogar geprinted und sie wird auch so wie ich es haben will angezeigt, doch diese Variable wird durch return einfach nicht zurückgegeben und ständig zeigt Python mir None.
Ich habe mit zwei Freunden darüber gerätselt und wir sind immer noch nicht auf eine Lösung gekommen. Tricks auf Google habe ich schon ausprobiert.
Es spielt auch keine Rolle wie tief return in dieser Zeile eingeschoben ist, ich kriege immer None.
Mir ist klar, dass das bestimmt am for-loop liegt, aber ohne for-loop funktioniert mein code nicht so wie ich es haben will.

Hier ist der Code. Den Inhalt will ich eigentlich nicht in Betracht ziehen, er muss nicht verstanden werden. Mir geht es nur um return.

Code: Alles auswählen

def funktion(command):
        obj = str(i[len(command)+1:])
        gf = open("text.txt", "r+")
        if obj in a:
            for lines in gf.readlines():         #Manche Variablen sind außerhalb dieser Funktion
                if a2[a.index(obj)] in lines:
                    variable = 100     #Habe hier mal den komplizierten Code für 100 weggelassen, aber diese Variable...
                    print(variable)    #...wird hier geprinted: 100
            return variable   #Ergebnis: None
Ich wäre für Hilfe sehr dankbar! :wink: Wir wissen einfach nicht wieso.

Grüße, Frostie
Zuletzt geändert von Anonymous am Donnerstag 20. April 2017, 08:33, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grendel
User
Beiträge: 50
Registriert: Samstag 19. Dezember 2015, 16:06

Das return Statement ist schon mal zu weit eingerückt. Das sollte so aussehen:

Code: Alles auswählen

def my_func(a, b):
	...
	return c
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Frostie: Beim Programmieren gibt es keine Google-Tricks. Es gibt nur bewährte Muster, wie man generell solche Probleme angeht und viele Seiten, die man über Google erreichen kann, die sagen, wie man sich selbst ins Bein schießt.

Wenn Du hier im Forum fragen zu einer Funktion stellst, solltest Du die Funktion, die Du zeigst, auch möglichst ähnlich halten, wie die, mit der Du Probleme hast. Die Funktion hat nämlich drei Ergebnisse: 1. None, falls obj nicht in a enthalten ist, die Ausnahme UnboundLokalError, falls die innere if-Bedingung nie erfüllt wird und 100, sonst. Nur im letzten Fall wird auch 100 ausgegeben. Der Fall, dass etwas ausgegeben wird und None zurückgeliefert wird, existiert nicht.

Generell zu Funktionen: der Name einer Funktion sollte sagen, was die Funktion macht. Deiner Funktion kann man weder am Namen noch am Inhalt ansehen, was sie denn machen soll. Dann sollten alle Variablen, die gebraucht werden, die Funktion über Argumente betreten, also i, a, a2, etc. wobei alle diese Namen zusätzlich schlecht gewählt sind, weil niemand weiß, was denn i oder a bedeuten soll.
i ist entweder schon ein String, dann ist der Aufruf von str überflüssig, oder i ist etwas anderes, dann ist der Aufruf von str ein Fehler, weil man nicht mit der Stringrepräsentation von irgendeinem Objekt arbeiten sollte, sondern mit dem Objekt direkt.
Eine Datei zum Lesen mit Modus 'r+' zu öffnen ist falsch. Die Datei zu öffnen, auch wenn man sie nicht braucht auch und die Datei nicht wieder zu schließen, ebenso. gf ist ein nichtsagender Name.
readlines ist überflüssig, weil man auch über das Dateiobjekt direkt iterieren könnte und das die ganze Datei in den Speicher lädt, was nur den Speicher zumüllt. Die Benutzung von a2 und a.index lassen vermuten, dass es sich eigentlich um **eine** Datenstruktur, eventuell ein Wörterbuch handeln sollte. Eine Funktion sollte in all ihren Pfaden zu einem return führen, das vermeidet dann auch so Verwirrungen, dass manchmal implizit None zurückgegeben wird, der Kommentar bei return ist daher auch falsch.

Dieser lange Text soll Dich jetzt nicht entmutigen, es ist ganz normal, dass man als Anfänger noch sehr viel nicht weiß. Aber Code wie Du in schreibst, wird sehr schnell unübersichtlich, mal macht Fehler (jeder macht Fehler) und kann ihn nicht finden, weil man das, was man da geschrieben hat, nicht mehr versteht (geht mir genauso). Daher ist eine gute Planung nötig. Beschreiben, was die Funktion genau machen soll, dann einen guten Namen finden. Alles was die Funktion braucht auch genau beschreiben und auch dafür gute Namen finden. Das dann als Argumente an die Funktion übergeben. Dann erst anfangen, den Code für die Funktion zu schreiben. Wenn Du klettern gehst, überlegst Du Dir ja auch nicht erst in 5m Höhe, wie Du jetzt den Gurt anlegen kannst. Das sind einfach Grundlagen, die man kennen muß, bevor man loslegen kann.
Zuletzt geändert von Sirius3 am Donnerstag 20. April 2017, 08:07, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich vermute sowieso, dass der tatsächlich verwendete Code anders aussieht. Hier kann man also nur mutmaßen, dass der Programmfluss einen anderen Lauf nimmt als erwartet. Am besten baut man in diesem Fall den Code soweit zurück bis er läuft und nähert sich dann wieder schrittweise der Komplexität, die man für die gewünschte Funktionalität benötigt. Häufig hilft auch ein Aufteilen in zusätzliche Funktionen, sofern man den Überblick verloren hat.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Ausreichend Material, um die Funktion testen zu können, wäre auch hilfreich. Wie der Vorredner: Zurückbauen und vortasten...
Antworten