Inhaltsverzeichnis
回复内容:
Heim Backend-Entwicklung Python-Tutorial 使用yield可以做哪些很酷的事情?

使用yield可以做哪些很酷的事情?

Jun 06, 2016 pm 04:23 PM
javascript python yield

使用生成器(Generator)和yield可以做哪些有趣的、酷酷的、让人意想不到的事情?
不限编程语言,例如python、JavaScript 等。

回复内容:

yield 在 JavaScript 中用的最多的可能就是结合 Promise/Thunk 等实现异步操作,比如大名鼎鼎的 tj/co · GitHub,所以已经不是「让人意想不到」的东西了。
理解 Generator 的特性后,实现一个玩具版的 co 还是很简单的:
function async(generator) {
  return new Promise(function(resolve, reject) {
    var g = generator()

    function next(val) {
      var result = g.next(val)
      var value = result.value

      if (!result.done) {
        value.then(next).catch(reject)
      }
      else {
        resolve(value)
      }
    }

    next()
  })
}
Nach dem Login kopieren
最典型的不就是async/await么?


不了解yield怎么实现async/await的,用C#代码试举一例:

IEnumerable<Action<Action>> SomeAsyncMethod()
{
  //blabla
  yield return await( asyncMethod, context );

  //blabla
  yield return await( asyncMethod, context );

  //blabla
}
Nach dem Login kopieren
可以做动画呀,效果如图:
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">matplotlib.animation</span> <span class="kn">as</span> <span class="nn">animation</span>
<span class="kn">import</span> <span class="nn">math</span><span class="o">,</span> <span class="nn">random</span>
<span class="c"># 需要安装的库:Numpy和Matplotlib,推荐直接Anaconda</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">axes1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span>
<span class="c"># 设置坐标轴长度</span>
<span class="n">axes1</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">1.4</span><span class="p">)</span>
<span class="n">axes1</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="o">/</span><span class="mf">0.01</span><span class="p">)</span>
<span class="c"># 设置初始x、y数值数组</span>
<span class="n">xdata</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
<span class="n">ydata</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">xdata</span><span class="p">)</span>
<span class="c"># 获得线条</span>
<span class="n">line</span><span class="p">,</span> <span class="o">=</span> <span class="n">axes1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xdata</span><span class="p">)</span>
<span class="c"># 毛刺倍率,从0开始增长,offset越大毛刺越大</span>
<span class="n">offset</span> <span class="o">=</span> <span class="mf">0.0</span>

<span class="c">#因为update的参数是调用函数data_gen,所以第一个默认参数不能是framenum</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="k">global</span> <span class="n">offset</span>
    <span class="n">line</span><span class="o">.</span><span class="n">set_ydata</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">line</span><span class="p">,</span>
<span class="c"># 每次生成10个随机数据</span>
<span class="c"># 每次变化整幅图的话,yield一个整图就行了</span>
<span class="k">def</span> <span class="nf">data_gen</span><span class="p">():</span>
    <span class="k">global</span> <span class="n">offset</span>
    <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
        <span class="n">length</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">xdata</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">xdata</span><span class="p">)):</span>
            <span class="n">ydata</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">xdata</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">+</span><span class="mf">0.2</span>
            <span class="k">if</span> <span class="n">i</span><span class="o">></span><span class="n">length</span><span class="o">/</span><span class="mf">18.0</span> <span class="ow">and</span> <span class="n">i</span><span class="o"><</span><span class="p">(</span><span class="n">length</span><span class="o">*</span><span class="mf">2.7</span><span class="o">/</span><span class="mf">6.0</span><span class="p">):</span>
                <span class="n">ydata</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+=</span><span class="n">offset</span><span class="o">*</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">-</span><span class="mf">0.5</span><span class="p">)</span>
        <span class="n">offset</span> <span class="o">+=</span> <span class="mf">0.05</span>
        <span class="c">#可以设置offset的最大值</span>
        <span class="k">if</span> <span class="n">offset</span><span class="o">>=</span><span class="mf">0.5</span><span class="p">:</span>
           <span class="n">offset</span><span class="o">=</span><span class="mf">0.0</span>
        <span class="k">yield</span> <span class="n">ydata</span>
