python之生成器yeild
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的更多相关文章
- python 迭代器 生成器
迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python 12 生成器
目录 1. 生成器 yeild 2. 推导式 2.1 列表推导式: 2.2 生成器推导式: 2.3 字典推导式: 2.4 集合推导式: 3. 内置函数(一) 1. 生成器 yeild 生成器的本质就是 ...
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- python中和生成器协程相关yield from之最详最强解释,一看就懂(二)
一. 从列表中yield 语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
随机推荐
- The database returned no natively generated identity value错误解决方案
原因:hibernate项目中在学生表的配置文件中: <id name="studentno" column="studentno"> <ge ...
- HTML相对路径和绝对路径
一.相对路径 相对路径不带有盘符,通常是以HTML网页文件为起点,通过层级关系描述目标图像的位置. 相对于文件自身出发,就是相对路径. 主要有以下几种情况: ①文件和图片(html文档)在同一个 ...
- Cocos CreatorUI系统下
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...
- C#访问https地址实例
程序访问的网址从http换成了https,安全性更高了,程序对网址的访问也要改一下 C#访问https地址实例如下 namespace ConsoleApp2 { public class Progr ...
- uni-app input text-indent失效解决
有两种方法去解决 第一种 input { padding-left: 10upt } 第二种 input { display: block }
- 第12组 Alpha事后诸葛亮
Header 组长博客 Postmortem 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要解决的是喜欢记录分享旅游生活的人群的行迹记录和分享问题, ...
- 【AtCoder】 ARC 103
link C-//// 直接算会出现奇偶两组选了同一个数,注意处理一下就行 #include<bits/stdc++.h> #define ll long long #define dbg ...
- python的tecplot模块(tecplot新特性)
Python的tecplot模块仅支持tecplot2017以上 首先安装tecplot2017 安装完成以后,安装python的tecplot模块 可以通过终端转入tecplot安装目录下的pyte ...
- 使用IDEA查看变量调用链
在开发中,我们有时需要查看某个变量是怎么来的,从哪个类的某个方法调用后进入另一个类的某个方法. 如果只有一两层的调用,那么还能直接通过方法跳转来观察. 但是,如果有七八层的调用链呢,在各个方法之间跳来 ...
- golang模拟编程tcp模拟http(转载)
package main import ( "fmt" "net" "strconv" ) //用来转化int为string type In ...