Python 的 yield 关键字有什么作用?
前言
1、yield
是Python中的一个关键字,用于在函数中生成一个生成器。
2、与普通返回值不同的是,yield会暂停函数的执行,并返回一个值,而函数的状态会被保留,以便下次执行。
3、yield 特别适合处理大数据或流式处理的场景,因为它允许函数生成一个序列的值,而不是一次性将所有数据加载到内存中。
人类语言描述:yield是一个关键字,可以暂停函数执行(函数挂起),并返回序列值,等被执行到的时候才会取出数据,特别大数据(节省内存)和流式场景。
当使用next()、send()函数,即可以从断点处继续执行。
1 生成器函数
def my_generator():
for i in range(5):
yield i
gen = my_generator()
print(next(gen))
print(next(gen))

2 节省内存
案例作用: 循环输出 0 - limit 的数值
常规思路:提前生成放到列表中,或使用range
yield优点:直到执行到的时候,才计算具体值,完全不需要提前计算好值,即可以节省内存。
def generate_numbers(limit):
num = 0
while num < limit:
yield num
num += 1
for num in generate_numbers(1000):
print(num)

3 状态保留
每次 yield 被调用时,函数的执行状态都会被保留,包括局部变量,下一次执行时,则可以接着执行。
def countdown(n):
while n > 0:
yield n
n -= 1
num = countdown(5)
print(next(num))
print(next(num))
4 双向通信
允许外部传入数据
def echo():
while True:
received = yield
print(f"收到:{received}")
e = echo()
next(e)
e.send('有勇气的牛排博客')
e.send('666')
<h1><a id="Python__yield__0"></a>Python 的 yield 关键字有什么作用?</h1>
<h2><a id="_2"></a>前言</h2>
<p>1、<code>yield</code> 是Python中的一个关键字,用于在函数中生成一个<strong>生成器</strong>。</p>
<p>2、与普通返回值不同的是,yield会暂停函数的执行,并返回一个值,而函数的状态会被保留,以便下次执行。</p>
<p>3、yield 特别适合处理大数据或流式处理的场景,因为它允许函数生成一个<strong>序列的值</strong>,而<strong>不是一次性将所有数据加载到内存</strong>中。</p>
<p>人类语言描述:yield是一个<strong>关键字</strong>,可以<strong>暂停函数</strong>执行(函数挂起),并<strong>返回序列值</strong>,等被执行到的时候才会取出数据,特别大数据(节省内存)和流式场景。</p>
<p>当使用next()、send()函数,即可以从断点处继续执行。</p>
<h2><a id="1__16"></a>1 生成器函数</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">my_generator</span>():
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>):
<span class="hljs-keyword">yield</span> i
gen = my_generator()
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(gen)) <span class="hljs-comment"># 5</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(gen)) <span class="hljs-comment"># 4</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/3d2958434cf5976223adc3cf76944a19.png" alt="yield 生成器函数" /></p>
<h2><a id="2__30"></a>2 节省内存</h2>
<p>案例作用: 循环输出 0 - limit 的数值</p>
<p>常规思路:提前生成放到列表中,或使用range</p>
<p>yield优点:直到执行到的时候,才计算具体值,完全不需要提前计算好值,即可以节省内存。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">generate_numbers</span>(<span class="hljs-params">limit</span>):
num = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> num < limit:
<span class="hljs-keyword">yield</span> num
num += <span class="hljs-number">1</span>
<span class="hljs-keyword">for</span> num <span class="hljs-keyword">in</span> generate_numbers(<span class="hljs-number">1000</span>):
<span class="hljs-built_in">print</span>(num) <span class="hljs-comment"># 逐个生成并输出数字</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/037fa636eb076652cc3537b2d5265b48.png" alt="yield节省内存" /></p>
<h2><a id="3__51"></a>3 状态保留</h2>
<p>每次 yield 被调用时,函数的执行状态都会被保留,包括局部变量,下一次执行时,则可以接着执行。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">countdown</span>(<span class="hljs-params">n</span>):
<span class="hljs-keyword">while</span> n > <span class="hljs-number">0</span>:
<span class="hljs-keyword">yield</span> n
n -= <span class="hljs-number">1</span>
num = countdown(<span class="hljs-number">5</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(num)) <span class="hljs-comment"># 5</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(num)) <span class="hljs-comment"># 4</span>
</code></div></pre>
<h2><a id="4__66"></a>4 双向通信</h2>
<p>允许外部传入数据</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">echo</span>():
<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
received = <span class="hljs-keyword">yield</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">f"收到:<span class="hljs-subst">{received}</span>"</span>)
e = echo()
<span class="hljs-built_in">next</span>(e) <span class="hljs-comment"># 启动生成器</span>
e.send(<span class="hljs-string">'有勇气的牛排博客'</span>) <span class="hljs-comment"># 收到:有勇气的牛排博客</span>
e.send(<span class="hljs-string">'666'</span>) <span class="hljs-comment"># 收到:666</span>
</code></div></pre>
留言