<span class="c"># 配置完毕,开始播放</span>
<span class="n">ani</span> <span class="o">=</span> <span class="n">animation</span><span class="o">.</span><span class="n">FuncAnimation</span><span class="p">(</span><span class="n">fig</span><span class="p">,</span> <span class="n">update</span><span class="p">,</span> <span class="n">data_gen</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">800</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
Nach dem Login kopieren
模拟离散事件,还有更简洁优雅的方式么

Overview — SimPy 3.0.8 documentation 这个问题就是给我准备的嘛

当有人声称在CPython里实现了一个沙盒的时候就可以用yield去逗他了,I was looking through the code and saw someone submitted this but didn't run it:...

酷到没工作... A Curious Course on Coroutines and Concurrency 可以写出一个并发的库
Generator Tricks for Systems Programmers 可以写个流处理框架 参见David Beazley大神几次PyCon的pdf,看完我简直是惊呆了。dabeaz.com 可以用来训练神经网络.
比如Lasagne/Lasagne · GitHub 中的一段示例代码:
<span class="k">def</span> <span class="nf">train</span><span class="p">(</span><span class="n">iter_funcs</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="n">BATCH_SIZE</span><span class="p">):</span>
    <span class="sd">"""Train the model with `dataset` with mini-batch training. Each</span>
<span class="sd">       mini-batch has `batch_size` recordings.</span>
<span class="sd">    """</span>
    <span class="n">num_batches_train</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s">'num_examples_train'</span><span class="p">]</span> <span class="o">//</span> <span class="n">batch_size</span>
    <span class="n">num_batches_valid</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s">'num_examples_valid'</span><span class="p">]</span> <span class="o">//</span> <span class="n">batch_size</span>

    <span class="k">for</span> <span class="n">epoch</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">batch_train_losses</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_batches_train</span><span class="p">):</span>
            <span class="n">batch_train_loss</span> <span class="o">=</span> <span class="n">iter_funcs</span><span class="p">[</span><span class="s">'train'</span><span class="p">](</span><span class="n">b</span><span class="p">)</span>
            <span class="n">batch_train_losses</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">batch_train_loss</span><span class="p">)</span>

        <span class="n">avg_train_loss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">batch_train_losses</span><span class="p">)</span>

        <span class="n">batch_valid_losses</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">batch_valid_accuracies</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_batches_valid</span><span class="p">):</span>
            <span class="n">batch_valid_loss</span><span class="p">,</span> <span class="n">batch_valid_accuracy</span> <span class="o">=</span> <span class="n">iter_funcs</span><span class="p">[</span><span class="s">'valid'</span><span class="p">](</span><span class="n">b</span><span class="p">)</span>
            <span class="n">batch_valid_losses</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">batch_valid_loss</span><span class="p">)</span>
            <span class="n">batch_valid_accuracies</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">batch_valid_accuracy</span><span class="p">)</span>

        <span class="n">avg_valid_loss</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">batch_valid_losses</span><span class="p">)</span>
        <span class="n">avg_valid_accuracy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">batch_valid_accuracies</span><span class="p">)</span>

        <span class="k">yield</span> <span class="p">{</span>
            <span class="s">'number'</span><span class="p">:</span> <span class="n">epoch</span><span class="p">,</span>
            <span class="s">'train_loss'</span><span class="p">:</span> <span class="n">avg_train_loss</span><span class="p">,</span>
            <span class="s">'valid_loss'</span><span class="p">:</span> <span class="n">avg_valid_loss</span><span class="p">,</span>
            <span class="s">'valid_accuracy'</span><span class="p">:</span> <span class="n">avg_valid_accuracy</span><span class="p">,</span>
        <span class="p">}</span>
Nach dem Login kopieren
tornado就是使用generator实现的协程(coroutine)模型,再配合event loop实现高并发的 使用迭代器遍历二叉树。
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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

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)

Wie konvertiere ich XML -Dateien in PDF auf Ihrem Telefon? Wie konvertiere ich XML -Dateien in PDF auf Ihrem Telefon? Apr 02, 2025 pm 10:12 PM

Mit einer einzigen Anwendung ist es unmöglich, XML -zu -PDF -Konvertierung direkt auf Ihrem Telefon zu vervollständigen. Es ist erforderlich, Cloud -Dienste zu verwenden, die in zwei Schritten erreicht werden können: 1. XML in PDF in der Cloud, 2. Zugriff auf die konvertierte PDF -Datei auf dem Mobiltelefon konvertieren oder herunterladen.

Ist die Konversionsgeschwindigkeit beim Umwandeln von XML in PDF auf Mobiltelefon schnell? Ist die Konversionsgeschwindigkeit beim Umwandeln von XML in PDF auf Mobiltelefon schnell? Apr 02, 2025 pm 10:09 PM

