python 中yield的用法详解,pythonyield,包含了关键字"yield
python 中yield的用法详解,pythonyield,包含了关键字"yield
包含了关键字"yield"的函数就不是普通的函数。当含有这个关键字的函数被调用的时候,这个函数在遇到yield的时候会停止运行,并且返回一个迭代器(iterator)。每次请求一个值,就会执行生成的代码。直到遇到一个yield或者return。首先,我们先了解什么是迭代器。
lst=[1,2,3,4,5]for i in lst print i
从这个例子我们可以看的出来,每循环一次i的值就会指向列表的下一个元素,大家认为这是正常的,那么为什么i会得到列表的下一个元素呢?其实在for的循环中列表就使用了迭代器。每一次循环迭代器就使用next方法返回一个值。当然这个迭代是隐形的,大家是看不见的。我们可以实现一个可迭代的函数。
#!/ust/bin/env pythonclass IterExample(): def __init__(self): self.a = 0 def next(self): self.a += 1 if self.a > 10:raise StopIteration return self.a def __iter__(self): return selfie = IterExample()for i in ie: print i
上面的列表默认已经具备了迭代方法,不用我们实现。如果一个函数不是可迭代的那是不能用在循环里的。下面我们来解决yield其实这个很简单。只不过大家看的例子复杂了。看看下面的例子你立刻就会理解它。
#!/usr/bin/env python#__metaclass__ = typedef gen(): print 'enter' yield 1 print 'next' yield 2 print 'next again'for i in gen(): print i#########################
这个例子打印如下:
enter1next2next again;我来解释一下这个程序:首先大家要知道为什么这个函数可以用在for循环中。不用问,因为这个函数是可迭代的,也就是这个函数可以每次都返回一个值。但是我们在gen()函数里看不到__iter__()和next() 方法。其实它隐藏在yield里。高级语言就是这样,隐藏了好多东西。这个和c语言就不同了。C语言可以看到每个细节。在这里程序执行到yield 1;的时候就停止了,下面的程序不再执行,然后返回一个值“1”.当下一个for的之后程序接着往下执行到yeild 2;。程序停止执行,然会返回一个值“2”。但是还有一个问题就是,最后yield下面的"next again;" 会打印出来呢?这也可能就是在执行完最后一个yield 的时候,for i; in; gen;()的时候, 发生了一些什么动作,导致最后一个yield后面的代码也被执行了。如果我们修改一下这个程序如下:
#!/usr/bin/env python#__metaclass__ = typedef gen(): print 'enter' yield 1 print 'next' return print 'next 2' yield 2 print 'next 3'for i in gen(): print i#######################
程序打印如下:enter1next看明白了这就是yield和return的区别。yield可以向下运行。而return返回后这个函数余下的部分就不能执行了。
相关内容
- python带模块里延迟导入名字,python模块,#!/usr/bin/e
- 在python脚本内运行linux命令,pythonlinux,#/usr/bin/en
- 一个简单python ftp客户端代码,pythonftp客户端,#!/usr/bin
- python字典复制演示代码,python字典演示,L = [1,2,3]D
- python获取数组元素个数,python获取数组,# Return the
- python通过加号运算符操作列表,python加号,li = ['a', '
- python修改字典内key对应的值,python字典key对应,d2 = {'s
- 一个python实现的employee类,python实现employee,'''Class_Str
- Python统计文件夹下所有文件名与内容,,#!/usr/bin/e
- python从任意文件读取邮件地址输出,,# Hello, thi
评论关闭