首页 > 编程知识 正文

Python yield用法介绍

时间:2023-11-20 16:05:33 阅读:289517 作者:SBHG

Python的yield是一个非常强大的关键字,它可以让函数变成一个generator(生成器),实现递归或迭代的过程中节省大量内存,同时带来了很多有趣且实用的用法。

一、生成器基础

在Python中,生成器是使用yield语句的函数,yield语句可以将当前函数挂起,返回一个值给调用者,同时保留当前函数的状态,以备下次调用时继续执行。

def my_generator():
    yield 1
    yield 2
    yield 3
    
for value in my_generator():
    print(value)

以上代码将输出:

1
2
3

my_generator()函数被调用时,会返回一个生成器对象,而不是直接执行函数。对生成器对象调用next()方法时,函数会从yield语句处开始执行,直到遇到下一个yield语句挂起。在没有yield语句可供挂起时,函数会抛出StopIteration异常,遍历结束。

二、使用生成器进行递归

Python中可以使用递归的方法解决许多问题,但是递归方法在处理大规模数据时,可能会导致栈溢出。在这种情况下,使用生成器可以避免这个问题,因为生成器不会一次性占用大量内存。

def my_recursive_generator(n):
    if n == 0:
        return
    yield n
    yield from my_recursive_generator(n-1)
    
for value in my_recursive_generator(5):
    print(value)

以上代码将输出:

5
4
3
2
1

在my_recursive_generator函数中,使用yield语句将当前状态挂起并返回当前值,然后调用my_recursive_generator(n-1)生成器继续执行函数,重复这个流程,直到n==0返回。在每个生成器中,继续调用yield from语句从另一个生成器中返回值。

三、解析生成器表达式

Python中有一种简洁且灵活的生成器形式——生成器表达式。生成器表达式有点像列表推导式,但是返回的是一个生成器对象。

my_generator = (x * x for x in range(10))
for value in my_generator:
    print(value)

以上代码将输出:

0
1
4
9
16
25
36
49
64
81

在上面的代码中,使用生成器表达式构造了一个生成器对象,然后在循环中依次调用next()方法获取生成器的值并打印。使用生成器表达式非常适合需要迭代的大型数据集。

四、使用yield实现协程

协程是一种比线程更加轻量级的并发模型,多个协程可以在一个线程中同时执行,很好地支持并发操作。

def my_coroutine():
    while True:
        value = yield
        print(value)
        
coroutine = my_coroutine()
next(coroutine)
coroutine.send("Hello, world!")
coroutine.send("Goodbye, world!")

以上代码将输出:

Hello, world!
Goodbye, world!

在上面的代码中,my_coroutine()函数中使用了while True语句无限循环,每次遇到yield语句时挂起函数,并等待外部调用send()方法传入一个值,然后继续执行。在coroutine变量中创建生成器对象,并使用next()方法调用一次my_coroutine()函数,开始执行。使用coroutine.send()方法向生成器中传值,这个值会被yield语句接收并打印。

五、使用yield from进行生成器委托

Python3中,可以使用yield from语句更加简洁地管理子生成器,这样可以方便地实现委托生成器和子生成器之间的交互。

def my_sub_generator():
    yield 1
    yield 2
    yield 3
    
def my_delegating_generator():
    yield from my_sub_generator()
    
for value in my_delegating_generator():
    print(value)

以上代码将输出:

1
2
3

在my_delegating_generator()函数中,使用yield from语句将my_sub_generator()生成器向上委托给委托生成器,即自动遍历my_sub_generator()生成器,并将其返回值依次返回给my_delegating_generator()。

六、总结

Python中的yield关键字是一个非常强大而实用的功能,可以实现递归或迭代的过程中节省大量内存,同时带来了很多有趣且实用的用法,如递归、生成器表达式、协程和生成器委托。使用yield可以让代码变得更加简洁、灵活和高效,便于处理大量数据和并发问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。