Python生成器中的发送功能

本教程将教授如何使用Python中生成器的send() 函数。

生成器的概述

你可以通过Python生成器函数制作一个像迭代器一样的函数,并可以在for 循环中使用。例如,我们将比较一个叫做first_n() 的方法的各种实现,该方法表示第一个n 非负整数。

由于n 是一个巨大的数字,我们将假设每个整数都需要大量的存储空间–比如说,每个10 megabytes来进行这种比较。

请记住,除非是巨大的整数,否则它们在现实生活中不会占用很多空间。因此,举例来说,你可以用128字节来表示一个309位的整数。

让我们考虑下面的例子。

def first_n(n):
    num, nums = 0, []
    while num < n:
        nums.append(num)
        num += 1
    return nums
sum_of_first_n = sum(first_n(1000000))

上面的代码做了一个求和函数,将数值相加到第一个n 数字。唯一的问题是,它积累了大量的内存。

记住,我们不能在我们的内存中保留高达10 兆字节的整数。所以为了解决这个问题,我们在Python中使用了生成器。

生成器有助于创建迭代器。我们可以通过下面的代码块来理解它。

def first_n(n):
    num, nums = 0, []
    while num < n:
        yield num
        num += 1
    return nums
print(sum(first_n(1000000)))

输出:

499999500000

上面的代码栅栏使用了迭代器执行的内存用例功能。

在Python生成器中使用send()

用于生成器-迭代器的send() 方法对生成器很有用。从Python 2.5版本开始,这个在PEP 342 中指定的函数就可以使用了。

send() 方法重新启动生成器,该方法还发送了一个值,该值将用于启动后续的产量。最后,进程(方法)返回由生成器产生的新值。

send() 方法类似于在没有值时使用next()None 是这个过程的另一个可能值。在这两种情况下,生成器都会将其操作转发给第一个return 语句。

让我们在下面的代码中探讨一下send() 这个函数。

def numberGenerator(n):
    number = yield
    while number < n:
        yield number
        number += 1
g = numberGenerator(10)
next(g)
print(g.send(5))

输出:

5

正如我们在上面的代码块中所看到的,在最后一行,我们在g 变量内发送数值5 ,确保生成器认为最后的输入是5

send() 函数向生成器变量发送最后一个可接受的值,它可以把这个值作为最后的输入。这样,我们就理解了生成器的工作原理和生成器的send() 函数的意义。