yield

Optional yield or return in python3. How to?

荒凉一梦 提交于 2020-02-03 08:16:19
问题 I would like to have a function that can, optionally, return or yield the result. Here is an example. def f(option=True): ... for...: if option: yield result else: results.append(result) if not option: return results Of course, this doesn't work, I have tried with python3 and I always get a generator no matter what option value I set. As far I have understood, python checks the body of the function and if a yield is present, then the result will be a generator. Is there any way to get around

生成器

自作多情 提交于 2020-02-01 14:56:33
为什么需要生成器 假如要输入1-1亿的数字, 我们采用range的方式生成数据, 那么程序就会崩溃 采用生成器的方式可以解决这个问题, 生成器不会一次把所有的数据加载到内存中, 而是在循环时临时生成的, 循环一次生成一次, 所以程序运行期间永远只能生成一个数据, 从而大大的节省了内存 解决输入1-1亿数字的问题 生成器使用'()'格式 调用__next__方法,依次输入生成器中的一个数据 list_num = ( i for i in range ( 1 , 100000000 ) ) print ( type ( list_num ) ) # class 'generator' print ( list_num . __next__ ( ) ) for i in list_num : print ( i ) next函数和__next__方法: next函数next函数和__next__方法可以迭代生成器的返回值 list_num = ( i for i in range ( 1 , 100000000 ) ) print ( type ( list_num ) ) # class 'generator' print ( list_num . __next__ ( ) ) yield表达式 生成器可以通过函数产生, 如果在一个函数中出现了yield表达式,

迭代器、生成器、可迭代对象

安稳与你 提交于 2020-02-01 10:55:39
迭代器出现的原因 Python中的列表,有可能会占用很大的空间。而迭代器,它是每一次用__next__调用时才计算出值,这会节省内存空间。 迭代器、生成器、可迭代对象的关系 可迭代对象一般是列表、元组、字典、字符串等可以For循环的对象。可通过以下语句判断是不是可迭代对象。 from collections.abc import Iterator, Iterable l = [1, 2, 3, 4, 5] print(isinstance(l, Iterable)) # True 而且每个可迭代器都有__iter__方法,并且此方法返回一个迭代器。 那么什么是迭代器呢?它与可迭代对象有什么关系?为什么for循环可以得出每人元素的值?那是因为可迭代对象有一个记录员,可记录当前位置。而这个记录员就是迭代器。可迭代对象可生成迭代器,如下: l = [1, 2, 3, 4, 5] it = iter(l) print(isinstance(it, Iterator)) # True 每个迭代器都有__next__方法。而生成器是迭代器的一种,除了有__next__方法以外,还要用到yield。 for循环的本质 其实for循环一个可迭代对象,为我们做了以下事情 1、通过可迭代对象生成一个迭代器 2、调用迭代器的__next__方法,生成值 3、遇到错误时,就退出 以下程序就说明了这个问题

生成器

流过昼夜 提交于 2020-01-30 12:36:44
生成器 一、yield关键字(生成器) yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) <generator object func at 0x10ddb6b48> 生成器的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(g) print(g.__iter__()) # 迭代器 print(F"g.__iter__ == g: {g.__iter__() == g}") res1 = g.__next__() print(f"res1: {res1}") res2 = next(g) print(f"res2: {res2}")

最新Python异步编程详解

久未见 提交于 2020-01-29 09:00:20
我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的呢? 简单的回答是Python通过协程(coroutine)来实现异步编程。那究竟啥是协程呢?这将是一个很长的故事。 故事要从yield开始说起(已经熟悉yield的读者可以跳过这一节)。 yield yield是用来生成一个生成器的(Generator), 生成器又是什么呢?这又是一个长长的story,所以这次我建议您移步到这里: 完全理解Python迭代对象、迭代器、生成器 ,而关于yield是怎么回事,建议看这里: [翻译]PYTHON中YIELD的解释 好了,现在假设你已经明白了yield和generator的概念了,请原谅我这种不负责任的说法但是这真的是一个很长的story啊! 总的来说,yield相当于return,它将相应的值返回给调用next()或者send()的调用者,从而交出了cpu使用权,而当调用者再调用next()或者send()时,又会返回到yield中断的地方,如果send有参数,又会将参数返回给yield赋值的变量,如果没有就跟next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码

Lua学习笔记_协同程序coroutine

