在Python中,yield
是一个重要的关键字,它与生成器(Generator)和懒惰计算(Lazy Evaluation)密切相关。
yield
允许函数在迭代过程中产生值,而不必一次性将所有值计算出来。这种特性在处理大数据集或无限序列时尤其有用。
一、yield
关键字
1.1 yield
的基本概念
yield
是一个关键字,用于定义生成器函数。生成器函数可以被暂停和恢复,允许逐个生成值而不需要一次性计算所有值。当生成器函数执行到yield
语句时,它将生成一个值,并保存其状态,然后等待下一次调用来继续执行。
1.2 生成器的工作原理
生成器是一种特殊类型的迭代器,由生成器函数创建。生成器函数包含至少一个yield
语句,它可以返回一个值,并在下一次迭代时从yield
语句处继续执行。这允许生成器函数的状态保持不变,而值可以逐个生成。
以下是一个简单的生成器函数示例:
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
print(next(gen)) # 输出:3
示例中,simple_generator
是一个生成器函数,它包含三个yield
语句。当我们创建生成器对象gen
并调用next()
函数时,生成器函数在每次调用后从yield
语句处继续执行,并生成相应的值。
二、创建生成器
2.1 生成器函数
生成器函数是一种包含yield
语句的函数,用于生成值。生成器函数的执行可以被多次暂停和继续,每次暂停都会生成一个值。
以下是一个生成器函数的示例,用于生成斐波那契数列:
def fibonacci_generator():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
gen = fibonacci_generator()
for _ in range(10):
print(next(gen)) # 输出前10个斐波那契数
2.2 生成器表达式
除了生成器函数,Python还提供了生成器表达式,它类似于列表推导式,但是返回一个生成器对象,逐个生成值。生成器表达式的语法更紧凑。
以下是一个生成器表达式的示例,用于生成自然数的平方:
gen = (x**2 for x in range(1, 6))
for value in gen:
print(value) # 输出:1 4 9 16 25
生成器表达式可以在不创建额外的函数的情况下生成值,适用于简单的迭代需求。
三、yield
的高级用法
3.1 生成器的状态保存
生成器函数在每次执行时都会保持其状态。这意味着它可以用于生成无限序列或大数据集,而不必将所有数据存储在内存中。
以下是一个无限递增的生成器示例:
def infinite_increment():
num = 0
while True:
yield num
num += 1
gen = infinite_increment()
for _ in range(5):
print(next(gen)) # 输出:0 1 2 3 4
3.2 生成器的数据过滤
yield
可以与条件结合使用,用于过滤生成的值。这允许生成器仅生成符合特定条件的值。
以下是一个示例,生成偶数的生成器:
def even_numbers():
num = 0
while True:
if num % 2 == 0:
yield num
num += 1
gen = even_numbers()
for _ in range(5):
print(next(gen)) # 输出:0 2 4 6 8
3.3 生成器的懒惰计算
生成器的懒惰计算是一种在需要时计算值的方式,而不是一次性计算所有值。这在处理大型数据集或无限序列时非常有用。
以下是一个示例,生成自然数的平方,但只计算前5个:
def lazy_square(limit):
for x in range(1, limit + 1):
yield x**2
gen = lazy_square(5)
for value in gen:
print(value) # 输出:1 4 9 16 25
懒惰计算允许在处理大量数据时节省内存和计算资源。
总结
yield的高级用法包括生成器的状态保存,允许无限递增或递减的生成器。还可以与条件结合使用,用于过滤生成的值,仅生成符合特定条件的值。最重要的是,yield支持懒惰计算,允许在需要时计算值,而不是一次性计算所有值,从而节省内存和计算资源。
在处理大型数据集、无限序列或需要逐个生成值的情况下,yield是一个强大的工具。通过深入理解yield,可以更好地利用生成器和懒惰计算,提高代码的效率和可维护性。
如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料
1️⃣零基础入门
① 学习路线
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
2️⃣国内外Python书籍、文档
① 文档和书籍资料
3️⃣Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
4️⃣Python面试题
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
5️⃣Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