Python Sinn von "return" ?

I

iKernelOS

Gast
Ich habe schon einige Anleitungen angeschaut, aber dennoch kapiere ich nicht was return eigentlich macht!?
Ich weiß nur dass return einen value returnt (verständlich oder soll ich es ins deutsche übersetzen?) aber welcher value wird returnt??

z.B

def sinnlose_function()
var = "sinnvoll?"
return irgendwas fehlt oder? wenn ja dann müsste es doch = 0 sein.

aber was genau macht return? kann ich es weglassen?

Ich bin nicht mehr in Python interessiert, aber ich will diese eine frage lösen.
 
Zuletzt bearbeitet von einem Moderator: (typo)
Naja mit return kannst du einen Wert zurückgeben... Und zwar wird immer der Wert zurückgegeben, den du return gibst.

return x //gibt den Inhalt der Variable x zurück
return //bin mir nicht sicher ob das bei P auch geht - gibt nichts zurück, beendet die Funktion
return 3 //gibt 3 zurück

Lg, Franz
 
Hast du zB den Ausdruck a = b + c, kannst du a returnen. Wenn du dann die Funktion aufrufst, bekommt du den Wert von a, dh das Ergebnis der Addition von b und c.
 
Ah!! ok habe es nun verstanden! nunja, wenn ich schon hier bin,

ist die import funktion von python in c++ benutzbar?
also in c++ :
import from math, pi......
 
Wenn nur return da steht, wird "None" zurückgeben. Python Documentation
Man kann es auch weglassen, aber „Explicit is better than implicit“.

Z.B. kann return den Wert zurückgeben, welcher innerhalb der Funktion generiert wurde...
Code:
def summe(summand1, summand2):
    return summand1 + summand2
print("Die Summe von 1 und 2 ist "+summe(1, 2))
oder man könnte es zur Fehlerbehandlung verwenden...
Code:
def do_something():
    do_something
    if fehler_in_der_ausführung == True:
        return 1
    elif anderer_fehler_in_der_ausführung == True:
        return 2
    else kein_fehler_in_der_ausführung == True
        return 0
usw...

Zu den Funktionen aus Python in C++: Nein das funktioniert nicht.
 
Zuletzt bearbeitet:
Es war doch nicht die Frage, ob man python-Code aus C/C++ callen kann, sondern ob
das import-Statement fuer python-Module in C++ funktioniert, was natuerlich nicht der Fall ist.
 
maxwell-cs schrieb:
Es war doch nicht die Frage, ob man python-Code aus C/C++ callen kann, sondern ob
das import-Statement fuer python-Module in C++ funktioniert, was natuerlich nicht der Fall ist.
Ok. Auf solche Tirvialfragen war ich gar nicht gefasst, obwohl ich es hätte nach dieser ominösen return-Frage (die durch durchackern sämtlicher Python-Dokumentation nicht beantwortet werden konnte) hätte denken können. :-)
 
repicajo schrieb:
Wenn nur return da steht, wird "None" zurückgeben. Python Documentation
Man kann es auch weglassen, aber „Explicit is better than implicit“.

Das gilt aber nur für Fälle, wo durch implizite Anweisungen Mehrdeutigkeit entsteht (bzw. entstehen könnte). Ein return wegzulassen, erzeugt keine Mehrdeutigkeit und der Programmierer muss so oder so wissen, dass dann "None" zurückgegeben wird. Weiß er das nicht, wird der Programmierer (wie hier passiert) weder mit

Code:
def foo():
    foo2()
    return

noch mit

Code:
def foo():
    foo2()

etwas anfangen können (bzgl. des Verhaltens/Rückgabewertes von "foo").

Außerdem gibt es ja auch noch: "(...) practicality beats purity."


repicajo schrieb:
Z.B. kann return den Wert zurückgeben, welcher innerhalb der Funktion generiert wurde...
Code:
def summe(summand1, summand2):
    return summand1 + summand2
print("Die Summe von 1 und 2 ist "+summe(1, 2))

...das tut dein Beispiel aber nicht, denn das wirft eine Exception. Du kannst einen String nicht einfach mit einem Integer konkatenieren.





repicajo schrieb:
oder man könnte es zur Fehlerbehandlung verwenden...
Code:
def do_something():
    do_something
    if fehler_in_der_ausführung == True:
        return 1
    elif anderer_fehler_in_der_ausführung == True:
        return 2
    else kein_fehler_in_der_ausführung == True
        return 0
usw...

