当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢?

或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉得新奇的同时,又感叹自己太无知,但毕竟我也不是那种规规矩矩学写代码的人,遇上不懂的,咱就学咯。

于是先上网易有道词典搜一下这个单词的意思

额。。。那在代码中应该是产生的意思较为准确了。

我尝试在编辑器中使用yield,报错了,说是得再函数中使用

那就来定义一个函数,再调用它好了

def test():
yield "iloveyou"
test()

并没有打印出iloveyou 字符串,反而是返回了一个生成器对象

生成器是啥呢?

百度一下生成器的概念,简而言之就是,含有yield的函数的称为生成器,生成器也是一个迭代器,我是这么理解的,生成一个迭代器。

下面用一个例子来阐述为何要用到yield 的生成器。

假如此时我想要得到一个列表,那么我可以定义一个函数来生成一个自然数列表

def getList(num):
l = []
for i in range (0,num):
l.append(i)
return l

result = getList(1000)

此时,result 就是一个长度为1000的自然数列表了

那么当我要对这个列表中的数据做处理的时候,我还要再次用for 循环遍历这个列表

for i in result:
pass

如果说这个列表很长很长的话,存储起来就很消耗内存了,此时如果用 生成器 生成一个迭代器,运行时才生成值,保存在内存中永远都是一个常数,相比起存储一个列表,存储空间大大减小。

那么上述的函数可以改写为如下的函数

def getGenerator(num):
for i in range (0,num):
yield i result = getGenerator(1000)
next(result)

result 为生成器结果,用next来得到迭代器中的下一个元素,

也可用for循环来遍历输出每个元素

for i in result:
print(i)

用next来得到迭代器中的下一个元素,直到迭代器中的元素遍历完,会抛出一个StopIteration 停止迭代的错误。生成器中的元素只能访问一次。不像for循环,可以随时访问第几个元素。

而用for循环遍历却不会抛出该异常,是因为for循环自动捕捉到该异常,停止调用next()

总结了一下,想处理大量集合数据时,最好是使用迭代器来操作,不耗内存。

python 中的 yield 究竟为何物?生成器和迭代器的区别?的更多相关文章

  1. Python中的yield和Generators(生成器)

    本文目的 解释yield关键字到底是什么,为什么它是有用的,以及如何来使用它. 协程与子例程 我们调用一个普通的Python函数时,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函 ...

  2. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  3. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

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

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

  5. python中,花括号,中括号,小括号的区别

    python中,花括号,中括号,小括号的区别 Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list ...

  6. Python中的yield生成器的简单介绍

    Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...

  7. python中的yield生成器详解

    #原创,转载请先联系 在学习生成器之前,必须先了解一下迭代器.因为生成器就是一种特殊的迭代器,而且生成器用起来更加优雅. 迭代器的详解可以参考我的另一篇博文:https://www.cnblogs.c ...

  8. [转]关于Python中的yield

    在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...

  9. 【转载】关于Python中的yield

    在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...

随机推荐

  1. Python记录wsgi

    类实现wsgi app from wsgiref.util import setup_testing_defaults from wsgiref.simple_server import make_s ...

  2. SpringBoot 注解

    @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(stereotype)注解.它为阅 ...

  3. CCF CSP 201809-2 买菜

    题目链接:http://118.190.20.162/view.page?gpid=T78 问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广 ...

  4. 第01节:ActiveMQ入门和消息中间件

    1.ActiveMQ最主要的功能:实现JMS Provider,用来帮助实现高可用.高性能.可伸缩.易用和安全的企业级面向消息服务的系统.是一个异步的功能. 2.ActiveMQ特点: 完全支持JMS ...

  5. Linux的邮件服务器配置

    一.邮件服务简介 1.电子邮件服务是Interne上最基本的服务之一,进入互联网的用户不需要任何纸张就可以方便地使用电子邮件来收发邮件 2.Internet上的电子邮件服务都是基于客户/服务器模式的 ...

  6. 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面

    文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...

  7. future then

    import 'dart:async'; main(){ Future(()=>a1()) .then((x)=>a2(x)) .then((x)=>a3(x)) .then((x) ...

  8. Python3 tkinter基础 Radiobutton variable 默认选中的按钮

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. mongodb修改和删除操作

    修改数据修改里面还有查询条件.你要该谁,要告诉 mongo.查找名字叫做小明的,把年龄更改为 16 岁:1 db.student.update({"name":"小明&q ...

  10. [ZOJ 4014] Pretty Matrix

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5742 AC代码: /* * 反思: * 1.遇到简单题别激动,先把它 ...