关于Python中的yield

原创 2016年08月29日 12:50:16

http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html


关于Python中的yield

在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。

使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:


1
2

for line in open("test.txt").readlines():
print line

这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。

利用file的迭代器,我们可以这样写:


1
2

for line in open("test.txt"):   #use file iterators
print line

这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。

二、生成器(constructor)

生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。

不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效


1
2
3
4
5
6
7
8

>>> def g(n):
... for i in range(n):
... yield i **2
...
>>> for i in g(5):
... print i,":",
...
0 : 1 : 4 : 9 : 16 :

要了解他的运行原理,我们来用next方法看看:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

>>> t = g(5)
>>> t.next()
0
>>> t.next()
1
>>> t.next()
4
>>> t.next()
9
>>> t.next()
16
>>> t.next()
Traceback (most recent call last):
File "", line 1, in <</span>module>
StopIteration

在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。
再来看一个yield的例子,用生成器生成一个Fibonacci数列:


1
2
3
4
5
6
7
8
9
10

def fab(max):
a,b = 0,1
while a <</span> max:
yield a
a, b = b, a+b
 
>>> for i in fab(20):
... print i,",",
...
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,

看到这里应该就能理解生成器那个很抽象的概念了吧~~

感觉跟递归很像。


下面我们用yield来读文件:

随便建一个文件类似

1

2

3

一般我们读文件可以这样读

def read(file):

        with open(file) as f:

                for line in f.readlines():

                        print line

if __name__ == '__main__':

read("inputFile.txt")

但其实readlines这样子一下全读进来了,占内存。

我们用yield读

def read(file):

        with open(file) as f:

                for line in f:

                        yield line.strip()



if __name__ == '__main__':

        reader = read("inputFile.txt")

        line = reader.next()

        while line:

                line = reader.next()

                print line


或者这样
def read(file):
        with open(file) as f:
                for line in f:
                        yield line.strip()


if __name__ == '__main__':
        reader = read("inputFile.txt")
        for line in reader:
                print line

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

python 之 yield

yield   用for循环调用可迭代的函数 ____________________________________________________________________ 包...

python---深入理解yield

原文地址: http://www.pythontab.com/html/2015/pythonhexinbiancheng_0415/946.htmlyield的英文单词意思是生产,刚接触Pytho...

python中yield语句详解——译自stack overflow

原题目链接:http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python翻译水平一般…请见谅…原...

[转]Python yield 使用浅析

原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/初学 Python 的开发者经常会发现很多 Python 函...

Python中的yield是如何使用的

[注:文中代码在Python3.5中运行通过] yield是Python中的关键字,带有yield的函数被称为生成器(generator)。 先来看一个使用yield的例子: def gen...

Python yield 用法

yield 用法说明 yield 简单说来就是一个生成器,生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的...

[Python]yield用法入门

包含yield表达式的函数是特殊的函数,叫做生成器函数(generator function),被调用时将返回一个迭代器(iterator),调用时可以使用next或send(msg)。它的用法与re...

Python yield 使用浅析

您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...

python iterator generator yield

个人理解,欢迎指正 1、iterator container.__iter__() Return an iterator object. The object is required to suppo...

关于Python中的yield

在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。 一、迭代器(iterator) 在Python中,for循环可以用于Pyth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)