Python - Anfängerfragen

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
pythNeuling
User
Beiträge: 12
Registriert: Samstag 8. Oktober 2016, 13:46

Hallo,
dieser Thread dient dazu Fragen zu stellen, bei denen es sich nicht lohnt, einen neuen Thread zu starten. Deswegen der allgemeine Titel.

In der Schule haben wir folgenden Code programmiert.

Code: Alles auswählen

def whileexample():
    n=15;i=0;

    while i<=n:
        if n>20:
            print n, "ist zu groß"
            break
        print "%d : %7d" % (i,2**i)
        i=i+1
    else:
        print n+1, "Zweierpotenzen berechnet."
    return

whileexample()
Das else müsste doch in einer Spalte mit dem if stehen? Sonst würde es keinen Sinn ergeben. Ein else ohne ein if gibt es doch nicht.
Und was macht dieses return?
Zuletzt geändert von Anonymous am Freitag 14. Oktober 2016, 12:45, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Im while-else Konstrukt wird der else-Block nur dann ausgeführt, wenn dir Schleifenbedingung Falsch geworden ist. Wird die Schleife mit break verlassen, ist das nicht der Fall.

Alles in allem, löste ich sowas mit einer for-Schleife und (x)range.

Wann benutzt man sowas? Das ist nur bisher eher selten bis gar nicht untergekommen?

Das return am Ende der Funktion macht genau das, was die Funktion auch ohne dieses return zurück gäbe: None. Man kann daher drauf verzichten. Es dient hier wohl nur der Lesbarkeit.

PS Für Zeichenkettenformatierungen benützt man die .format-Methode. Formatieren mit % gilt als veraltet.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@pythNeuling: Strichpunkt sollte nie verwendet werden. Es ist selten sinnvoll mehrere Anweisungen in einer Zeile stehen zu haben und dann ist der Strichpunkt auch nur ein Anweisungstrenner und kein Anweisungsabschließer, der Strichpunkt am Zeilenende gehört also auf jeden Fall weg.

n wird nach der Initialisierung nie verändert, so dass die if-Anweisung auch nie erfüllt ist. Es ist auch ungewöhlich, damit unerwartet, dass neben einer while-Bedingung noch andere Bedingungen die while-Schleife per break verlassen können, wenn es sich nicht um eine endlos-Schleife handelt.

Jetzt, wo wir kein break mehr haben, wird das was im else-Block ausgegeben wird, immer ausgegeben, das else kann also weg.

Also weniger verwirrend (weil if etwas sinnvolles macht), aber immer noch mit der gleichen Funktionalität:

Code: Alles auswählen

MAX_POWER = 20

def print_powers_of_2(n):
    if n > MAX_POWER:
        print n, "ist zu groß"
        return
    i = 0
    while i <= n:
        print "%d : %7d" % (i, 2**i)
        i = i + 1
    print n + 1, "Zweierpotenzen berechnet."

print_powers_of_2(15)
Jetzt ist aber das Beispiel für eine while-Schleife schlecht gewählt, weil jeder würde dafür eine for-Schleife nehmen:

Code: Alles auswählen

MAX_POWER = 20

def print_powers_of_2(n):
    if n > MAX_POWER:
        print n, "ist zu groß"
        return
    for i in xrange(n + 1):
        print "%d : %7d" % (i, 2**i)
    print n + 1, "Zweierpotenzen berechnet."

print_powers_of_2(15)
Weil Programmierer keine Überraschungen wollen, und es komplizierte break-Konstruktionen braucht, damit der else-Block etwas sinnvolles tut, ist ein else bei while-Schleifen eigentlich nie gut und existiert nur aus Konsistenzgründen.

while-Schleifen machen daher nur Sinn, wenn es nicht darum geht, trivial eine Variable hochzuzählen:

Code: Alles auswählen

def find_smallest_power_of_2(n):
    i = 1
    while i < n:
        i *= 2
    return i

print find_biggest_power_of_2(3921)
pythNeuling
User
Beiträge: 12
Registriert: Samstag 8. Oktober 2016, 13:46

Hallo,
ich möchte eine Liste zurückgeben. Wenn dieser Code ausgeführt wird, dann erscheint aber nichts in der Konsole.

Code: Alles auswählen

def listexample(text):
    list=[]
    for i in text:
            list.append(i)
    return list

listexample("This is a text")
Zuletzt geändert von Anonymous am Donnerstag 24. November 2016, 22:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@pythNeuling: Warum sollte da auch was erscheinen? Wenn etwas ausgegeben werden soll, dann musst Du das schon explizit *tun*. Zum Beispiel mit ``print``.

Die Funktion macht übrigens nicht so viel Sinn. Die `list()`-Funktion macht genau das selbe, die muss man nicht noch mal selber schreiben. Und da es die `list()`-Funktion gibt, ist es auch nicht so günstig den Namen an etwas anderes zu binden.
Antworten