Ausgebefehler 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
Studierender
User
Beiträge: 2
Registriert: Dienstag 20. April 2021, 11:56

Hallo Zusammen,

mir liegt folgende eigentlich leichte Übungsaufgabe vor. Mein Fehler liegt vermutlich in der inkorrekten Bildung einer Funktion.

Function Name: printlines
Function Input Name(s): s, n
Function Input Type(s): string, integer
Output Type(s): None!

Example
printlines("z",3)-> Ausgabe: z ->es soll der Buchstabe entsprechend des Wertes der Zahl in dieser Form ausgegeben (nicht rückgegeben) werden.
zz
zzz

Mein Code erfüllt auch diese Anforderung:

Code: Alles auswählen

counter = 0
    while counter < n: 
        counter = counter+1
        print (s*counter)
Jetzt baue ich den Code zu der Funktion aus:

Code: Alles auswählen

def printlines(s,n):
    counter = 0
    while counter < n: 
        counter = counter+1
        print (s*counter)
Jetzt bekomme ich in der Ausgabe jedoch folgendes:

z
zz
zzz
None

Dieses None darf eigentlich nicht sein. Jedoch ist laut Angabe der Datentyp für die Ausgabe None! gefordert. Bei meinem Beispiel handelt es sich doch um Ausgabetyp String ?

Kann mir bitte jemand bei dieser Angelegenheit helfen ?

Vielen Dank und Grüße,

Studierender
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie rufst du denn die Funktion auf?

Wenn eine Funktion keine `return` Statement am Ende hat (was ja auch keine Pflicht ist), dann wird implizit `None` zurückgegeben. D.h. wenn du den Funktionsaufruf von `printlines()` an eine Variable bindest und diese ausgibst bzw. `print(printlines())` aufrufst, bekommst du `None` .

Beispiel:

Code: Alles auswählen

>>> def foo():
...    print('Ich bin foo.')
...
>>> foo()
Ich bin foo.
>>> print(foo())
Ich bin foo.
None
>>>
Gruß, noisefloor
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze aussagekräftige Variablennamen. s für ein Zeichen ist sehr schlecht, n für eine Anzahl nicht ganz so schlecht.
Statt der while-Schleife würde man eine for-Schleife benutzen.

Code: Alles auswählen

def printlines(character, count):
    for i in range(1, count + 1):
        print(character * i)
Studierender
User
Beiträge: 2
Registriert: Dienstag 20. April 2021, 11:56

Vielen Dank für die Hilfe,

wie noisfloor sagte, hat sich das Problem erledigt, wenn ich nur ausschließlich printlines("z",3) ausgeführt habe. Da war kein None mehr am Ende. Das ist nur, wenn die funktion in einer Variable gespeichert wird und ausgegeben wird.

Die Eingabeparameter s und n waren Teil der Angabe und mussten so gewählt werden.

Noch eine leichte Verständnisfrage (Ich hatte bisher nur Java, da muss return zwingend am ende stehen): Was bringt es das return am Ende wegzulassen ? Das ist doch der reguläre Abschluss einer Funktion und im Falle ohne Rückgabewert steht dann return ohne einen Parameter ?

Vielen Dank für die schnelle und freundliche Hilfe,

Florian
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

bei Python ist ein `return` am Ende einer Funktion kein muss. Durch die Einrückung - die ja in Python ein Muss ist - weiß der Interpreter, wann die Funktion am Ende ist.
Wenn du nichts hinschreibst ist das ok bzw. das gleiche, als wenn du einfach nur `return` ohne Rückgabewert hinschreibst.

Gruß, noisefloor
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wenn eine Funktion mit einem 'return' ohne weiteren Rückgabewert endet, stellt sich zudem die Frage, ob dies ein Fehler ist und der Autor vergessen hat, diesen Rückgabewert anzugeben. Um dies herauszufinden, muss man ggf. eine Menge an Code sichten.
Funktionen die keinen Rückgabewert haben, werden in anderen Sprachen teils auch als Prozedur bezeichnet. Da Funktionen in Python immer einen Rückgabewert haben, gibt es diese Unterscheidung in Python nicht. Es ist somit sinnvoll explizit 'return None' anzugeben wenn 'None' konkret als Ergebnis verwendet werden soll.
Ein einfaches 'return' innerhalb einer Funktion ist daher im besten Fall irritierend.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

In Java verhält es sich wie in Python. Wenn man eine Funktion ohne Rückgabewert hat, dann braucht man auch kein `return`. In Java nennt sich das halt `void` und es wäre ein Überstzungsfehler, wenn man beim Aufruf das Ergebnis an eine Variable binden wöllte. In Python ist es halt nur ein logischer Fehler, weil es keinen Sinn ergibt, mit dem Rückgabewert None weiter zu arbeiten.
Antworten