Ausführzeitpunkt, Gültigkeitsdauer einer Variablen

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
Andrea
User
Beiträge: 1
Registriert: Sonntag 10. November 2019, 21:24

Hallo

Zuerst einmal: Verzeiht mir, wenn ich möglicherweise eine Frage im falschen Teil poste, aber es gibt glaub nichts passenderes und wem das Beispiel banal vorkommt - ich beschäftige mit erst seit einige Tagen mit Python. Andere Programmiersprachen kenne ich einige .... :-)

Bei einem Beispiel das ich bei python-kurs.eu gefunden habe, bin ich auf zwei seltsame Effekte gestossen.

Ist es so, dass der Code erst dann ausgeführt wird, wenn man das Resultat verwendet (numbers und der type werden ausgegeben bevor "addition" etwas ausgibt) Offensichtlich wird die Funktion erst bei 3 ausgeführt Ich hätte da etwas anderes erwartet ...

Bei 4 wird [] ausgegeben - warum das?

Code: Alles auswählen

1:  (1, 2, 3, 4)
2: <class 'map'>
MapDemo.addition( 1 )
MapDemo.addition( 2 )
MapDemo.addition( 3 )
MapDemo.addition( 4 )
3: [2, 4, 6, 8]
4: []

Code: Alles auswählen

class MapDemo:
    # Return double of n
    def addition(n):
        print("MapDemo.addition(", n, ")")
        return n + n

    def doIt():
        # We double all numbers using map()
        numbers = (1, 2, 3, 4)
        result = map(MapDemo.addition, numbers)
        print("1:", type(result))
        print("2:", list(result))
        print("3:", list(result))

if __name__ == "__main__":
    MapDemo.doIt()
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Die Ausgabe passt nicht zum Programm. Es wird gar nichts mit 4: ausgegeben, wie man ja am Programmcode auch deutlich sieht.
Dein gezeigter Code erzeugt folgende Ausgabe:

Code: Alles auswählen

1: <class 'map'>
MapDemo.addition( 1 )
MapDemo.addition( 2 )
MapDemo.addition( 3 )
MapDemo.addition( 4 )
2: [2, 4, 6, 8]
3: []
Und wennd er Code in irgend einem Kurs so gezeigt wird, dann wirf den Kurs bitte weg. Denn ein Kurs der Klassen so "benutzt" , der ist schlicht schlecht.

Wenn deine eigentliche Frage ist, warum das Ergebnis beim 2. Zugriff anders bzw. leer ist. das steht in der Dokumentation. Bei Map handelt es sich um eine iterierbare Funktion, deren Rückgabewert per "yield" statt "return" geliefert wird. Da du das ganze einmal in eine Liste packst, werden dadurch alle Werte abgerufen. Beim nächsten Aufruf ist nichts mehr da, was zurückgegeben werden kann.
Das hat nichts mit der Gültigkeitsdauer von Variablen zu tun. Die Stichworte sind "Generator" und "yield".
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`python-kurs.eu` ist zum Großteil Schrott, vor allem der Teil zu Klassen.
Die Klasse ist keine, und gehört sofort entfernt. So sieht das besser aus:

Code: Alles auswählen

def addition(n):
    print("MapDemo.addition(", n, ")")
    return n + n

def do_it():
    # We double all numbers using map()
    numbers = [1, 2, 3, 4]
    result = map(addition, numbers)
    print("1:", type(result))
    print("2:", list(result))
    print("3:", list(result))

if __name__ == "__main__":
   do_it()
`map` liefert einen sogenannten Generator. Der generiert einmal Werte, wenn man über ihn iteriert, z.B. mit dem `list`-Aufruf. Beim zweiten `list`-Aufruf sind die Werte schon abgerufen, und es kommt nur noch eine leere Liste als Ergebnis.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei der Funktionsname `addition()` irgendwie auch irreführend ist, weil er das Argument verdoppelt – ob das nun per Addition mit sich selbst oder Multiplikation mit 2 gemacht wird, sollte nicht unbedingt im Funktionsnamen stehen. IMHO.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten