Python 生成器函数

Python 提供了一个生成器来创建自己的迭代器函数。 生成器是一种特殊类型的函数,它不返回单个值,而是返回一个包含一系列值的迭代器对象。 在生成器函数中,使用yield语句,而不是返回语句。 下面是一个简单的生成器函数。

Example: Generator Function

def mygenerator():
    print('First item')
    yield 10

    print('Second item')
    yield 20

    print('Last item')
    yield 30 

在上面的例子中,mygenerator()函数是一个生成器函数。它使用yield而不是 return 关键字。 因此,这将在每次调用yield关键字时返回该值。但是,您需要为此函数创建一个迭代器,如下所示。

Example: next()

>>> gen = mygenerator() 
>>> next(gen) 
First item 
10                      
>>> next(gen) 
Second item 
20                      
>>> next(gen) 
Last item 
30 

生成器函数不能包含return关键字。如果包含它,那么它将终止函数。 yieldreturn的区别在于yield返回值并暂停执行,同时保持内部状态,而return语句返回值并终止函数的执行。

以下生成器函数包含 return 关键字。

Example: return in Generator Function

def mygenerator():
    print('First item')
    yield 10

    return

    print('Second item')
    yield 20

    print('Last item')
    yield 30 

现在,如下所示执行上述功能。

Example: Generator Function

>>> gen = mygenerator() 
>>> next(gen) 
First item 
10                      
>>> next(gen) 
Traceback (most recent call last):
        File "<pyshell#13>", line 1, in <module>

                it.__next__()
                StopIteration 

如您所见,上面的生成器在获取第一项后停止执行,因为 return 关键字是在yield获取第一项后使用的。

用于具有生成器功能的循环

生成器函数也可以使用 for循环。

Example: Use For Loop with Generator Function

def get_sequence_upto(x):
    for i in range(x):
        yield i 

如上图所示,get_sequence_upto函数使用了yield关键字。 发电机的调用就像正常功能一样。 然而,当遇到yield关键字时,其执行被暂停。这将迭代器流的第一个值发送到调用环境。但是,局部变量及其状态保存在内部。

上面的生成器函数get_sequence_upto()可以如下调用。

Example: Calling Generator Function

>>> seq = get_sequence_upto(5) 
>>> next(seq) 
0                      
>>> next(seq) 
1                      
>>> next(seq) 
2                      
>>> next(seq) 
3                      
>>> next(seq) 
4                                                          
>>> next(seq)                                     
Traceback (most recent call last):
        File "<pyshell#13>", line 1, in <module>

                it.__next__()
                StopIteration 

当向迭代器对象发出 next() 时,该函数恢复。当next()遇到StopIteration错误时,该功能最终终止。

在下面的例子中,函数square_of_sequence()充当一个生成器。它在每次调用 next() 时连续产生一个数字的平方。

Example:

def square_of_sequence(x):
    for i in range(x):
        yield i*i 

下面的脚本显示了如何调用上面的生成器函数。

gen=square_of_sequence(5)
while True:
    try:
        print ("Received on next(): ", next(gen))
    except StopIteration:
        break 

上面的脚本使用try..except块来处理StopIteration错误。一旦捕捉到StopIteration错误,它将中断 while循环。

Output

Received on next(): 0
Received on next(): 1
Received on next(): 4
Received on next(): 9
Received on next(): 16 

我们可以使用 for循环遍历生成器上的元素。在这种情况下,next()函数被隐式调用,StopIteration也被自动处理。

Example: Generator with the For Loop

squres = square_of_sequence(5)
for sqr in squres:
    print(sqr) 

Output

0
1
4
9
16 

*Note:*One of the advantages of the generator over the iterator is that elements are generated dynamically. Since the next item is generated only after the first is consumed, it is more memory efficient than the iterator. *## 生成器表达式

Python 还提供了一个生成器表达式,这是定义简单生成器函数的一种更短的方式。生成器表达式是匿名生成器函数。以下是square_of_sequence()函数的生成器表达式。

Example: Generator Expression

>>> squres = (x*x for x in range(5))
>>> print(next(squre))              
0                                            
>>> print(next(squre))              
1                                            
>>> print(next(squre))              
4                                            
>>> print(next(squre))              
9                                            
>>> print(next(squre))              
16 

在上面的例子中,(x*x for x in range(5))是一个生成器表达式。表达式的第一部分是yield值,第二部分是带有集合的 for循环。

生成器表达式也可以在函数中传递。它应该不带括号传递,如下所示。

Example: Passing Generator Function

>>> import math
>>> sum(x*x for x in range(5)) 
30 

在上面的例子中,一个没有括号的生成器表达式被传递到内置函数sum中。***

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/231654.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-11 01:05
下一篇 2024-12-11 01:05

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29

发表回复

登录后才能评论