欢迎访问宙启技术站
智能推送

Python中的yield函数详解

发布时间:2023-07-02 10:55:31

Python中的yield函数是用来生成迭代器的一个关键字。当函数中包含yield关键字时,该函数就不再是一个普通的函数,而是一个生成器函数。生成器函数和普通函数的区别在于,生成器函数在执行时并不会真正执行函数体内的代码,而是返回一个迭代器对象。当使用迭代器对象进行迭代时,函数体内的代码才会被执行。

生成器函数的使用方式与普通函数类似,可以通过调用函数名来生成一个迭代器对象,然后使用该对象进行迭代。不同之处在于,生成器函数的执行是分段进行的,每次调用迭代器对象的__next__()方法时,函数会执行到yield关键字处,并返回yield后的值。下次调用__next__()方法时,函数会从上次yield的位置继续执行,直到函数体中没有yield关键字时,迭代器对象抛出StopIteration异常,迭代结束。

def count():
    i = 0
    while i < 5:
        yield i
        i += 1

iter_obj = count()
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())

上面的代码定义了一个生成器函数count(),它使用yield关键字返回了一个迭代器对象。通过调用生成器函数,我们获得了一个迭代器对象iter_obj。然后,我们可以通过该对象调用__next__()方法来获取生成器函数中yield关键字后的值。输出结果为:

0
1
2
3
4

在每次调用__next__()方法时,生成器函数中的代码会执行到下一个yield关键字处,保存当前的状态。在下一次调用__next__()方法时,函数会从上次保存的状态位置继续执行。

另外,生成器函数还可以实现生成无限序列的功能。由于生成器函数的执行是分段进行的,所以在生成器函数中可以通过一个循环来不断产生新的值。这样就可以实现无限序列的生成。

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

for i in infinite_sequence():
    print(i)
    if i > 10:
        break

上面的代码定义了一个生成器函数infinite_sequence(),它通过一个无限循环不断产生新的值。在使用for循环进行迭代时,我们可以通过设置一个条件来控制迭代的次数,从而避免无限循环。

生成器函数的使用可以节省内存空间,特别是在需要处理大量数据的情况下。由于生成器函数是逐个产生数据的,所以不需要一次性将所有数据存储在内存中,而是在需要的时候才生成数据。这样可以大大节省内存空间的使用。

总结一下,Python中的yield函数是用来生成迭代器的一个关键字。生成器函数和普通函数的主要区别在于,生成器函数在执行时并不会真正执行函数体内的代码,而是返回一个迭代器对象。生成器函数的执行是分段进行的,每次调用__next__()方法时,函数会执行到yield关键字处,并返回yield后的值。下次调用__next__()方法时,函数会从上次yield的位置继续执行,直到函数体中没有yield关键字时,迭代结束。生成器函数的使用可以节省内存空间,在处理大量数据时非常实用。