从零开始学python | 什么是Python中的生成器以及如何使用它们?

举报
Yuchuan 发表于 2021/04/17 22:58:11 2021/04/17
【摘要】 确保尽可能多地练习并恢复经验。  

生成可迭代的对象或可迭代对象被认为是一项繁重的任务。但是,在Python中,这项艰巨任务的实现变得非常顺利。因此,让我们继续深入研究Python中的Generators。

这是本文涵盖的所有主题的列表:

因此,让我们开始吧。:)

什么是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)

输出:

Python-Edureka中的StopIteration-Generators

上图显示了我们程序执行所需的次数。如果尝试再次调用下一个函数,它将返回一条消息,说明StopIteration已实现。如果尝试使用常规函数执行此操作,则返回的值将不会更改或迭代。看下面的例子:

例子:

def z():
    n=1
    yield n
    n=n+3
    yield n
p=z()
next(p)

输出:

Python-Edureka中的StopIteration2-Generators

带有循环的生成器:

如果您想一次执行相同的功能,可以使用“ 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生成器的本文结尾。希望您已理解所有主题。

确保尽可能多地练习并恢复经验。  

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。