Python生成器
我们今天将研究python生成器。
Python生成器
Python生成器是有史以来最有用,最特殊的python函数之一。
我们可以使用python生成器将函数转换为迭代器。
Python Generator的基本结构
基本上,Python生成器是一个函数。
您可以将以下内容作为python生成器的基本结构。
#sample syntax of python generator def gereratorName(argument): #statements yield argument #statements #calling the generator variableName = gereratorName(10) print(variableName)
在上面的结构中,您可以看到,除了一个东西(即yield关键字)外,其他所有东西都像一个函数。
此关键字起着至关重要的作用。
只有使用yield,正常函数才能变成生成器。
普通函数返回一些值,生成器产生一些值。
生成器自动实现next()
和_iter_
。
Python生成器的编写方式与常规函数类似,但是只要它们想返回一些数据,就使用yield语句。
每次在生成器函数上调用next()时,生成器将从上次中断的地方继续(它会记住所有数据值以及上次执行的语句)。
了解Python生成器
现在,让我们学习上一代码的每一行。
第2行是带有参数的生成器的声明。
此参数是可选的。
这取决于实现生成器的程序员。
第3、5行提到可能还有其他一些语句。
第4行是上述程序的关键部分。
它说要根据语句中可能语句的某些条件"屈服"论据的价值。
第8行使用参数10调用生成器,第9行显示返回的生成器对象。
如果您运行上述程序,则它将输出以下内容,
<generator object gereratorName at 0x1019d6f10>
请注意,以上输出不是值。
实际上,它指示对象其中。
要获得实际值,您需要借助迭代器。
然后隐式地在对象上调用next()以获得下一个产生的值。
如果要不循环地打印生成的值,则可以在其上使用next()函数。
如果在上面的代码中再添加一行,如下所示。
print(next(variableName))
然后它将输出值10,该值作为参数传递并产生。
通过显式的next()调用获取Python Generator的值
现在看下面的程序,在这里我们显式调用生成器的next()函数。
#fruits is a generator which generates some fruit name def fruits(): yield "Mango" yield "Hymanfruit" yield "Banana" yield "Guava" #calling the generator fruit getfruits = fruits() print(next(getfruits)) print(next(getfruits)) print(next(getfruits)) print(next(getfruits))
在上面的代码中,您必须知道产生的值的确切数量。
否则,您将遇到一些错误,因为生成器函数fruits()不再生成任何值。
上面的代码将输出如下:
Mango Hymanfruit Banana Guava
通过隐式的next()调用获取Python Generator的值
您可以使用for循环获取生成器的值。
以下程序显示了如何使用for循环和生成器来打印值。
它将提供相同的输出。
#fruits is a generator which generates some fruit name def fruits(): yield "Mango" yield "Hymanfruit" yield "Banana" yield "Guava" #calling the generator fruit getfruits = fruits() for a in getfruits: print(a)
Python Generator的工作程序
现在,让我们看看发生器的实际工作方式。
普通函数在return语句后终止,但生成器不终止。
我们第一次调用该函数,它返回与迭代器一起产生的第一个值。
下次当我们调用生成器时,它将从之前暂停的位置恢复。
与正常功能不同,不是一次从生成器返回所有值。
这是发电机的特长。
它通过一次又一次地调用该函数来生成值,这在我们生成大量值时需要较少的内存。
猜测以下Python Generator程序的输出
让我们看看另一个代码。
如果您可以假设输出,那就是增益。
def timesTable(number): for i in range(1, 11): yield i * number i += 1 gettimes = timesTable(10) for a in gettimes: print(a)
记住range()
是一个内置的生成器,它会在上限内生成数字。