Umfangsanalyse von Abschlüssen und Lambdas in Python

WBOY
Freigeben: 2022-07-22 19:53:30
nach vorne
2508 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über den Umfang von Lambda sowie verwandte Inhalte zu Schließungen in Python. Ich hoffe, dass er für alle nützlich ist. helfen.

Umfangsanalyse von Abschlüssen und Lambdas in Python 【Verwandte Empfehlung:

Python3 Video Tutorial

Python -Verschluss und Lambda Scope

lambda -Schreibmethode

def fun():
    for i in range(3):
        yield lambda x : x * i

f0, f1, f2 = fun()
print(f0(1), f1(2), f2(3))
Nach dem Login kopieren

closed Writing -Methode

def fun():
    result = []
    for i in range(3):
        def demo(x):
            return x * i
        result.append(demo)
    return result
f0, f1, f2 = fun()
print(f0(1), f1(2), f2(3))
Nach dem Login kopieren

Die Ergebnisse der beiden oben genannten Schreibmethoden sind 2, 4, 6 Nach der ursprünglichen Idee sollte das Ergebnis 0, 2, 6 sein.

Ursache des Problems:

Die Wurzel des Problems liegt in den Variablensuchregeln von Python, LEGB (lokal, einschließend, global, bulitin). Im obigen Beispiel liegt i im Abschlussbereich (einschließend) und Pythons Abschluss Das Paket ist spät gebunden und der Wert der im Abschluss verwendeten Variablen i wird gefunden, wenn die interne Funktion aufgerufen wird.

Lösung: Ändern Sie den Abschlussbereich in einen lokalen Bereich

Das Ausgabeergebnis ist immer noch 2, 4, 6

Ursache des Problems

Der von der Methode fun() zurückgegebene Generator (oder Iterator) wird nicht tatsächlich ausgeführt, sondern bei jedem Aufruf ausgeführt.

Wenn nach dem Durchlaufen gedruckt wird, verwendet die Variable i den Wert des letzten Aufrufs. Wenn Lambda als Abschlussmethode betrachtet wird, befindet sich der Wert der Variablen i immer noch im Abschlussbereich (nicht lokal).

8

8

8

8

8

Der Rückgabewert der Erstellungsfunktion ist eine Liste – eine Funktion, die den Eingabeparameter x mit einem Vielfachen i multipliziert. Die erwarteten Ergebnisse waren 0, 2, 4, 6, 8. Das Ergebnis war jedoch 5 und 8, was unerwartet war.

Da bei dieser Falle häufig Lambda verwendet wird, könnte man denken, dass es sich um ein Problem mit Lambda handelt, aber Lambda hat zum Ausdruck gebracht, dass es nicht bereit ist, die Schuld auf sich zu nehmen. Der Kern des Problems liegt in den Attributsuchregeln in Python, LEGB (lokal, einschließend, global, bulitin). Im obigen Beispiel liegt i im Abschlussbereich (einschließend) und Pythons Abschluss ist eine späte Bindung Der Wert der im Abschluss verwendeten Variablen wird beim Aufruf der internen Funktion abgefragt. Die Lösung ist ebenfalls sehr einfach: Ändern Sie den Abschlussbereich in einen lokalen Bereich.

def fun():
    for i in range(3):
        yield lambda x, i = i: x * i

f0, f1, f2 = fun()
print(f0(1), f1(2), f2(3))
Nach dem Login kopieren

anoother -Art zu schreiben:

def fun():
    result = []
    for i in range(3):
        def demo(x, i=i):
            return x * i
        result.append(demo)
    return result
f0, f1, f2 = fun()
print(f0(1), f1(2), f2(3))
Nach dem Login kopieren

Die obigen zwei Schreibweisen sind das gleiche.

Code sehr einfach: (Haftungsausschluss: Python3-Problem)

def fun():
    for i in range(3):
        yield lambda x : x * i
f0, f1, f2 = fun()
print(f0(1), f1(2), f2(3))
Nach dem Login kopieren

Ergebnis:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 , 17, 18 , 19]

Ähnlich nach normaler Logik sollte das Ergebnis sein:

[2, 3, 5, 7, 11, 13, 17, 19]

Die Ursache des Problems :

in Python3 Die Funktion filter () gibt einen Iterator zurück, daher wird sie nicht tatsächlich ausgeführt, sondern bei jedem Aufruf ausgeführt (die von filter () in Python2 zurückgegebene Werteliste weist dieses Phänomen nicht auf )

Ausgeführt nach dem Durchlaufen. Führen Sie nun die Funktion in der Schleife aus. Die i-Variable verwendet den Wert, als sie zuletzt aufgerufen wurde der Wert des eingebetteten Bereichs und dieser Kastanie Der Wert des globalen i wird verwendet

Geänderter Code:

def create():
    return [lambda x:i*x for i in range(5)]
 
for i in create():
    print(i(2))
Nach dem Login kopieren
Ergebnis:

[2, 3, 5, 7, 11, 13, 17, 19]



[Verwandte Empfehlungen:
Python3-Video-Tutorial

Das obige ist der detaillierte Inhalt vonUmfangsanalyse von Abschlüssen und Lambdas in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!