python生成器Generator——yield

思考:

首先思考这样一个问题:

创建一个列表,但是内存受限,容量一定是有限的。那么如果创建了一个包含100万个元素的列表,不仅占用很大的存储空间,而我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了?

这个时候就需要一个容器,在我们需要数据的时候拿出来,不取数据的时候就释放掉。这样就能够节省资源和空间。

yield的作用:

  把一个函数变成一个生成器,起到一个延迟的作用,在需要的时候产生结果,节省资源。与声明一个序列相比,生成器在不使用的时候不占用内存。

1、首先实现一个功能,创建一个列表,然后挨个取出其中的元素。

def getNum(n):
i = 0
while i < n:
print(i)
i += 1
getNum(5)

2、在这个基础上添加一个功能,每次调用这个函数都要返回一个值。

但是加入return之后整个函数就退出了,下次再使用这个需要需要从头开始,那能不能实现接着上次停掉的地方开始呢?

def getNum(n):
i = 0
while i < n:
return i
i += 1
a = getNum(5)
print(a)

3、yeild。如果暂时想不明白,就把它看成return,但与return不同的是返回一个值并不会退出函数,而是停在这,直到下次被唤醒。

yield与return返回相同的值,区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,再次调用时,函数又回到之前保存的状态继续执行。

但是,如果直接print,发现返回的是一个内存地址。并不是我们想象的那个东西。

此时,对应于生成器的使用有一个专门的关键字next,就是相当于告诉生成器往下走一步。直至结束

def getNum(n):
i = 0
while i < n:
yield i
i += 1
a = getNum(5)
print(a)
##调用生成器的两种方式
print(next(a))
print(a.__next__)

最后,那么这个生成器有什么用呢?加入你有100万张图像,而每次你都只取n张,下次再取的时候接着刚刚的序列继续取。

那么它是如何实现节省内存的呢?只记住当前位置,生成器只保留一个值,next之后上一个值就没有了,这就是为什么它能接着上次停止的位置继续下去!

python之生成器yeild的更多相关文章

  1. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  2. python中生成器对象和return 还有循环的区别

    python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...

  3. python 12 生成器

    目录 1. 生成器 yeild 2. 推导式 2.1 列表推导式: 2.2 生成器推导式: 2.3 字典推导式: 2.4 集合推导式: 3. 内置函数(一) 1. 生成器 yeild 生成器的本质就是 ...

  4. python 列表生成器

    python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...

  5. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  6. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  7. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

    yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...

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

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

  9. Python的生成器进阶玩法

    Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...

随机推荐

  1. nexus 3.17.0 简单说明

    nexus 在6.24 发布了3.17.0 ,同时包含了好多新的特性 以下为一些主要变动: routing rules 可以增强repo 的安全 apt repo 格式的支持 可以方便的为ubuntu ...

  2. 3-微信小程序开发(小程序的目录结构说明)

    https://www.cnblogs.com/yangfengwu/p/10050784.html 源码下载链接: 或者 这节先说一下小程序的目录结构 自行根据  https://www.cnblo ...

  3. [RN] React Native 查看console打印出来的内容

    我们在调试React Native 程序的时候,经常会用到Js的打印语句Console.log等 但我们一脸蒙逼的时候,启动的时候完全看不到打印的内容在哪儿呢??? 原来还要在命令行下输入一个语句才能 ...

  4. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  5. c++中二叉树的先序中序后序遍历

    c++中二叉树的先(前)序.中序.后序遍历 讲解版 首先先看一个遍历的定义(源自度娘): 所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的 ...

  6. QML学习(四)——<Text显示>

    文本显示是界面开发必不可少的内容,在Qt Quick模块中提供了 Text 项目来进行文本的显示,其中可以使用 font 属性组对文本字体进行设置.这一篇我们来看看它们的具体使用. 使用字体 就像前面 ...

  7. NIO Channel SocketChannel ServerSocketChannel

    ServerSocketChannel: ServerSocketChannel是一个基于通道的socket监听器.它同我们所熟悉的java.net.ServerSocket执行相同的基本任务,不过它 ...

  8. [Beta]第二次 Scrum Meeting

    [Beta]第二次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/6 22:00 30min 大运村公寓6F楼道 附Github仓库:WEDO 例会照片 工作情况总 ...

  9. Jenkins参数化构建--Git Parameter

    由于我们在测试过程中,可能需要在多个测试环境跑用例,这个时候就需要jenkins参数化了. Jenkins参数化一般常用的有两种方式:Choice和String Parameter两种 (1)Choi ...

  10. python3新特性函数注释Function Annotations用法分析

    本文分析了python3新特性函数注释Function Annotations用法.分享给大家供大家参考,具体如下: Python 3.X新增加了一个特性(Feature),叫作函数注释 Functi ...