Die Geschwindigkeit der mobilen XML zu PDF hängt von den folgenden Faktoren ab: der Komplexität der XML -Struktur. Konvertierungsmethode für mobile Hardware-Konfiguration (Bibliothek, Algorithmus) -Codierungsoptimierungsmethoden (effiziente Bibliotheken, Optimierung von Algorithmen, Cache-Daten und Nutzung von Multi-Threading). Insgesamt gibt es keine absolute Antwort und es muss gemäß der spezifischen Situation optimiert werden.

Was ist die Funktion der C -Sprachsumme? Was ist die Funktion der C -Sprachsumme? Apr 03, 2025 pm 02:21 PM

Es gibt keine integrierte Summenfunktion in der C-Sprache, daher muss sie selbst geschrieben werden. Die Summe kann erreicht werden, indem das Array durchquert und Elemente akkumulieren: Schleifenversion: Die Summe wird für die Schleifen- und Arraylänge berechnet. Zeigerversion: Verwenden Sie Zeiger, um auf Array-Elemente zu verweisen, und eine effiziente Summierung wird durch Selbststillstandszeiger erzielt. Dynamisch Array -Array -Version zuweisen: Zuordnen Sie Arrays dynamisch und verwalten Sie selbst den Speicher selbst, um sicherzustellen, dass der zugewiesene Speicher befreit wird, um Speicherlecks zu verhindern.

Gibt es eine mobile App, die XML in PDF umwandeln kann? Gibt es eine mobile App, die XML in PDF umwandeln kann? Apr 02, 2025 pm 08:54 PM

Eine Anwendung, die XML direkt in PDF konvertiert, kann nicht gefunden werden, da es sich um zwei grundlegend unterschiedliche Formate handelt. XML wird zum Speichern von Daten verwendet, während PDF zur Anzeige von Dokumenten verwendet wird. Um die Transformation abzuschließen, können Sie Programmiersprachen und Bibliotheken wie Python und ReportLab verwenden, um XML -Daten zu analysieren und PDF -Dokumente zu generieren.

Was ist der Prozess des Konvertierens von XML in Bilder? Was ist der Prozess des Konvertierens von XML in Bilder? Apr 02, 2025 pm 08:24 PM

Um XML -Bilder zu konvertieren, müssen Sie zuerst die XML -Datenstruktur ermitteln, dann eine geeignete grafische Bibliothek (z. B. Pythons Matplotlib) und eine Methode auswählen, eine Visualisierungsstrategie basierend auf der Datenstruktur auswählen, das Datenvolumen und das Bildformat, die Batch -Verarbeitung ausführen oder effiziente Bibliotheken verwenden und schließlich als PNG, JPEG oder SVG nach den Bedürfnissen speichern.

So konvertieren Sie XML in Bilder So konvertieren Sie XML in Bilder Apr 03, 2025 am 07:39 AM

XML kann mithilfe eines XSLT -Konverters oder einer Bildbibliothek in Bilder konvertiert werden. XSLT -Konverter: Verwenden Sie einen XSLT -Prozessor und Stylesheet, um XML in Bilder zu konvertieren. Bildbibliothek: Verwenden Sie Bibliotheken wie Pil oder Imagemagick, um Bilder aus XML -Daten zu erstellen, z. B. Zeichnen von Formen und Text.

Empfohlenes XML -Formatierungswerkzeug Empfohlenes XML -Formatierungswerkzeug Apr 02, 2025 pm 09:03 PM

XML -Formatierungs -Tools können Code nach Regeln eingeben, um die Lesbarkeit und das Verständnis zu verbessern. Achten Sie bei der Auswahl eines Tools auf die Anpassungsfunktionen, den Umgang mit besonderen Umständen, die Leistung und die Benutzerfreundlichkeit. Zu den häufig verwendeten Werkzeugtypen gehören Online-Tools, IDE-Plug-Ins und Befehlszeilen-Tools.

Gibt es eine mobile App, die XML in PDF umwandeln kann? Gibt es eine mobile App, die XML in PDF umwandeln kann? Apr 02, 2025 pm 09:45 PM

Es gibt keine App, die alle XML -Dateien in PDFs umwandeln kann, da die XML -Struktur flexibel und vielfältig ist. Der Kern von XML zu PDF besteht darin, die Datenstruktur in ein Seitenlayout umzuwandeln, für das XML analysiert und PDF generiert werden muss. Zu den allgemeinen Methoden gehören das Parsen von XML mithilfe von Python -Bibliotheken wie ElementTree und das Generieren von PDFs unter Verwendung der ReportLab -Bibliothek. Für komplexe XML kann es erforderlich sein, XSLT -Transformationsstrukturen zu verwenden. Wenn Sie die Leistung optimieren, sollten Sie Multithread- oder Multiprozesse verwenden und die entsprechende Bibliothek auswählen.

See all articles