从零开始学python | 什么是Python中的生成器以及如何使用它们?
生成可迭代的对象或可迭代对象被认为是一项繁重的任务。但是,在Python中,这项艰巨任务的实现变得非常顺利。因此,让我们继续深入研究Python中的Generators。
- What are Generators?
- Advantages of using Generators
- Normal Functions vs Generator Functions
- Using Generator Functions
- Generators with loops
- Generator Expressions
- Use Cases
因此,让我们开始吧。:)
什么是Python中的生成器?
生成器基本上是返回可遍历对象或项目的函数。这些功能不会一次生成所有项目,而是一次仅在需要时才一次生成它们。每当包含for语句以迭代一组项目时,就会运行生成器函数。发电机也有许多优点。
Advantages of using Generators
-
如果在Python中没有生成器,则生成可迭代项将非常困难且冗长。
-
生成器易于实现,因为它们会自动实现__iter __(),__next __()和StopIteration,否则需要明确指定它们。
-
与普通的Python函数不同,在需要时根据项目的产生保存了内存。当您需要创建大量的迭代器时,这一事实变得非常重要。这也被认为是发电机的最大优势。
-
可用于生产无限数量的物品。
-
它们还可以用于管道许多操作
普通函数与生成器函数:
Python中的生成器的创建方式与使用'def'关键字创建普通函数的方式相同。但是,生成器函数使用yield关键字而不是return。这样做是为了通知解释器这是一个迭代器。不仅如此,生成器函数在调用next()函数时运行,而不是像正常函数那样通过其名称运行。考虑以下示例以更好地理解它:
例子:
def func(a):
yield a
a=[1,2,3]
b=func(a)
next(b)
输出:[1、2、3]
如您所见,在上面的输出中,func()正在使用yield关键字和下一个函数来执行它。但是,对于正常功能,您将需要以下代码:
例子:
def func(a):
return a
a=[1,2,3]
func(a)
输出:[1、2、3]
如果看上面的示例,您可能想知道为什么当普通函数也返回相同的输出时为什么使用Generator函数。因此,让我们继续前进,看看如何在Python中使用Generators。
使用生成器功能:
如前所述,Python中的生成器一次生成一个可迭代的对象。看下面的例子:
例子:
def myfunc(a):
while a>=3:
yield a
a=a+1
b = myfunc(a)
print(b)
next(b)
执行以下功能时,将看到以下输出:
输出:4
此处,已返回一个满足while条件的可迭代对象。执行后,控制权将转移到调用方。如果需要更多项目,则需要通过调用next()函数来再次执行相同的函数。
next(b)
输出:5
在进一步执行时,该函数将返回6,7等。Python中的Generator函数自动实现__iter __()和__next __()方法。因此,您可以仅使用next()方法来遍历对象。当项目生成终止时,Generator函数将在内部实现StopIteration,而不必担心调用方。这是另一个例子:
例子:
a=2
def myfunc(a):
while a >= 0:
yield a
a -= 1
b = myfunc(a)
print(b)
next(b)
输出:
上图显示了我们程序执行所需的次数。如果尝试再次调用下一个函数,它将返回一条消息,说明StopIteration已实现。如果尝试使用常规函数执行此操作,则返回的值将不会更改或迭代。看下面的例子:
例子:
def z():
n=1
yield n
n=n+3
yield n
p=z()
next(p)
输出:
带有循环的生成器:
如果您想一次执行相同的功能,可以使用“ for”循环。该循环有助于迭代对象,并在所有实现之后执行StopIteration。
例子:
def z():
n=1
yield n
n=n+3
yield n
for x in z():
print(x)
输出:
1
4
您还可以指定表达式以生成可迭代的对象。
生成器表达式:
您还可以将表达式与for循环一起使用以生成迭代器。这通常使生成代数变得容易得多。生成器表达式类似于列表推导,并且类似于lambda函数,生成器表达式创建匿名生成器函数。
看下面的例子:
例子:
a=range(6)
print("List Comprehension", end=':')
b=[x+2 for x in a]
print(b)
print("Generator expression", end=':n')
c=(x+2 for x in a)
print(c)
for y in c:
print(y)
输出:
列表理解:[2、3、4、5、6、7]
生成器表达式:
<生成器对象<genexpr>位于0x0000016362944480>
2
3
4
5
6
如您所见,在上面的输出中,第一个表达式是列表理解,该列表理解在[]括号内指定。列表理解一次生成完整的项目列表。下一个是生成器表达式,该表达式一次返回相同的项,但一次返回一个。使用()括号指定。
例子:
a=range(6)
print("Generator expression", end=':n')
c=(x+2 for x in a)
print(c)
print(min(c))
输出:
生成器表达式
2
当上面的表达式应用于a的值时,上面的程序将打印最小值。
用例:
让我们在Python中使用Generators来:
- 生成斐波那契数列
- 产生数字
生成斐波那契数列:
众所周知,斐波那契数列是一个数字序列,其中每个数字都是前面两个数字的和。前两个数字是0和1。这是一个生成斐波那契数列的生成器程序:
def fibo():
first,second=0,1
while True:
yield first
first,second=second,first+second
for x in fibo():
if x>50:
break
print(x, end=" ")
输出:
0 1 1 2 3 5 8 13 21 34
上面的输出显示了值小于50的斐波那契数列。现在让我们看一下如何生成数字列表。
生成号码:
如果要生成指定的列表号,可以使用生成器函数来完成。看一下下面的例子:
例子:
a=range(10)
b=(x for x in a)
print(b)
for y in b:
print(y)
输出:
<生成器对象<genexpr>位于0x000001CBE1602DE0>
0
1
2
3
4
5
6
7
8
9
例子:
a=range(2,10,2)
b=(x for x in a)
print(b)
for y in b:
print(y)
输出:
<生成器对象<genexpr>位于0x000001CBE1623138>
2
4
6
8
上面的程序返回了2到10之间的偶数。这使我们到了Python生成器的本文结尾。希望您已理解所有主题。
- 点赞
- 收藏
- 关注作者
评论(0)