Zum Einen ist das keine Fehlerbehandlung. Derartiges tut man mit "try/except/finally" und mit dem Werfen von Exceptions.
Zum Anderen: du vergleichst Booleans explizit mit "== True/False"? Ernsthaft?

Ich hoffe mal stark, dass du kein Softwareentwickler bist ^^
 
ascer schrieb:
Zum Einen ist das keine Fehlerbehandlung.

Selbstverständlich ist das eine. Es muss eben nur dokumentiert sein, was der Rückgabewert bedeutet. Exceptions müssen ebenso dokumentiert sein.
 
ascer schrieb:
Zum Anderen: du vergleichst Booleans explizit mit "== True/False"? Ernsthaft?

Selbst jede höhere Sprache mit JIT (C#) optimiert das weg. Des Weiteren sind solche expliziten Vergleiche durchaus sinnvoll, einmal um bei Pythons Ducktyping für den Leser den Typ klarzumachen (Ist es eine Ganzzahl? Oder ein Objekt? Ist es Steffen?), darüber hinaus lohnt es sich auch bei ganzzahligen Werten direkt mit dem Wert zu vergleichen, anstatt es roh in eine Bedingung zu schmeißen (wenn die Sprache das erlaubt), weil es durchaus unterschiedliche Konventionen gibt, welcher Wert für wahr oder falsch steht.

ascer schrieb:
Ich hoffe mal stark, dass du kein Softwareentwickler bist ^^

Ich finde solche Kommentare immer unfassbar unqualifiziert. Das sagt auch mehr über den Autor aus, als das was kommentiert werden sollte.

nullPtr schrieb:
Selbstverständlich ist das eine. Es muss eben nur dokumentiert sein, was der Rückgabewert bedeutet. Exceptions müssen ebenso dokumentiert sein.

Wenn Exceptions unterstützt werden, sind diese vorzuziehen, wenn eine mehrere Fehlertypen zur Auswahl stehen. Wieso? Lesbarkeit und Aufwand. Ein switch mit ein paar Nummern bringt dem Betrachter nicht viel (Dies ist dann natürlich Code außerhalb deiner Methode), und wenn dann jemand die Lesbarkeit mit ein paar Definitionen erhöhen will, ist der Aufwand größer als bei Exception-Handling, und dass obwohl man an die Lesbarkeit und den Komfort derselben nicht herankommt. Darüber hinaus erinnert einen normalerweise der Compiler (oder schon die IDE) daran, welche Exception-Typen nicht behandelt werden in deinem Code.
 
nullPtr schrieb:
Selbstverständlich ist das eine. Es muss eben nur dokumentiert sein, was der Rückgabewert bedeutet. Exceptions müssen ebenso dokumentiert sein.

Man kann sich sicherlich über die Terminologie streiten, wenn man argumentiert das sein Code von der Semantik her ähnliche Funktionalität bieten soll, wie wirkliche Fehlerbehandlung. Jener Umstand ändert aber nichts an der Tatsache, dass bei Python in den PEPs ausschließlich die vorgegebenen Exceptions plus custom Exceptions, die von der Exception-Basisklasse (oder einer Subklasse) erben, für Fehlerbehandlung in Python genutzt werden sollen.
Auch bei beispielsweise Wikipedia findet man nur explizite Hinweise, dass diese zu verwenden sind und von anderen Sachen abzusehen ist.

Unabhängig davon würde ich bei seinem Beispiel auch bei der Terminologie den Terminus Fehlerbehandlung kritisieren, da eine Fehlerbehandlung aus einer qualifizierten Angabe bzw. Standardisierung von Fehlertypen besteht. Jegliche Angabe, Beschreibung, Standardisierung oder Hierarchie fehlt in seinem Beispiel aber vollständig.

Natürlich hast du insofern Recht, als das dies als einfaches Beispiel für eine Custom-"Fehlerbehandlung" dienen kann. Seine Intention ist mir also durchaus klar. Nur ist es eben keine richtige, keine die man als "pythonic" bezeichnen würde und vor allem ist es "quick'n'dirty". Genau solcher schlechter Code - da kurz, knapp & simpel - ist es aber, der dann von Anfängern häufig für bare Münze genommen wird und kopiert/verwendet wird.
Schon hat man weitere Leute geschaffen, die schlechten Code verbreiten. Was als harmloses, einfaches, kurzes Beispiel begann, findet damit seinen Weg in herkömmliche Softwareentwicklung.



Blubmann schrieb:
Selbst jede höhere Sprache mit JIT (C#) optimiert das weg.

Bei Python - da interpretiert - kann dies nicht optimiert werden. Der Interpreter muss zur Laufzeit ja ermitteln, womit der Rückgabewert seiner Funktion verglichen werden soll. Unabhängig davon halte ich "der Compiler optimiert das weg" für keine Rechtfertigung schlechten Code zu schreiben. In Java oder C++ wäre das ebenso "bad style". Im Übrigen könnte das auch von einem Compiler nur dann optimiert werden, wenn zur Compilezeit feststünde, dass die condition immer zu einem boolean evaluiert - z.B. bei template metaprogramming in C++ könnte man da sicherlich cases erzeugen, wo der Compiler zur Compilezeit dies nicht mehr kann...aber selbst in einem gekünsteltem Trivialfall "if some-int == True" wäre es schon nicht mehr optimierbar und <stdbool.h> in C z.B. definiert True mit 1 (integer).

Viel wichtiger ist aber was dahintersteckt: Derartiges weißt i.d.R. auf mangelnde Programmierkenntnisse (besonders in puncto Theorie) hin.

Wer schon mal ein Buch über "bad habits" beim Programmieren gelesen hat, weiß das explizite Vergleiche mit Booleans dazu gehören und ein Indikator für schlechten Code sind (wenn sicherlich aber auch kein besonders wichtiger).



Blubmann schrieb:
Des Weiteren sind solche expliziten Vergleiche durchaus sinnvoll, einmal um bei Pythons Ducktyping für den Leser den Typ klarzumachen (Ist es eine Ganzzahl? Oder ein Objekt? Ist es Steffen?), darüber hinaus lohnt es sich auch bei ganzzahligen Werten direkt mit dem Wert zu vergleichen, anstatt es roh in eine Bedingung zu schmeißen (wenn die Sprache das erlaubt), weil es durchaus unterschiedliche Konventionen gibt, welcher Wert für wahr oder falsch steht.

Explizite Vergleiche sind nicht sinnvoll. In PEP8 wird dies klar und deutlich abgelehnt.

Code:
# Don't compare boolean values to True or False using == .

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:

Des Weiteren macht es auch im Zuge von Ducktyping keinen Sinn. Die Grundprämisse von Ducktyping ist ja gerade, einfach jeden Typ anzunehmen, der sich passend verhält. Jedes if-statement wird und muss zu einem boolean evaluiert werden. Insofern ist vollkommen unmissverständlich, dass bei "if something:" das something zu einem boolean evaluierbar sein muss.
Abgesehen davon wird bei Python - auch gerade wegen Ducktyping - nach "ask for forgiveness not permission" entwickelt.

Das Argument mit den unterschiedlichen Konventionen leuchtet mir nicht besonders ein - bei booleans steht 0 für False und 1 für True bei jeder populären Hochsprache. Höchstens wenn man per Shell ausgeführte Programme auswertet, bekommt man Errorcode 0 für erfolgeriche Termination und Errcorcode 1 für aufgetretene Fehler.
Da gilt aber imho auch wieder: der Programmierer muss sich in seiner Umgebung auskennen.



Blubmann schrieb:
Ich finde solche Kommentare immer unfassbar unqualifiziert. Das sagt auch mehr über den Autor aus, als das was kommentiert werden sollte.

Das kannst du gerne - aber bist du tatsächlich der Meinung, dass es Anfängern hilft ihnen möglichst simple Beispiele zu geben, ohne große Kommentare, die absolut zum Copy&Paste verleiten? Die zusätzlich dazu auch noch bad style sind und nicht im Geringsten den Konventionen von professioneller Softwareentwicklung erfüllen?

Ich zeige lieber einmal zu viel und einmal zu pedantisch die Fehler auf, als Anfänger mit Simplifizierungen und Halbwissen in die Welt zu entlassen.
Wenn ich auf Stackoverflow, Crossvalidated, Data Science oder einfach so in der Uni mit anderen Leuten über meinen Code, meine Lösungsansätze zu Problemen usw. rede, möchte ich auch kein einzeiliges "Hast du gut gemacht." hören, sondern konstruktive Kritik - wo sind Fehler? Was ist noch optimierbar? Nur so lernt man dazu und wird mit der Zeit besser, ansonsten kann man sich eine Diskussion auch gleich schenken und von Google copy&paste'n - hätte mehr oder minder denselben Effekt.
 
Zuletzt bearbeitet:
Zurück
Oben