Heim Backend-Entwicklung Python-Tutorial Einführung in die Verwendung von yield in Python

Einführung in die Verwendung von yield in Python

May 21, 2017 pm 01:55 PM

Dieser Artikel führt hauptsächlich eine kurze Analyse der Verwendung von Python ein. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor, um zu sehen, wie man die Fibonacci-Folge generiert


Die Fibonacci-Folge ist eine sehr einfacheRekursiveFolge, außer Für die erste und zweite Zahl kann jede beliebige Zahl durch Addition der ersten beiden Zahlen erhalten werden. Die Verwendung eines Computerprogramms zur Ausgabe der ersten N Zahlen der Fibonacci-Folge ist ein sehr einfaches Problem. Viele Anfänger können leicht die folgende Funktion schreiben:

Listing 1. Einfache Ausgabe der ersten N Zahlen der Fibonacci-Folge

 def fab(max): 
  n, a, b = 0, 0, 1 
  while n < max: 
    print b 
    a, b = b, a + b 
    n = n + 1
Nach dem Login kopieren

Beim Ausführen von fab(5) können wir die folgende Ausgabe erhalten:

>> ;> ; fab(5)
1
1
2
3
5

Das Ergebnis ist kein Problem, aber erfahrene Entwickler werden darauf hinweisen, dass direkt gedruckt wird Das Drucken von Zahlen in der Fab-Funktion macht die Funktion weniger wiederverwendbar, da die Fab-Funktion None zurückgibt und andere Funktionen die von der Funktion generierte Sequenz nicht erhalten können.

Um die Wiederverwendbarkeit der Fab-Funktion zu verbessern, ist es am besten, die Sequenz nicht direkt auszudrucken, sondern eine Liste zurückzugeben. Das Folgende ist die umgeschriebene zweite Version der Fab-Funktion:

Listing 2. Geben Sie die ersten N Zahlen der Fibonacci-Folge aus. Zweite Version

 def fab(max): 
  n, a, b = 0, 0, 1 
  L = [] 
  while n < max: 
    L.append(b) 
    a, b = b, a + b 
    n = n + 1 
  return L
Nach dem Login kopieren

Sie können die folgende Methode verwenden, um die von der Fab-Funktion zurückgegebene Liste auszudrucken:

>>> 
for
 n in fab(5): 
 ...     print n 
 ... 
 1 
 1 
 2 
 3 
 5
Nach dem Login kopieren

Die neu geschriebene Fab-Funktion kann die Wiederverwendbarkeitsanforderungen erfüllen, indem sie eine Liste zurückgibt, erfahrenere Entwickler werden dies jedoch tun Wies darauf hin, dass der von dieser Funktion während des Betriebs belegte Speicher mit zunehmendem Parameter max zunimmt. Wenn Sie die Speicherbelegung steuern möchten, verwenden Sie am besten nicht die Liste zum Speichern der Zwischenergebnisse, sondern das iterierbare Objekt Iterieren. Beispielsweise führt http://www.php.cn/wiki/1078.html" target="_blank">range
(1000): pass dazu, dass eine Liste mit 1000 Elementen erstellt wird generiert, und der Code:

generiert keine Liste mit 1000 Elementen, sondern gibt in jeder Iteration den nächsten Wert zurück und belegt nur sehr wenig Speicherplatz. Weil xrange keine Liste zurückgibt, sondern ein iterierbares Objekt.

Mit iterable können wir die Fab-Funktion in eine for i in <a href="http://www.php.cn/wiki/1078.html" target="_blank">range</a>(1000): passKlasse

umschreiben, die iterable unterstützt. Das Folgende ist die dritte Version von Fab:

for i in xrange(1000): pass

Listing 4. Die dritte Version


Die Fab-Klasse gibt über next() kontinuierlich die nächste Zahl in der Sequenz zurück und die Speichernutzung ist immer konstant:

Allerdings ist der mit class umgeschriebene Code dieser Version weitaus weniger prägnant als der der ersten Version der Fab-Funktion. Yield ist praktisch, wenn wir die Einfachheit der ersten Version der Fab-Funktion beibehalten und dennoch iterierbare Effekte erzielen möchten:

class Fab(object): 

  def init(self, max): 
    self.max = max 
    self.n, self.a, self.b = 0, 0, 1 

  def iter(self): 
    return self 

  def next(self): 
    if self.n < self.max: 
      r = self.b 
      self.a, self.b = self.b, self.a + self.b 
      self.n = self.n + 1 
      return r 
    raise StopIteration()
