Python生成器

时间:2020-02-23 14:42:44  来源:igfitidea点击:

我们今天将研究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()是一个内置的生成器,它会在上限内生成数字。