Seite 1 von 1

Ausgebefehler None

Verfasst: Dienstag 20. April 2021, 12:09
von Studierender
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

Re: Ausgebefehler None

Verfasst: Dienstag 20. April 2021, 13:08
von noisefloor
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

Re: Ausgebefehler None

Verfasst: Dienstag 20. April 2021, 14:46
von Sirius3
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)

Re: Ausgebefehler None

Verfasst: Mittwoch 21. April 2021, 08:19
von Studierender
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

Re: Ausgebefehler None

Verfasst: Mittwoch 21. April 2021, 08:32
von noisefloor
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

Re: Ausgebefehler None

Verfasst: Mittwoch 21. April 2021, 08:59
von kbr
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.

Re: Ausgebefehler None

Verfasst: Mittwoch 21. April 2021, 09:16
von Sirius3
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.