Nach dem Login kopieren


Listing 5. Die vierte Version mit Yield

 >>> for n in Fab(5): 
 ...     print n 
 ... 
 1 
 1 
 2 
 3 
 5
Nach dem Login kopieren
Nach dem Login kopieren


Im Vergleich zur ersten Version ändert die vierte Version von fab nur print b in yield b, wodurch der iterierbare Effekt erzielt und gleichzeitig die Einfachheit beibehalten wird.

Der Aufruf der vierten Version von Fab ist genau derselbe wie der der zweiten Version von Fab:

 def fab(max): 
  n, a, b = 0, 0, 1 
  while n < max: 
    yield b 
    # print b 
    a, b = b, a + b 
    n = n + 1 

&#39;&#39;&#39;
Nach dem Login kopieren

Einfach ausgedrückt besteht die Funktion von yield darin, sich zu drehen Wenn Sie eine Funktion in einen Generator umwandeln, ist die Funktion mit yield keine gewöhnliche Funktion mehr. Der Aufruf von fab(5) führt die Funktion fab nicht aus, sondern gibt ein iterierbares Objekt zurück. Wenn die for
-Schleife

ausgeführt wird, führt jede Schleife den Code innerhalb der Fab-Funktion aus. Wenn sie Yield b erreicht, gibt die Fab-Funktion einen Iterationswert zurück. In der nächsten Iteration beginnt der Code mit der nächsten Anweisung von yield b. Die Ausführung wird fortgesetzt und die lokale

-Variable
der Funktion sieht genauso aus wie vor der letzten Unterbrechung, sodass die Funktion weiter ausgeführt wird, bis sie erneut auf yield trifft.

 >>> for n in Fab(5): 
 ...     print n 
 ... 
 1 
 1 
 2 
 3 
 5
Nach dem Login kopieren
Nach dem Login kopieren

Sie können die next()-Methode von fab(5) auch manuell aufrufen (da fab(5) ein Generatorobjekt ist, das über eine next()-Methode verfügt), damit wir mehr sehen können klarer Ausführungsprozess für Fab: Listing 6. Ausführungsprozess


Wenn die Funktionsausführung endet, löst der Generator automatisch eine StopIteration-Ausnahme aus, was darauf hinweist Iteration Fertig. In der for-Schleife muss die StopIteration-Ausnahme nicht behandelt werden und die Schleife endet normal.

Wir können folgende Schlussfolgerungen ziehen:

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断:

清单 7. 使用 isgeneratorfunction 判断

 >>> from inspect import isgeneratorfunction 
 >>> isgeneratorfunction(fab) 
 True
Nach dem Login kopieren

要注意区分 fab 和 fab(5),fab 是一个 generator function,而 fab(5) 是调用 fab 返回的一个 generator,好比类的定义和类的实例的区别:

清单 8. 类的定义和类的实例

 >>> import types 
 >>> isinstance(fab, types.GeneratorType) 
 False 
 >>> isinstance(fab(5), types.GeneratorType) 
 True
fab 是无法迭代的,而 fab(5) 是可迭代的:
 >>> from collections import Iterable 
 >>> isinstance(fab, Iterable) 
 False 
 >>> isinstance(fab(5), Iterable) 
 True
Nach dem Login kopieren

每次调用 fab 函数都会生成一个新的 generator 实例,各实例互不影响:

>>> f1 = fab(3) 
 >>> f2 = fab(5) 
 >>> print &#39;f1:&#39;, f1.next() 
 f1: 1 
 >>> print &#39;f2:&#39;, f2.next() 
 f2: 1 
 >>> print &#39;f1:&#39;, f1.next() 
 f1: 1 
 >>> print &#39;f2:&#39;, f2.next() 
 f2: 1 
 >>> print &#39;f1:&#39;, f1.next() 
 f1: 2 
 >>> print &#39;f2:&#39;, f2.next() 
 f2: 2 
 >>> print &#39;f2:&#39;, f2.next() 
 f2: 3 
 >>> print &#39;f2:&#39;, f2.next() 
 f2: 5
Nach dem Login kopieren

return 的作用

在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

另一个例子

另一个 yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:

