博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是生成器
阅读量:5172 次
发布时间:2019-06-13

本文共 1343 字,大约阅读时间需要 4 分钟。

为了理解什么是 yield,你必须理解什么是生成器。在理解生成器之前,让我们先走近迭代。3.3. 可迭代对象当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象:>>> mylist = [1, 2, 3]>>> for i in mylist :...    print(i)123mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:>>> mylist = [x*x for x in range(3)]>>> for i in mylist :...    print(i)014所有你可以使用 for .. in .. 语法的叫做一个迭代器:列表,字符串,文件……你经常使用它们是因为你可以如你所愿的读取其中的元素,但是你把所有的值都存储到了内存中,如果你有大量数据的话这个方式并不是你想要的。3.4. 生成器生成器是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator :...    print(i)014看起来除了把 [] 换成 () 外没什么不同。但是,你不可以再次使用 for i in mygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的…3.5. yield关键字yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。>>> def createGenerator() :...    mylist = range(3)...    for i in mylist :...        yield i*i...>>> mygenerator = createGenerator() # create a generator>>> print(mygenerator) # mygenerator is an object!
>>> for i in mygenerator:... print(i)014这个例子没什么用途,但是它让你知道,这个函数会返回一大批你只需要读一次的值.为了精通 yield ,你必须要理解:当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,这有点蹊跷不是吗。那么,函数内的代码什么时候执行呢?当你使用for进行迭代的时候.现在到了关键点了!第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。

   仅允许非商业转载,转载请注明出处

转载于:https://www.cnblogs.com/Archimedes/p/7069046.html

你可能感兴趣的文章
浅谈WebService的版本兼容性设计
查看>>
(并查集)~APTX4869(fzu 2233)
查看>>
Redis Command
查看>>
Beta 冲刺(1/7)
查看>>
javascript 笔记--变量
查看>>
执行mount命令时找不到介质或者mount:no medium found的解决办法
查看>>
HTML day02(html列表与菜单的制作)
查看>>
IO-01. 表格输出(5)
查看>>
Project stance need more proactive steps of bank
查看>>
【无聊放个模板系列】BZOJ 3172 (AC自动机)
查看>>
【BZOJ 4503】4503: 两个串 (FFT)
查看>>
《移动平台开发实践》第1周作业
查看>>
文件上传(实例)
查看>>
ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)
查看>>
BZOJ 1443 游戏(二分图博弈)
查看>>
Ubuntu修改默认root及密码
查看>>
linux中安装typecho的pathinfo配置
查看>>
git解决 remote: Permission to wuheng1991/site-manager.git denied to XXX
查看>>
MSIL实用指南-struct的生成和操作
查看>>
编译与运行、解释程序与编译程序
查看>>