`
m4774411wang
  • 浏览: 112639 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

python yield和generators(生成器)

 
阅读更多

在python中,yield就是这样的一个生成器。

yield 生成器的运行机制
当 你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态。开始运行,直至出现yield语句,把参数给你,之后停下。如此反复 直至退出函数。(以上关于yield的描述,在后面列举一个简单的例子来解释这段话)。

yield的使用
在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器,它的执行会和其他普通的函数有很多不同,函数返回的是一个对象,而不是你平常 所用return语句那样,能得到结果值。如果想取得值,那得调用next()函数,如:

    c = h() #h()包含了yield关键字  
    #返回值  
   print  c.next() 

比如有的for in 操作的话,会自动的调用生成器的.next()方法。

每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。

下面,来看看以下的例子代码吧,是用来说明yield运行机制的。

#encoding=utf-8

def fib(max):
   a, b = 1, 1
   while a < max:
       yield a #generators return an iterator that returns a stream of values.
       a, b = b, a+b

for n in fib(15):
   print n
 

从前面的运行机制描述中,可以获知,程序运行到yield这行时,就不会继续往下执行。而是返回一个包含当前函数所有参数的状态的iterator对象。目的就是为了第二次被调用时,能够访问到函数所有的参数值都是第一次访问时的值,而不是重新赋值。

程序第一次调用时:

yield a #这时a,b值分别为1,1,当然,程序也在执行到这停止并且返回。

程 序第二次调用时: 从前面可知,第一次调用时,a,b=1,1,那么,我们第二次调用时(其实就是调用第一次返回的iterator对象的next()方法),程序跳到 yield语句处, 执行a,b = b, a+b语句,此时值变为:a,b = 1, (1+1) => a,b = 1, 2 程序继续while循环,当然,再一次碰到了yield a 语句,也是像第一次那样,保存函数所有参数的状态,返回一个包含这些参数状态的iterator对象。

等待第三次的调用。

通过上面的分析,可以一次类推的展示了yield的详细运行过程了!

分享到:
评论

相关推荐

    Python库 | generators-2018.3.10.2.tar.gz

    这个库很可能与Python中的生成器(generators)有关,这是Python语言中一个非常重要的特性。 生成器(generators)是Python中的一种特殊类型的迭代器,它们允许我们创建一个能够记住执行状态的函数,以便在后续调用...

    python列表生成式与列表生成器的使用

    Python中的列表生成式和列表生成器是两种不同的数据生成方式,它们在处理大量数据时具有重要的作用,特别是在节省内存资源方面。列表生成式简洁高效,而列表生成器则更加节省内存,适合处理大数据集。 **列表生成式...

    python-yield用法详解.pdf

    生成器和`yield`关键字是Python中非常重要的概念,掌握它们可以帮助开发者编写出更加优雅和高效的代码。 总之,在Python中使用`yield`创建生成器是一种非常有效的方法来处理大量数据或需要按需生成数据的情况。通过...

    Python的高级主题:生成器、装饰器和元编程.docx

    Python 高级主题:生成器、装饰器和元编程 生成器(Generators)是一种特殊的函数,它可以按需生成值,而不是一次性生成所有值。通过使用生成器,你可以节省内存并提高性能。生成器的工作原理是使用 yield 语句来...

    Python中的yield关键字做了什么.pdf

    在Python编程语言中,`yield`关键字扮演着非常特殊的角色,它是生成器(generators)的核心组成部分。生成器是Python中一种高效的迭代器实现方式,它们允许开发者在内存中逐个产生值,而不是一次性生成所有值,从而...

    Python中的yield关键字做了什么.docx

    在Python编程语言中,`yield`关键字是一个非常重要的特性,它与生成器(generators)紧密相关,而生成器又是一种特殊的迭代器(iterables)。理解`yield`的工作原理对于高效地处理大量数据和节省内存资源至关重要。 ...

    Python-Generators-Exercise:一个Python程序,可以更好地了解生成器并进行实验

    这个"Python-Generators-Exercise"项目显然是为了帮助开发者深入理解和实践Python生成器的工作原理。通过这个项目,我们可以探索如何利用生成器来节省内存、实现延迟计算以及创建复杂的迭代逻辑。 首先,让我们来...

    PyGen:Julia中的Python生成器,为所有人提供yield语句!

    在Python中,生成器通过`yield`语句实现,使得程序员可以方便地创建惰性计算、大序列以及处理流式数据。然而,Julia原生并不支持`yield`语句,这可能会让习惯于Python语法的开发者感到不便。"PyGen"项目正是为了弥补...

    PyPI 官网下载 | generators-2017.9.26.1.tar.gz

    总的来说,"generators-2017.9.26.1"库是对Python生成器功能的一种增强,它可以帮助开发者更好地利用生成器的特性,提高代码的性能和可读性。在实际项目中,熟练掌握生成器的使用可以显著提升代码的效率和质量,尤其...

    Python-3.7.1.tgz

    此外,Python 3.7 引入了异步生成器(async generators),这是一种结合了生成器和异步函数的特性。这使得在处理大量I/O密集型任务时,代码更加简洁且性能更优。异步生成器可以使用`async def`关键字定义,并通过`...

    Python高级讲义(二).rar

    3. **生成器(Generators)**:生成器是一种特殊的迭代器,它使用`yield`语句来暂停和恢复函数的执行。这使得生成器可以高效地生成大量数据,而无需一次性存储所有结果。例如,使用`yield`可以实现斐波那契数列、...

    Python3.5中async_await特性的实现.pdf

    随着Python 2.5的发布,通过PEP 342,生成器得到了增强,yield现在不仅可以产生值,还可以接收值,称为send()方法,同时也支持throw()和close()方法,让生成器可以更加灵活地与外界交互。这实际上就是协程的雏形。 ...

    Python-3.5.3.tgz

    在Python 3.5.3中,生成器可以使用`yield from`表达式来嵌套其他生成器,简化了代码并提高了效率。此外,生成器现在也可以通过`send()`方法接收值,增强了它们的交互性。 4. **字典(Dictionary)和集合(Set)...

    Python进阶(Intermediate Python) 中文PDF彩色版

    4. **生成器(Generators)**:生成器是Python中的迭代器,可以动态生成值,节省内存,尤其适合处理大数据流。书中会介绍如何定义生成器函数,以及如何使用`yield`关键字。 5. **异常处理(Exception Handling)**...

    Python官方2.2版本exe安装包

    3. **生成器(Generators)**:Python 2.2引入了生成器,这是一种特殊的迭代器,允许函数在执行过程中暂停并保存状态,从而实现了惰性计算和内存效率的提高。生成器通过`yield`关键字实现,这是Python编程中的一个...

    Python绝技中文版及源代码

    6. **生成器(Generators)**:生成器是Python中节约内存的迭代方式,通过yield关键字实现。书中可能有各种生成器的使用案例,包括使用生成器表达式。 7. **并发与异步编程**:Python的多线程、多进程和协程...

    Python 2.1宝典

    在高级特性中,装饰器(decorators)和生成器(generators)是Python 2.1中的亮点。装饰器允许我们修改或增强函数的行为,而无需改动函数本身。生成器则是一种特殊的迭代器,可以通过yield语句动态生成值,节省内存...

    Python进阶.pdf

    - 生成器是一种特殊的迭代器,使用`yield`语句实现,允许延迟计算和记忆状态。 - 生成器可以节省内存,尤其在处理大量数据时,因为它不需要一次性生成所有结果。 4. **Map和Filter**: - `map()`函数接受一个...

    Python迭代和迭代器详解

    生成器(Generators)是Python中构建迭代器的一种便捷方式。它们是特殊的函数,使用`yield`语句而不是`return`来暂停函数执行并返回一个值。生成器函数在执行时会创建一个迭代器对象,而无需显式地定义`__iter__`和`...

    pythonamd64python-3.7.2-amd64安装包

    2. **异步生成器 (Async Generators)**:支持异步生成器函数,使用 `async def` 定义,并可以通过 `yield` 语句发送和接收值。 3. **增强的类型注解**:提供了更多的类型注解选项,如 `Final`, `Literal`, `Protocol...

Global site tag (gtag.js) - Google Analytics