`
desert3
  • 浏览: 2160357 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Python generator和yield

阅读更多

generator产生器:a Python generator is a kind of Python iterator[1], but of an especially powerful kind.

yield生产:可以解读为"返回然后等待"。知道所有yield语句完成,这时如果再次调用next(),则发生StopIteration异常,当然,在for循环之类的语句中会被自动处理。

return:"返回并结束"

 

 

generator归根到底是一个函数的返回值,这个函数是包含“yield”关键字的python函数。

是不是可以这么说(不是很确定,似乎可以这么理解)
1,凡包含“yield”关键字的函数,都返回generator
2,generator不是函数,而是函数执行后构造的对象,是一种iterator。
3,generator可以像iterator一样的用。

generator的根源是PEP 255,其中列出了generator在Python存在的原因,简单的讲,Generator在需要时返回中间值,能够保存当前的状态,等待下一次的返回要求。

xrange/range的区别或许可以帮我们理解这一点,xrange之所以存在,是因为range需要一次完成列表的初始化,存储等等,从C的角度来 理解,就是,用range等于先malloc足够的内存,然后完成值的准备,等待调用(遍历等等)。而xrange则不这么干,什么时候要的时候,什么时 候给值。所以,在Python 2.x中,type(range(10))是一个List,是内存中的静态数据;而type(xrange(10))则是一个range type。

到Python 3.x,xrange彻底替代了range函数。

这样设计的目的无非就是节省内存 ,千八百数字的无所谓,但ython 2.x的long int和Python 3.x的Int是无限制(用官方语言来说就是可以占满内存)。

generator为了满足这种需求设计的,状态得到了保存,随取随算。

PEP 255有一句: a Python generator is a kind of Python iterator[1], but of an especially powerful kind.

Python的产生器就是一种迭代器...
因为它是一种迭代器,所以,他可以用到for等控制流中。

def gen():
print "one"
yield 1
print "two"
yield 2
print "three"
yield 3

type(gen)
type(gen())

可以看到gen是函数,而gen()是generator,应该说,函数gen执行的返回值是生成一个generator。

generator的方法之一就是next()。
a=gen()
a.next()
a.next()
a.next()
a.next()
三次next,分别返回了1,2,3,最后一次,已到达末尾,发生StopIteration错误。


而yield的作用就是,每次发生next()调用,函数执行完yield语句之后在挂起,这时返回yield的值(你原因yield啥就yield啥),整个函数状态被保存,等待下一次next()调用;
下次next()调用发生时,从yield后的语句开始执行(有yiled也在循环体内,未必一定是顺序的),直到再次遇到yield为止,然后重复删除动作。

yield 可以解读为"返回然后等待"。知道所有yield语句完成,这时如果再次调用next(),则发生StopIteration异常,当然,在for循环之类的语句中会被自动处理。

<--- XDICT英汉辞典 --->
yield
[jiːld]
n. 生产量,投资收益
vt. 生产,给予,同意,被迫放弃,放纵
vi. 出产,屈服,投降


在这里,当然是“生产”的意思。

PEP 255详细解释了为什么是"新关键字" yield,而不是return 变体等等的原因。

我想,一个简单的原因可能是return已经被大家清楚、牢靠的理解成了"函数的结束并返回“,而不是”返回并挂起“。

 

摘自:http://bbs.paulau.com.cn/redirect.php?tid=9&goto=lastpost&sid=fJFtF0

转自:http://hi.baidu.com/izouying/blog/item/d70b098200db2daa0cf4d2d1.html

 

分享到:
评论

相关推荐

    Python generator生成器和yield表达式详解

    在Python编程中,生成器(generator)和yield表达式是两个非常重要的概念,它们是迭代器协议的实现方式之一,使得程序员能够以更加高效和节省内存的方式处理数据流。 首先,我们来了解迭代器(Iterator)和可迭代...

    python之yield和Generator深入解析

    Python中的`yield`关键字和Generator是编程中一种高效、内存友好的数据生成方式。Generator是一种特殊的迭代器,它可以通过`yield`语句在运行时生成值,而不是一次性生成所有值。这种方式使得Generator可以在需要时...

    python yield和Generator函数用法详解

    Python中的`yield`关键字和Generator函数是Python编程中一种高效且节省内存的机制,它们用于创建迭代器。本文将深入探讨`yield`的工作原理以及如何使用Generator函数。 首先,让我们理解`yield`的关键作用。在普通...

    初步解析Python中的yield函数的用法

    在Python中,`yield`函数是生成器(generator)的核心组成部分,它允许函数成为一个可迭代的对象,而不是一次性返回所有结果。生成器是一种特殊的迭代器,它们不会立即计算所有的值,而是根据需要在运行时逐个生成。...

    python-yield用法详解.pdf

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

    Python yield 使用浅析

    初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和...

    python中的yield使用方法

    今天在看其他同事的代码时,发现一个没使用过的python关键字 :yield  先问了一下同事,听他说了几句,有个模糊的印象,... 你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普

    python中yield的用法.docx

    Python中的`yield`关键字是其语法的一大特色,它在生成器(Generator)中扮演着核心角色。生成器是一种特殊的迭代器,它允许我们定义一个函数,该函数可以在执行过程中暂停并保存状态,以便下次调用时能从暂停的地方...

    python 如何区分return和yield

    另一方面,`yield`关键字在Python中用于生成器(generator)函数,它返回一个生成器对象,该对象能够记住函数当前的执行状态,之后能够从上次离开的位置继续执行。每次遇到`yield`时,函数生成一个值并暂停执行,...

    Python中yield返回生成器的详细方法.pdf

    在Python编程语言中,`yield`关键字是用来创建生成器(generator)的重要工具,它与`return`类似但有所不同。生成器是一种特殊的迭代器,能够节省内存资源,因为它们不一次性生成所有值,而是按需生成。这篇文档主要...

    python中yield的用法详解1

    在Python编程语言中,`yield`关键字是一种特殊的功能,它被用于创建生成器(generator)。生成器是一种特殊的迭代器,可以动态地生成值,而无需一次性加载所有数据。这种特性在处理大量数据或无限序列时非常有用,...

    python中yield的用法详解——最简单,最清晰的解释

    3. **生成器(Generator)**:一种特殊的迭代器,由带有`yield`关键字的函数创建。生成器函数不会立即执行其内部代码,而是返回一个可以迭代的对象。每当调用`next()`或`send()`方法时,函数从上次暂停的位置继续执行...

    深入学习python的yield和generator

    Python中的`yield`和`generator`是编程语言中一种高效且节省内存的机制,它们主要用于创建迭代器。本文将深入探讨这两个概念以及如何在Python中使用它们。 首先,生成器是一种特殊的迭代器,它能够在运行时动态生成...

    Python 中由 yield 实现异步操作

    `yield` 是 Python 中的一个强大特性,主要用于创建生成器(generator)。生成器是一种特殊的迭代器,它允许我们像列表那样迭代值,但并不需要一次性将所有值加载到内存中。与普通的函数不同,`yield` 关键字使得...

    对python中return与yield的区别详解

    在Python编程语言中,`return` 和 `yield` 都是用来在函数中返回值的关键字,但它们之间存在显著的区别,这些差异对于理解和编写高效的代码至关重要。 首先,`return` 关键字用于从函数中返回一个值。当 `return` ...

Global site tag (gtag.js) - Google Analytics