Seite 1 von 1

Ausführzeitpunkt, Gültigkeitsdauer einer Variablen

Verfasst: Sonntag 10. November 2019, 22:10
von Andrea
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()

Re: Ausführzeitpunkt, Gültigkeitsdauer einer Variablen

Verfasst: Sonntag 10. November 2019, 22:50
von sparrow
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".

Re: Ausführzeitpunkt, Gültigkeitsdauer einer Variablen

Verfasst: Sonntag 10. November 2019, 23:11
von Sirius3
`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.

Re: Ausführzeitpunkt, Gültigkeitsdauer einer Variablen

Verfasst: Sonntag 10. November 2019, 23:36
von __blackjack__
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.