Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Verwendung von yield in Python (mit Code)

Einführung in die Verwendung von yield in Python (mit Code)

不言
不言nach vorne
2019-02-22 14:49:111870Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Verwendung von Yield in WeChat-Applet-Python. Er hat einen gewissen Referenzwert. Ich hoffe, er wird Ihnen hilfreich sein.

Wenn Sie kein vorläufiges Verständnis von Rendite haben, denken Sie zunächst an „Rendite“. Dies ist in erster Linie eine Rendite ? Ein bestimmter Wert wird im Programm zurückgegeben. Nach der Rückkehr wird das Programm nicht mehr ausgeführt. Nachdem Sie es als Rückgabe betrachtet haben, stellen Sie es sich als Teil eines Generators vor (die Funktion mit Yield ist der eigentliche Iterator). Wenn Sie diese nicht verstehen, dann behandeln Sie Yield zuerst als Rückgabe. Schauen Sie sich dann direkt das folgende Programm an. und Sie werden die volle Bedeutung von yield verstehen:

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

Nur ein paar Zeilen Code werden Ihnen zeigen, was yield ist:

starting...
4
********************
res: None
4

I Erklären Sie direkt die Code-Ausführungssequenz, die dem einstufigen Debuggen des Codes entspricht:

1 Nachdem das Programm mit der Ausführung begonnen hat, wird die foo-Funktion tatsächlich nicht ausgeführt, da das Schlüsselwort yield in der foo-Funktion vorhanden ist Rufen Sie stattdessen zunächst einen Generator g ab (entspricht einem Objekt). Geben Sie dann die while-Schleife ein

3. Das Programm stößt auf das Schlüsselwort yield und betrachtet dann yield als return. Nach der Rückgabe einer 4 stoppt das Programm und führt die Zuweisung zu res zu diesem Zeitpunkt nicht aus. Die next(g)-Anweisung wird ausgeführt, also der erste Teil der Ausgabe. Die beiden Zeilen (die erste ist das Ergebnis von print oben, während die zweite das Ergebnis von return ist) sind die Ergebnisse der Ausführung von print(next(g)) ,

4. Das Programm führt print("

"

20), Ausgabe 20 *5 aus Mal ist es ähnlich wie oben, aber der Unterschied besteht darin, dass es dieses Mal von jetzt an ist. Die Ausführung des nächsten Programms beginnt dort, wo es aufgehört hat, dh die Zuweisungsoperation von res soll zu diesem Zeitpunkt ausgeführt werden. Es ist zu beachten, dass zu diesem Zeitpunkt auf der rechten Seite der Zuweisungsoperation kein Wert vorhanden ist (da die Rückgabe gerade erfolgt ist und auf der linken Seite der Zuweisungsoperation kein Wert vorhanden ist. Parameter übergeben), also zu diesem Zeitpunkt Die Res-Zuweisung ist None, daher ist die folgende Ausgabe res:None,

6 Das Programm wird in der Zwischenzeit weiter ausgeführt und stößt erneut auf yield, dieses Mal wird es auch 4 zurückgeben, dann stoppt das Programm , und die 4-Ausgabe der Druckfunktion ist die 4-Ausgabe dieser Rückgabe. An diesem Punkt können Sie die Beziehung und den Unterschied zwischen Ausbeute und Rendite verstehen. Die Funktion mit Ausbeute ist ein Generator, keine A-Funktion. Dieser Generator verfügt über eine Funktion, die der nächsten Funktion entspricht, die im „nächsten Schritt“ generiert wird. Diesmal wird der Startpunkt von „next“ an der Stelle ausgeführt, an der „next“ zuletzt aufgehört hat Der Generator wird nicht am Anfang der Foo-Funktion ausgeführt, sondern beginnt einfach dort, wo der vorherige Schritt aufgehört hat, und gibt dann, nachdem er auf yield gestoßen ist, die zu generierende Zahl zurück, und dieser Schritt wird beendet.

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))

Sehen Sie sich ein weiteres Beispiel der Sendefunktion dieses Generators an. Dieses Beispiel ersetzt die letzte Zeile des obigen Beispiels und das Ausgabeergebnis ist:

starting...
4
********************
res: 7
4

Lassen Sie uns zunächst kurz über das Senden sprechen Konzept: Zu diesem Zeitpunkt sollten Sie die violetten Wörter oben bemerken und warum der Wert von res oben „Keine“ ist und dieser zu 7 wird. Bei der Rückgabe wird „4“ nicht zugewiesen. Bei der nächsten Ausführung muss die Zuweisungsoperation fortgesetzt und der Wert „Keine“ zugewiesen werden. Wenn „senden“ verwendet wird, wird die Ausführung fortgesetzt Beim vorherigen Mal (Rückgabe von 4 nach der Ausführung) weisen Sie zuerst 7 zu res zu, führen Sie dann die nächste Funktion aus, treffen Sie die nächste Ausbeute und beenden Sie das Ergebnis, nachdem Sie es zurückgegeben haben.

5. Das Programm führt g.send(7) aus und das Programm läuft von der Yield-Schlüsselwortzeile aus weiter nach unten, und send weist der res-Variablen den Wert 7 zu

6 Da die send-Methode die Methode next() enthält, läuft das Programm weiter nach unten, um die print-Methode auszuführen, und tritt dann erneut in die while-Schleife ein

7 Nachdem die Programmausführung erneut auf das Schlüsselwort yield stößt , yield gibt den folgenden Wert zurück und das Programm pausiert erneut, bis die nächste Methode oder Sendemethode erneut aufgerufen wird.

Das ist es. Lassen Sie uns darüber sprechen, warum wir diesen Generator verwenden. Wenn wir List verwenden, nimmt er beispielsweise mehr Platz ein. ...........1000

Sie könnten so aussehen:

for n in range(1000):
    a=n

Zu diesem Zeitpunkt generiert range(1000) standardmäßig eine Liste mit 1000 Zahlen, also Es nimmt viel Speicher in Anspruch.

Zu diesem Zeitpunkt können Sie die Ertragskombination gerade verwenden, um einen Generator für die Implementierung zu bilden, oder Sie können den Generator xrange(1000) verwenden, um die

Ertragskombination zu implementieren:

def foo(num):
    print("starting...")
    while num<10:
        num=num+1
        yield num
for n in foo(0):
    print(n)

Ausgabe:

starting...
1
2
3
4
5
6
7
8
9
10

xrange(1000):

for n in xrange(1000):
    a=n

Es ist zu beachten, dass es in Python3 kein xrange() gibt, range() ist xrange(). Sie können Python3 verwenden. Überprüfen Sie den Typ von range(). Es handelt sich bereits um eine df4be80bd8642c72dbecde608f29f362. Dies muss schließlich optimiert werden.

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von yield in Python (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen