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()
函数的意义。