1. 简介
在学习Python的迭代器和生成器时,我们经常会听到yield的名字。yield的作用是什么?yield和return有什么区别?本文将通过实例来解答这些问题。
2. yield的用法
yield是Python中的一个关键字,用于生成器的创建。生成器是一种特殊的迭代器,它不需要在内存中创建一个完整的集合,而是在需要的时候生成一个元素。在Python中,有两种方法可以创建生成器:
2.1 使用生成器函数创建生成器
生成器函数是一个包括yield关键字的函数。函数中的yield语句告诉Python解释器,当前函数是一个生成器函数。
下面是一个简单的生成器函数的例子:
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen))
print(next(gen))
print(next(gen))
运行上述代码将输出:
1
2
3
在上述代码中,我们创建了一个简单的生成器函数simple_generator,并将其赋值给变量gen。我们使用next函数来获取下一个元素,直到所有元素都被消耗。
2.2 使用yield关键字生成值
我们可以使用yield关键字在普通函数中生成值。生成器函数每次调用yield语句时,它会返回一个值,并暂停函数的执行状态。当函数下次被调用时,它会从上次离开的地方继续执行。
下面是简单的例子:
def simple_generator():
print("执行前")
yield 1
print("执行中")
yield 2
print("执行后")
yield 3
gen = simple_generator()
print(next(gen))
print(next(gen))
print(next(gen))
运行上述代码将输出:
执行前
1
执行中
2
执行后
3
在上述代码中,我们创建了一个简单的生成器函数simple_generator,并将其赋值给变量gen。我们用next函数获取下一个元素,它会执行到第一个yield语句处,并返回1。当我们再次调用next函数时,它会从上次离开的地方继续执行,并返回2。最后一次调用next函数,它会从上次离开的地方继续执行,并返回3。
3. yield与return的区别
yield和return都可以将值从函数中返回。但是它们之间有一个重要的区别:return语句终止函数执行并返回值,而yield保留函数状态并返回值。
下面是一个简单的例子:
def simple_generator():
print("执行前")
return 1
print("执行中")
return 2
print("执行后")
return 3
gen = simple_generator()
print(gen)
运行上述代码将输出:
执行前
1
在上述代码中,我们创建了一个简单的函数simple_generator,它使用return语句返回1,结束函数的执行。因此,其他两个print语句都不会执行
下面是一个使用yield的例子:
def simple_generator():
print("执行前")
yield 1
print("执行中")
yield 2
print("执行后")
yield 3
gen = simple_generator()
print(next(gen))
print(next(gen))
print(next(gen))
运行上述代码将输出:
执行前
1
执行中
2
执行后
3
在上述代码中,我们创建了一个简单的生成器函数simple_generator,并将其赋值给变量gen。我们用next函数获取下一个元素,它会执行到第一个yield语句处,并返回1。当我们再次调用next函数时,它会从上次离开的地方继续执行,并返回2。最后一次调用next函数,它会从上次离开的地方继续执行,并返回3。
4. 实例分析
现在,让我们来看看一个更复杂的实例。假设我们有一个列表,我们要将其中的值都加上2,并返回加2后的列表。
使用列表推导式很容易实现:
lst = [1, 2, 3, 4, 5]
new_lst = [x+2 for x in lst]
print(new_lst)
运行上述代码将输出:
[3, 4, 5, 6, 7]
现在,让我们使用yield实现同样的功能:
lst = [1, 2, 3, 4, 5]
def add_two(lst):
for x in lst:
yield x+2
new_lst = list(add_two(lst))
print(new_lst)
运行上述代码将输出:
[3, 4, 5, 6, 7]
在上述代码中,我们创建了一个生成器函数add_two,它使用yield语句生成一个加2后的值。我们用list函数将生成器转换为列表,并将其赋值给变量new_lst。
结论
yield是Python中非常有用的一个关键字,可以用于创建生成器函数。通过使用yield,我们可以实现高效而简单的迭代器。
yield和return之间有一个非常重要的区别:return语句终止函数执行并返回值,而yield保留函数状态并返回值。这使生成器函数有许多独特的用途和优势。