清单 9. 另一个 yield 的例子

 def read_file(fpath): 
  BLOCK_SIZE = 1024 
  with open(fpath, &#39;rb&#39;) as f: 
    while True: 
      block = f.read(BLOCK_SIZE) 
      if block: 
        yield block 
      else: 
        return
Nach dem Login kopieren

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

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP und Python: Verschiedene Paradigmen erklärt PHP und Python: Verschiedene Paradigmen erklärt Apr 18, 2025 am 12:26 AM

PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

Wählen Sie zwischen PHP und Python: Ein Leitfaden Wählen Sie zwischen PHP und Python: Ein Leitfaden Apr 18, 2025 am 12:24 AM

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Apr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Kann gegen Code in Windows 8 ausgeführt werden Kann gegen Code in Windows 8 ausgeführt werden Apr 15, 2025 pm 07:24 PM

VS -Code kann unter Windows 8 ausgeführt werden, aber die Erfahrung ist möglicherweise nicht großartig. Stellen Sie zunächst sicher, dass das System auf den neuesten Patch aktualisiert wurde, und laden Sie dann das VS -Code -Installationspaket herunter, das der Systemarchitektur entspricht und sie wie aufgefordert installiert. Beachten Sie nach der Installation, dass einige Erweiterungen möglicherweise mit Windows 8 nicht kompatibel sind und nach alternativen Erweiterungen suchen oder neuere Windows -Systeme in einer virtuellen Maschine verwenden müssen. Installieren Sie die erforderlichen Erweiterungen, um zu überprüfen, ob sie ordnungsgemäß funktionieren. Obwohl VS -Code unter Windows 8 möglich ist, wird empfohlen, auf ein neueres Windows -System zu upgraden, um eine bessere Entwicklungserfahrung und Sicherheit zu erzielen.

Kann Visual Studio -Code in Python verwendet werden Kann Visual Studio -Code in Python verwendet werden Apr 15, 2025 pm 08:18 PM

VS -Code kann zum Schreiben von Python verwendet werden und bietet viele Funktionen, die es zu einem idealen Werkzeug für die Entwicklung von Python -Anwendungen machen. Sie ermöglichen es Benutzern: Installation von Python -Erweiterungen, um Funktionen wie Code -Abschluss, Syntax -Hervorhebung und Debugging zu erhalten. Verwenden Sie den Debugger, um Code Schritt für Schritt zu verfolgen, Fehler zu finden und zu beheben. Integrieren Sie Git für die Versionskontrolle. Verwenden Sie Tools für die Codeformatierung, um die Codekonsistenz aufrechtzuerhalten. Verwenden Sie das Lining -Tool, um potenzielle Probleme im Voraus zu erkennen.

PHP und Python: Ein tiefes Eintauchen in ihre Geschichte PHP und Python: Ein tiefes Eintauchen in ihre Geschichte Apr 18, 2025 am 12:25 AM

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

So führen Sie Programme in der terminalen VSCODE aus So führen Sie Programme in der terminalen VSCODE aus Apr 15, 2025 pm 06:42 PM

Im VS -Code können Sie das Programm im Terminal in den folgenden Schritten ausführen: Erstellen Sie den Code und öffnen Sie das integrierte Terminal, um sicherzustellen, dass das Codeverzeichnis mit dem Terminal Working -Verzeichnis übereinstimmt. Wählen Sie den Befehl aus, den Befehl ausführen, gemäß der Programmiersprache (z. B. Pythons Python your_file_name.py), um zu überprüfen, ob er erfolgreich ausgeführt wird, und Fehler auflösen. Verwenden Sie den Debugger, um die Debugging -Effizienz zu verbessern.

Ist die VSCODE -Erweiterung bösartig? Ist die VSCODE -Erweiterung bösartig? Apr 15, 2025 pm 07:57 PM

VS -Code -Erweiterungen stellen böswillige Risiken dar, wie das Verstecken von böswilligem Code, das Ausbeutetieren von Schwachstellen und das Masturbieren als legitime Erweiterungen. Zu den Methoden zur Identifizierung böswilliger Erweiterungen gehören: Überprüfung von Verlegern, Lesen von Kommentaren, Überprüfung von Code und Installation mit Vorsicht. Zu den Sicherheitsmaßnahmen gehören auch: Sicherheitsbewusstsein, gute Gewohnheiten, regelmäßige Updates und Antivirensoftware.

See all articles