Python中yield的理解
来源:互联网 发布:网络盗刷犯罪侦破 编辑:程序博客网 时间:2024/05/16 07:50
一个使用了yiled关键字的函数就不再是一个普通的函数了,而是一个生成器函数(generator function),当函数被调用的时候将返回一个迭代器(iterator)。
所以下面将分别讲解迭代器和生成器这两个概念。
一. 迭代器(Iterator)
一般需要实现如下两个方法
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
对于for语言大家可能都不陌生,我们很多时候需要对一些容器对象进行遍历就会使用到for循环:
mylist = [0,1,2,3,4,5,6] for item in mylist: print item
mylist是一个type为list的对象,这段for-in代码在运行的时候其实是调用了mylist的__iter__()函数,返回了一个实现了__next__()或next()的迭代器对象,每循环一次就会通过next取下一个元素。
当然我们完全没有必要先把所有的元素都算出来放到一个list里或者其他容器类里进行循环,这样比较浪费空间。
我们可以直接创建自己的一个迭代器。
# -*- coding: utf-8 -*- '''''Fibonacci iterator''' class Fib: '''''一个可以生成Fibonacci 数列的迭代器''' def __init__(self, max): self.max = max def __iter__(self): self.a = 0 self.b = 1 return self def next(self): fib = self.a if fib > self.max: raise StopIteration self.a, self.b = self.b, self.a + self.b return fib
定义好了这个Fibonacci迭代器,我们就可以来使用它了。
from fibonacci2 import Fib for n in Fib(1000): print n
当调用Fib(1000)的时候,将生成一个迭代器对象,每一次循环都将调用一次next取到下一个值。
所以我们可以看出迭代器有一个很核心的东西就是在循环中,迭代器可以记住之前的状态。
二.生成器
前面我们说了,任何使用了yield关键字的函数都不再是普通的函数了,我们还是来看实例吧,这样比较容易理解
def fib(max): a, b = 0, 1 while a < max: yield a a, b = b, a + b
这里简单的几行代码就实现了上面的迭代器类那么一大堆代码所实现的功能
使用的时候和上面很类似:
from fibonacci import fib for n in fib(1000): print n
fib函数使用了yield所以它是一个生成器函数,当我们调用fib(1000)的时候它其实是返回了一个迭代器,且这个迭代器可以控制生成器函数的运行。
我们通过这个返回的迭代器的动作控制fib这个生成器函数的运行。
每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。
所以生成器的概念还是很简单的。
三.总结
1.for-in语句在底层都是对一个迭代器对象进行操作的
2.使用了yield关键字的函数就是一个生成器函数,被调用的时候生成一个可以控制自己运行的迭代器。
- Python中yield的理解
- Python中对于yield的个人理解
- Python Scrapy中yield Request的理解
- Python中yield的简单理解
- Python yield 的理解
- python中yield深入理解
- Python的yield相关理解
- Python中yield的用法
- Python中yield的用法
- python中yield的用法
- Python中yield的用法
- Python中yield的用法
- python中yield的作用
- python中yield的使用
- python中yield的使用方法
- Python中yield的用法
- python中yield的使用
- python中yield的用法
- iOS获取用户位置
- 每日一题(21) - 编写memmove 函数
- 贪吃蛇 C++ 代码
- Git 教學(1) : Git 的基本使用
- C#中HashTable的用法
- Python中yield的理解
- excel bom
- android系统如何在静音模式下关闭camera拍照声音(2)
- Servlet路径映射配置
- Spring 开发简单项目实战
- Ubuntu配置Java环境变量
- vs2010 MFC +win7下的程序 在win7上正常运行,XP就出错(ADO数据库连接出错)
- 以两种因素的差值为贪心策略的问题
- rank() within group()用法