想必大家都看过这样的代码:

上面的这段代码会计算0-9的平方并打印出来。

那么问题来了,这段代码和我们要说的东西有什么区别呢?

这里的关键字,yield,我在前面的文章里已经发过了。那么yield是什么呢?要理解yield,还得从容器说起。

容器(container)

象列表(list),集合(set),元组(tuple)--又叫序列,字典(dict)都是容器。简单的说,容器是一种把多个元素组织在一起的数据结构,可以逐个迭代获取其中的元素。容器可以用in来判断容器中是否包含某个元素,如:

大多数的容器都是可迭代对象,可以使用某种方式访问容器中的每一个元素(详情见生成器迭代器)

迭代器内容详见之前博客

生成器和yield

生成器其实是一种特殊的迭代器,但是不需要象迭代器一样实现__iter__和__next__方法,只需要使用关键字yield就可以

我们用生成器时间一个斐波那契数列:

输出:

上面的fib函数中没有return关键字。当运行f = fib()的时候,它返回的是一个生成器对象。在调用fib()的时候并不会运行fib函数中的代码,只有在调用next()的时候才会真正运行其中的代码。

那么回到最开始的问题,两种方式有什么区别?

其实,使用生成器调用函数的时候不会一次性生成所有的元素,而在每次调用next()才生成一个元素;而另一种方式,在调用函数的时候就生成了所有元素,相比之下,更耗费内存和CPU

那么,看到这里,大家是不是理解了yield关键字呢?

深入理解python中的yield关键字的更多相关文章

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

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

  2. 解析Python中的yield关键字

    前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i i ...

  3. python中的yield关键字

    yield关键字一直困扰了我很久,一直也没有弄明白,现在将暂时理解的yield记录如下,供参考: 关键词:可迭代对象,生成器,迭代器 一.可迭代对象: 可迭代对象:可迭代对象是一个泛称,只要可以用fo ...

  4. 彻底理解Python中的yield

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

  5. 理解Python中的yield

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

  6. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

  7. [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式

    使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...

  8. Python:笔记(7)——yield关键字

    Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...

  9. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

随机推荐

  1. 【Xmail】使用Xmail搭建局域网邮件服务器

    下载地址:  http://www.xmailserver.org/xmail-1.27.win32bin.zip,当前最新版本  1.27. 解压文件:xmail-1.27.win32bin.zip ...

  2. [codeup] 2044 神奇的口袋

    题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...

  3. Winform开发全套31个UI组件开源共享

    一.前言 这套UI库是上一个公司(好几年前了)完成的.当时主要为开发公司内部ERP系统,重新设计实现了所有用到的Winform组建,包括Form窗体组建6个(支持换肤),基础控件25个.其中有很多参考 ...

  4. clipboard.js实现复制功能

    项目地址:https://github.com/zenorocha/clipboard.js 现代化的“复制到剪切板”插件.不包含 Flash.gzip 压缩后仅 3kb. 为什么使用它 复制文字到剪 ...

  5. 1.1 JAVA装箱和拆箱以及Java Number & Math&Character 类

    JAVA装箱和拆箱 从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了.原文链接: http://www.cnblogs.com/dolph ...

  6. scala 编程思想—学习笔记

    方法 方法是打包在某个名字下的小程序.在使用方法时,也就是调用方法时就会执行 这个小程序.方法将一组活动组合起来并赋予一个名字,这就是组织程序的最基本方式. scala 中方法的基本形式为 def m ...

  7. JS实现继承的几种方式以及优缺点(转载)

    前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...

  8. POJ3087(KB1-G 简单搜索)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10366   Accepted: 4800 Des ...

  9. 纯web实现游记类手机端应用

    初衷 当初的一个学习框架项目,采用sui框架实现的一套手机端页面.今天清理github的时候重新整理了一下,因为设计的确实不错嘛,拿出来大家一起学习...哈哈 说明 采用sui框架 纯html/css ...

  10. js中list 和 map还有string的部分操作

    1.创建list或者数组 var list = []; list中添加元素:list.push("hello");   如果没有先定义为数组类型不能使用 push方法 判断list ...