python源代码中经常会有使用yield,带有yield的函数是generator(生成器),它返回是一个迭代值,下面我们分析yield是什么原理,有什么好处?

首先,我们写一个简单的斐波那契数列前n项值得方法:

def fab(max):
n,a,b=,,
while n<max:
print b
a,b=b,a+b
n=n+
fab()
input()

函数输出1  1  2  3  5  没有问题,但是该方法没有返回值,复用性太差了,我们希望得到有返回结果的方法。

修改如下:

def fab(max):
n,a,b=,,
result=[]
while n<max:
result.append(b)
a,b=b,a+b
n=n+
return result
print fab()
input()

返回[1,1,2,3,5]的list,这样我们就可以方便的用它的结果了,但是当max很大时,对内存是一个很大的开销,并不是一个好的方法,怎么办呢?这就要用到迭代器的知识了,返回一个迭代变量是更好的选择。

例如 for i in range(100):pass  会导致生成一个100个元素的list;

  for i in xrange(100):pass  不会产生100个元素的list,而是每次返回一个iterable对象,只有上一个数据用完之后才生成下一个,每次只返回一个,所以减小了内存开销。

利用iterable我们可以把fab()方法写成一个支持iterable的class,如下:

class Fab(object):
def __init__(self,max):
self.max=max
self.n,self.a,self.b=,,
def __iter__(self):
return self
def next(self):
if self.n<self.max:
r=self.b
self.a,self.b=self.b,self.a+self.b
self.n=self.n+
return r
raise StopIteration()
fab=Fab()
for n in fab:
print n
input()

这样就实现了迭代器的返回方法,但是代码太多,不够简洁,这时候yield就用上了。

def fab(max):
n,a,b=,,
while n<max:
yield b
a,b=b,a+b
n=n+
for i in fab():
print i
input()

这样就实现了。

yeild的原理:一个带有yield的函数就是一个generator生成器,和普通的函数不一样。只有调用next()函数的时候才会执行函数语句,在for循环中会自动调用next()方法。函数执行过程中遇到一个yield会中断一次,返回一个迭代值,函数保存自己的变量和状态,下次迭代时(也就是下次next()的时候)从yield下一条语句继续执行(这个性质很重要),函数恢复之前状态,直到遇到下一个yield返回迭代值,这样循环。

可以用

f=fab(5)

fab.next()不断测试来分析它的原理。

理解python yield的更多相关文章

  1. 深入理解 Python yield

    https://blog.csdn.net/lftaoyuan/article/details/78915518 python2和python3是不兼容的,通篇环境都是python3.6 简单的yie ...

  2. 深入理解Python中的yield和send

    send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...

  3. 彻底理解Python中的yield

    阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结: 通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文 ...

  4. 【Python注意事项】如何理解python中间generator functions和yield表情

    本篇记录自己的笔记Python的generator functions和yield理解表达式. 1. Generator Functions Python支持的generator functions语 ...

  5. 理解Python中的yield

    1.通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.它可以是mylist = [1, 2, 3],也可以是mylist = [x*x ...

  6. 深入理解python中的yield关键字

    想必大家都看过这样的代码: 上面的这段代码会计算0-9的平方并打印出来. 那么问题来了,这段代码和我们要说的东西有什么区别呢? 这里的关键字,yield,我在前面的文章里已经发过了.那么yield是什 ...

  7. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  8. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  9. 深入理解Python异步编程(上)

    本文代码整理自:深入理解Python异步编程(上) 参考:A Web Crawler With asyncio Coroutines 一.同步阻塞方式 import socket def blocki ...

随机推荐

  1. Python文件操作,异常语法

    1.文件 2.异常 1.文件的输入输出 #1.打开文件 open 函数open(file,[option])#file 是要打开的文件#option是可选择的参数,常见有 mode 等​#2.文件的打 ...

  2. Quartz中Cron详解

    Quartz中的cron跟Linux系统的cron定义不太一样(Linux从分开始) 特殊字符: * 用来表示包含一个范围内的任意值. 例如, 分钟位置的“*” 表示 “每分钟”. ?  当不特定指代 ...

  3. css animation fade in

    <html> <style> @-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}} @-o-keyframes fad ...

  4. vue父子组件通信(prop)

    先定义子组件,注册prop接收父组件传递的值 <template> <div> <div>{{message}}(子组件)</div> </div ...

  5. SpringMVC---彻底解决/和/*的问题!到底该用哪一个?

    出处: https://blog.csdn.net/sinat_33921105/article/details/81951156 在web开发中我们经常会遇到/和/*的问题,有的时候稍不注意就容易忘 ...

  6. Mybatis学习笔记12 - 动态sql之choose(when otherwise)标签

    choose (when, otherwise):分支选择:带了break的swtich-case 示例代码: 接口定义: package com.mybatis.dao; import com.my ...

  7. Django-5.1 模型层 单表操作

    7.1 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开 ...

  8. Android NDK开发 Android Studio使用新的Gradle构建工具配置NDK环境(一)

    本文主要讲述了如何如何在Android Studio使用新的Gradle构建工具配置NDK环境,现在把相关的步骤整理出来分享给Android程序员兄弟们,希望给他们在配置NDK环境时带来帮助. 从An ...

  9. [转]Knockoutjs快速入门

    本文转自:http://www.cnblogs.com/yinzixin/archive/2012/12/21/2827356.html Knockoutjs是一个JavaScript实现的MVVM框 ...

  10. [转]jquery.pagination.js分页

    本文转自:http://www.cnblogs.com/knowledgesea/archive/2013/01/03/2841554.html 序言 这一款js分页使用起来很爽,自己经常用,做项目时 ...