2016 - 2024

感恩一路有你

Python生成器函数和生成器表达式

浏览量:4490 时间:2024-01-16 18:46:45 作者:采采

生成器是一个可以产生一系列值的机器。与将对象的所有元素都存入内存之后再进行操作的方式不同,生成器在迭代至某个元素时才计算并生成该元素放入内存。生成器是创建迭代器的工具,但它的对象仅产生值。有两种写法的生成器:生成器函数和生成器表达式。

生成器函数的写法

生成器函数是指带有一个或多个yield语句的函数,通过使用yield语句来生成值。

def generator():
    yield value

例如,定义一个生成器函数如下:

def gen():
    yield 3
g  gen()
print(g)
# lt;generator object gen at 0x000001C62689C2A0gt;

生成器对象并没有返回yield语句中的值,而是返回一个内存地址。虽然生成器是创建迭代器的工具,但返回的值并不是迭代器。我们可以通过以下示例验证这一点:

def gen():
    yield 3
g  gen()
for x in g:
    print(x)
# 3
def gen():
    yield 3
g  gen()
print(next(g))
# 3

上述示例表明生成器函数对象就是一个迭代器,但迭代器内的值并没有预先放在内存中,而是需要的时候通过yield语句生成值。这是生成器函数的最大优点。完全可以将生成器函数称为生成器式的迭代器。

生成器函数的多个yield语句

生成器函数可以使用多个yield语句,或者在迭代yield语句产生值时使用next()方法或for循环来取值。每次取值都是从上次停止取值的位置的yield语句开始,直到所有的yield语句被使用完。如果再次使用next()函数,将会报错。

永远执行的生成器函数的转发方法

生成器函数可以通过(value)方法和()方法进行转发。send方法执行生成器函数并发送值(参数value),该值将成为当前yield表达式的结果。使用变量来接收yield生成的值。

def gen(element):
    while True:
        newE  yield element
        if element is not None:
            element  newE
g  gen('rose')
print(next(g))
# rose
print(('tom'))
# tom
()

再次调用send()方法时将会报错。对于永远执行的生成器函数(while True),不要忘记使用最后的close()方法。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。