Python中yield返回生成器的详细方法
目录
- 一、迭代器
- 二、生成器
- 三、yield
- 1.例子一
- 2.例子二
- 总结
最简单、直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器。
要理解 yield 的作用,必须理解生成器是什么?
在理解生成器之前,必须先理解迭代器。
一、迭代器
逐项读取列表,称为迭代。
mylist = [1, 2, 3] for i in mylist: # 可迭代对象 print(i)
列表解析式同样是一个迭代器。
mylist = [x*x for x in range(3)] for i in mylist: print(i) ''' 0 1 4 '''
所有 for...in... 都是迭代器,包括列表、字符串、文件等等。
但是,迭代器所有的值都存储在内存中,十分浪费内存。
因此有了生成器的概念。
二、生成器
生成器是一种迭代器,这种迭代器只能迭代一次。
生成器不会一次性存储所有的值,而是会动态的生成值。
mygenerator = (x*x for x in range(3)) for i in mygenerator: print(i)
生成器只可执行一次,再次执行时不会输出任何东西。
三、yield
1.例子一
yield 类似于 return 关键字,只是函数将返回一个生成器。
# 创建生成器 def createGenerator(): mylist = range(10) for i in mylist: print(i) # 验证函数调用时并无执行 yield i*i mygenerator = createGenerator() print(mygenerator) # <generator object createGenerator at 0x0000029E88FDCA50> # 使用生成器 for i in mygenerator: print(i) # 再次执行 返回为空 没有值了
函数将返回一组只需要读取一次的值,可以大大的提升代码性能。
在调用函数时,函数体中的代码并不会执行,函数只返回生成器对象。
代码每次从使用生成器时停止的地方继续。
2.例子二
#Python学习交流群:531509025 # 学习另外一个例子 def foo(): print("starting...") while True: res = yield 4 # 函数并不真正执行 print("res:", res) g = foo() # 得到一个生成器对象 print(next(g)) # 真正执行 print("*"*20) print(next(g)) # 从上一次停止的地方继续执行 ''' starting... 4 ******************** res: None 4 ''' print(g.send(7))
执行 yield 之后,才会跳出 while 循环。
next 函数用于执行下一步操作。
send 函数用于发送一个参数给生成器。且 send 方法中包含 next 方法。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
相关推荐
-
Python yield生成器和return对比代码实例
迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 生成器是特殊的迭代器 def gen_yield(): for i in range(1,10): for j in range(1,10): yield i+j # return i+j if __name__ == '__main__': a
-
python3.6生成器yield用法实例分析
本文实例讲述了python3.6生成器yield用法.分享给大家供大家参考,具体如下: 今天看源码的时候看到了一个比较有意思的函数:yield 功能与return类似,都是返回定义的函数的一个结果,不同的是return返回后这次调用函数就结束了,除了返回值,其余临时变量都会被清除.而yield会停止在当前步,并保留其余变量的值,等下次调用该函数时,从yield的下一步继续往下运行. yield的好处是如果函数需要很大的内存,比方说需要计算并返回一个很大的数列,如果用return,我们只能用一个l
-
举例详解Python中yield生成器的用法
yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的). yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个普通的函数,而是一个生成器.当该函数被调用时不会自动执行,而是暂停,见第一个例子: 例1: >>> def mygenerator(): ... print 'start...' ... yield 5 ... >>> mygenerator()
-
详解Python3中yield生成器的用法
任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器. 使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next()方法返回序列值. c = count(5) c.__next__() #python 3.4.3要
-
python生成器/yield协程/gevent写简单的图片下载器功能示例
本文实例讲述了python生成器/yield协程/gevent写简单的图片下载器功能.分享给大家供大家参考,具体如下: 1.生成器: '''第二种生成器''' # 函数只有有yield存在就是生成器 def test(i): while True: i += 1 res = yield i print(res) i += 1 return res def main(): t = test(1) # 创建生成器对象 print(next(t)) # next第一次执行从上到下,yield是终点 p
-
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
本文实例讲述了Python 生成器,迭代,yield关键字,send()传参给yield语句操作.分享给大家供大家参考,具体如下: demo.py(生成器,yield关键字): # 生成器是一个特殊的迭代器.可以用for...in遍历. # 带有yield关键字的函数,不再是一个函数,而是一个生成器模板.调用该模板会返回一个生成器对象. def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < all_num
-
Python中yield返回生成器的详细方法
目录 一.迭代器 二.生成器 三.yield 1.例子一 2.例子二 总结 最简单.直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器. 要理解 yield 的作用,必须理解生成器是什么? 在理解生成器之前,必须先理解迭代器. 一.迭代器 逐项读取列表,称为迭代. mylist = [1, 2, 3] for i in mylist: # 可迭代对象 print(i) 列表解析式同样是一个迭代器. mylist = [x*x fo
-
Python中用于返回绝对值的abs()方法
方法abs() 返回x的绝对值,-x-零之间的(正极)的距离. 语法 以下是abs()方法的语法: abs( x ) 参数 x -- 这是一个数值表达式 返回值 此方法返回x的绝对值. 例子 下面的例子显示abs()方法的使用. #!/usr/bin/python print "abs(-45) : ", abs(-45) print "abs(100.12) : ", abs(100.12) print "abs(119L) : ", abs(
-
python中关于property的最详细使用方法
为什么要写这篇文章 其实是因为最近学到了python的property装饰器的相关知识,刚开始学得云里雾里,于是乎,看了许多相关博客,不巧,大概是自己基础不太好吧,真心感觉许多人写的太过深奥,而且不是很全面.于是本人花了整整一下午实验,现在将关于property的相关知识分享出来.如有错误之处,还望各位不吝赐教! 什么是property装饰器 顾名思义,这是一个装饰器,起到一个辅助作用,具体理解请看下面一个例子.我们知道,程序中有许多变量都有范围的限制,比如年龄,工资,身高等不可能为负数.但是用
-
详解Python中迭代器和生成器的原理与使用
目录 1.可迭代对象.迭代器 1.1概念简介 1.2可迭代对象 1.3迭代器 1.4区分可迭代对象和迭代器 1.5可迭代对象和迭代器的关系 1.6可迭代对象和迭代器的工作机制 1.7自己动手创建可迭代对象和迭代器 1.8迭代器的优势 1.9迭代器的缺点和误区 1.10python自带的迭代器工具itertools 2.生成器 2.1生成器的创建方法 2.2生成器方法 2.3生成器的优势 2.4生成器应用场景 3.生成器节省内存.迭代器不节省内存 3.1可迭代对象 3.2迭代器 3.3生成器 3.
-
python中yield的用法详解——最简单,最清晰的解释
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它
-
通过实例简单了解Python中yield的作用
这篇文章主要介绍了通过实例简单了解Python中yield的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 我们有时候会发现代码中return的地方,有用yield的,难道他们一样吗?其实,yield与return看起来很像,但实际上完全不同. 使用 def test(): print("****start****") while 1: res = yield 1 print("res:", res) t
-
Python中Yield的基本用法
带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这个函数只是返回一个生成器(Generator Iterator). def generator(): for i in range(10) : yield i*i gen = generator() print(gen) <generator object generator at 0x7ffaad115aa0> 1. 使用next方法迭代生成器 gene
-
python中yield的用法详解
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它
-
python中的迭代器,生成器与装饰器详解
目录 迭代器 生成器 装饰器 总结 迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代. for循环调用list本质上是是调用了list的迭代器进行迭代. # 对list进行for循环本质上是调用了list的迭代器 list = [1,2,3,4] # for 循环调用 for elem in list: print(elem) # 迭代器调用 list_iter = list.__iter__() while True: tr
-
python中的计时器timeit的使用方法
本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下: timeit 通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:timeit #导入timeit.timeit from timeit import timeit #看执行1000000次x=1的时间: timeit('x=1') #看x=1的执行时间,执行1次(number可以省略,默认值为1000000): timeit('x=1',
随机推荐
- oracle11g 最终版本11.2.0.4安装详细过程介绍
- 以独占方式的锁定数据表的解决方法参考
- Python中内置的日志模块logging用法详解
- JQuery实现简单验证码提示解决方案
- python实现从一组颜色中找出与给定颜色最接近颜色的方法
- Windows7下的Java运行环境搭建过程图解
- EXCEL数据上传到SQL SERVER中的简单实现方法
- 全flash站制作剖析
- 详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
- vim命令大全
- sql 查询结果合并union all用法_数据库技巧
- 批量执行sql语句的方法
- jquery插件制作 手风琴Panel效果实现
- 设置下载不需要倒计时cookie(倒计时代码)
- 快速关机会导致Windows数据损坏吗?
- Java任务调度的常见实现方法与比较详解
- 详解使用Spring MVC统一异常处理实战
- JAVA 多线程爬虫实例详解
- Android嵌套滑动冲突的解决方法
- 介绍Python中的文档测试模块