http://www.iteye.com/topic/587051
前段时间在读trac中wiki模块的源码的时候,发现了很多地方都使用了yiled这一关键词,
感觉是在需要返回某个值的地方通过yield来代替return,
不是很明白其用法,所以仔细研究下。
一个使用了yiled关键字的函数就不再是一个普通的函数了,而是一个生成器函数(generator function),
当函数被调用的时候将返回一个迭代器(iterator)。
所以下面将分别讲解迭代器和生成器这两个概念。
一. 迭代器(Iterator)
写道
迭代器是一个对象,它实现了迭代器协议,
一般需要实现如下两个方法
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
对于for语言大家可能都不陌生,我们很多时候需要对一些容器对象进行遍历就会使用到for循环:
-
l=[0,1,2,3,4,5,6]
-
foriinl:
-
printi
l是一个type为list的对象,这段for-in代码在运行的时候其实是调用了l的__iter__()函数,返回了一个实现了__next__()或next()(各个版本的python可能不一样,我试验的时候所使用的版本为2.6.2)的迭代器对象,每循环一次就会通过next取下一个元素。
当然我们完全没有必要先把所有的元素都算出来放到一个list里或者其他容器类里进行循环,这样比较浪费空间。
我们可以直接创建自己的一个迭代器。
-
-
-
''
-
-
classFib:
-
''
-
-
def__init__(self,max):
-
self.max=max
-
-
def__iter__(self):
-
self.a=0
-
self.b=1
-
returnself
-
-
defnext(self):
-
fib=self.a
-
iffib>self.max:
-
raiseStopIteration
-
self.a,self.b=self.b,self.a+self.b
-
returnfib
定义好了这个Fibonacci迭代器,我们就可以来使用它了。
-
fromfibonacci2importFib
-
forninFib(1000):
-
printn
当调用Fib(1000)的时候,将生成一个迭代器对象,每一次循环都将调用一次next取到下一个值。
所以我们可以看出迭代器有一个很核心的东西就是在循环中,迭代器可以记住之前的状态。
二.生成器
前面我们说了,任何使用了yield关键字的函数都不再是普通的函数了,我们还是来看实例吧,这样比较容易理解
-
deffib(max):
-
a,b=0,1
-
whilea<max:
-
yielda
-
a,b=b,a+b
这里简单的几行代码就实现了上面的迭代器类那么一大堆代码所实现的功能
使用的时候和上面很类似:
-
fromfibonacciimportfib
-
forninfib(1000):
-
printn
引文fib函数使用了yield所以它是一个生成器函数,当我们调用fib(1000)的时候它其实是返回了一个迭代器,且这个迭代器可以控制生成器函数的运行。
我们通过这个返回的迭代器的动作控制fib这个生成器函数的运行。
每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。
所以生成器的概念还是很简单的。
三.总结
1.for-in语句在底层都是对一个迭代器对象进行操作的
2.使用了yield关键字的函数就是一个生成器函数,被调用的时候生成一个可以控制自己运行的迭代器。
分享到:
相关推荐
一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器...带有yield的函数称为函数生成器 下面通过代码实现一个斐波那契数列(除第1个,第2个数外,其他的数都是前两个数相加) e
迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常...
主要介绍了Python 生成器,迭代,yield关键字,send()传参给yield语句操作,结合实例形式分析了Python生成器、迭代、yield关键字及异常处理相关操作技巧,需要的朋友可以参考下
文章目录Python 入门基础进阶迭代器&生成器前引python中for循环的机制迭代器和可迭代协议可迭代协议迭代器协议方法1方法2方法3为什么要使用for循环生成器Python中提供的生成器:生成器Generator:生成器函数生成器的...
另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器。 使用yield,可以让函数生成一个序列,该函数返回的对象类型是”generator”,通过该...
2.2 列表生成式语法规则2.2.1 生成式给出规则和范围2.2.2 for语句之后加入if语句2.2.3 for语句之前加入if语句2.2.4 多个参数2.2.4 多个for3 生成器3.1 使用()创建生成器3.2 使用yield创建生成器 1 迭代器 在...
生成器与迭代器的Objective-C实现,实现类似ES6/Python的yield语意,async异步块,支持在Objective-C/Swift项目中以同步风格编写异步代码,避免长回调链和Promise链.
例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() for n in [1, 10]: ...好了–正好趁机会稍微小结一下python里面的生成器。 迭代器(it
迭代器:初探 上一章曾经提到过,其实for循环是可用于任何可迭代的对象上的。实际上,对Python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及map内置...
本文实例讲述了Python迭代器与生成器用法。分享给大家供大家参考,具体如下: 迭代器,迭代的工具 什么是迭代器? 指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值 l=...
yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的)。 yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个...
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 生成器是特殊的迭代器 def gen_yield(): for i in range(1,10): for...
本文实例讲述了Python3.5迭代器与生成器用法。分享给大家供大家参考,具体如下: 1、列表生成式 通过列表生成式可以直接创建一个列表。代码:a = [i*2 for i in range(10)] #!/usr/bin/env python # -*- coding:utf...
生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器。 通过以下两种方式构建一个生成器: 1、通过生成器函数 2、生成器表达式 生成器函数: 函数 def func1(x): x += 1 return x print(func1(5...
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibonacci)數...
但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是“生成器和yield关键字”。我猜这对大多数新手Python程序员也是如此。 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字。...
生成器,可迭代对象,迭代器之间究竟是什么关系? 用一幅图来概括: 1.生成器 定义生成器 方式一: //区别于列表生成式 gen = [x*x for x in range(5)] gen = (x*x for x in range(5)) print(gen) //Out:...
一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 1|2判断是否可以迭代 可以使用 isinstance() 判断一个对象是否是 Itera