跟風遠走 提交于 2020-01-28 16:07:20
协同程序中的返回值   可以写在 coroutine.yield(返回值,返回值.....) ,也可以直接 return 返回值,返回值.....    coroutine.yield 和 coroutine.resume 都是可以 拥有多个返回值的!     coroutine.resume 的第一个返回值用来表示协程是否执行成功; 从 第二个开始往后 的返回值是 coroutine.yield 所返回的 。    coroutine.yield 的返回值是由 coroutine.resume 传入的, 即 coroutine.resume 的 参数(除了第一个参数以外的)。 关于协同程序内部和外部(主程序)的数据交流    下面是一段 菜鸟教程 的代码以及执行结果: 1 function foo (a) 2 print("foo 函数输出", a) 3 return coroutine.yield(2 * a) -- 返回 2*a 的值 4 end 5 6 co = coroutine.create(function (a , b) 7 print("第一次协同程序执行输出", a, b) -- co-body 1 10 8 local r = foo(a + 1) 9 10 print("第二次协同程序执行输出", r) 11 local r, s = coroutine

PHP的yield是个什么玩意

て烟熏妆下的殇ゞ 提交于 2020-01-28 11:48:50
来源: https://segmentfault.com/a/1190000018457194 其实,我并不是因为迭代或者生成器或者研究PHP手册才认识的yield,要不是协程,我到现在也不知道PHP中还有yield这么个鬼东西。人家这个东西是从PHP 5.5就开始引入了,官方名称叫做生成器。你要说为什么5.5年代的东西,现在才拿出来。我还想问你哟,PHP 5.3就有了的namespace为毛到最近这几年才开始正式投产。 那么,问题来了,这东西到底是有何用? 先来感受一个问题,给你100Kb的内存(是的,你没有看错,就是100Kb),然后让你迭代输出一个从1开始一直到10000的数组,步进为1。 愈先迭代数组,必先创造数组。 所以,脑门一拍,代码一坨如下: <?php $start_mem = memory_get_usage(); $arr = range( 1, 10000 ); foreach( $arr as $item ){ //echo $item.','; } $end_mem = memory_get_usage(); echo " use mem : ". ( $end_mem - $start_mem ) .'bytes'.PHP_EOL; 一顿操作猛如虎,运行一下成绩1-5,你们感受一下: 528440bytes,约莫就是528Kb,几乎是100Kb的五倍了

生成器

烂漫一生 提交于 2020-01-27 09:51:58
1、Python 中提供的 生成器:    本质 : 我们自己写的能实现迭代器功能的东西,就叫生成器。   1.1生成器函数:   常规函数定义,但是,使用 yield 语句而不是return语句返回结果。yield语句 一次返回一个结果。 在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行   1.2.生成器表达式:   类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 2、生成器Generator:    本质: 迭代器 ( 所以自带了 __iter__方法和 __next__方法,不需要我们去实现)    特点: 惰性运算,开发者自定义 3、生成器函数:    划重点:      ① 必须含有yield关键字     ② 执行之后会得到一个生成器对象,作为返回值 def generator(): print('123') yield 'ab' ret = generator() print(ret) # <generator object generator at 0x000001DA911EC3B8> print(ret.__next__()) # 第一次执行函数体内的代码,如上①输出123 ②return ab def wahaha(): for i in range(2000): yield '娃哈哈%s'%i g =

ES6的一些基本用法

帅比萌擦擦* 提交于 2020-01-26 12:12:45
● let ● variable hoisting ● arrow Function, Lambda表达式 ● Destructuring Assignments 解构赋值 ● 默认参数值 Default Parameters ● 可变参数 ● 解构参数 ● 解构数组 ● 解构对象 ● 遍历 ● Generators ● String Templates ● 快速创建对象 ● 只读变量 ● Sets ● Maps ● Symbols ● WeakMaps ● Promises ● 创建类 ● Modules ● 内置函数 let 使用let声明的变量只在语句块内有效。 "use strict"; function blockBindingDemo(){ let a = 123; var b = 123; if(true){ let a = 456; b = 456; console.log("使用let语句块中的a为" +a);//456 console.log("使用var语句块中的b为" +b) } console.log("使用let语句块外的a为" +a);//123 console.log("使用var语句块外的b为" +b);//456 } blockBindingDemo(); 以上,以let方式声明的变量只在语句块内有效,而以var方式的变量是一个全局变量。

c# async/await 大略

大兔子大兔子 提交于 2020-01-25 01:30:12
这篇文章不在于带领大家深入的探讨async/await编译器内部如何实现的细节,而是从整体上力图告诉大家如何正确的理解它,使用它,克服对它的心理障碍,让使用异步编程的朋友们能跟上时代的步伐,跟上新思路新设计 ,有了这些大概的理解以后不妨碍你在网上再找其它相关那些技术细节实现的介绍文章,这方面网上资源还是不少,好吧让我们先从四个判断说起。 第一个判断 ,它是一个编译标识,隐藏了编译器生成的代码,编译器生成的代码是一个被称为,状态机的东西。 第二个判断,它和yield 那个类似,都是有一个MoveNext方法,并且让每个await切分代码段,也象 yield切分块一样,执行,不同的是,一个是在同步中执行,一个是在线程池上执行。 比如: IEnumerable<int> YieldMethod() { Console.WriteLine("表示可以在每个yield之间任意执行的语句,语句数据不限"); Console.WriteLine("表示可以在每个yield之间任意执行的语句,语句数据不限"); yield return 0; Console.WriteLine("表示可以在每个yield之间任意执行的语句,语句数据不限"); Console.WriteLine("表示可以在每个yield之间任意执行的语句,语句数据不限"); //.. yield return 1; yield