yield

Yield

匿名 (未验证) 提交于 2019-12-03 00:41:02
Yield:是一个关键字,通过状态机实现,充分体现了延迟加载的特性。 下面是一个实例代码,运行一下,会发现Yield的神奇之处。 class Program { static void Main(string[] args) { { IEnumerable<int> results = CommonMethod(); results = YieldMethod(); } Console.WriteLine("*******************************"); { IEnumerable<int> results = CommonMethod(); foreach (var item in results) { Console.WriteLine(item); } } Console.WriteLine("*******************************"); { IEnumerable<int> results = YieldMethod(); foreach (var item in results) { Console.WriteLine(item); } } Console.ReadKey(); } public static IEnumerable<int> CommonMethod() { List<int> results = new

Generator函数

匿名 (未验证) 提交于 2019-12-03 00:40:02
Generator 函数是 ES6 提供的一种异步编程解决方案。 1、所谓“异步”,简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。 2、异步编程方式: ( 1 )回调函数 ( 2 )事件监听 ( 3 )发布/订阅者 ( 4 ) Promise 对象 3、所谓回调函数,就是把第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。 回调函数的异步方式容易形成多重嵌套,多个异步操作形成了强耦合,只要有一个操作需要修改,它的上层回调函数和下层回调函数,可能都要跟着修改。这种情况就称为”回调函数地狱”(callback hell)。 Promise可以解决callback hell问题,Promise对象允许回调函数的嵌套,改成链式调用。 二、什么是Generator? 语法上,可以把理解成,Generator 函数是一个状态机,封装了多个内部状态。 形式上,Generator 函数是一个普通函数。 整个Generator函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用yield语句。 Generator函数特征: (1)function 关键字和函数之间有一个星号(*),且内部使用yield表达式,定义不同的内部状态。 (2)调用Generator函数后,该函数并不执行

unity协程

匿名 (未验证) 提交于 2019-12-03 00:22:01
开启协程 StartCoroutine (IEnumerator xxx);//里面传入协程方法 IEnumerator xxx(){}//协程方法定义 关于yied return 返回值 yield return null;//下一帧开始时继续调用 yiled return new WaitForFixedUpdate;//在FixedUpdate之后调用 yield return new WaitForSeconds (n);//N秒后继续运行 yield return WWW;//等待WWW构建完成后继续进行 协程进行逐步进行方法如下: yield return x1(调用协程); yield return x2(调用协程); 文章来源: unity协程

pytest֮fixture

匿名 (未验证) 提交于 2019-12-02 23:51:01
pytest 相较于 unittest 最为跳跃的一点应该就是 fixture 机制 对于unittest来说,每个用例的类中都需要去写入setUp和tearDown。也就是我们所说的前置和后置, 而不可避免的,很多用例的前置和后置都是一样(例如很多用例都需要前置登录,后置退出),于是我们需要重复的复制粘贴,这样导致工作量增加,代码量也增加,界面也显得冗杂。 所以此时pytest中fixture机制便要闪亮登场了。 而方便的是:如果很多用例都有同样的前置和后置,那么我就只实现一个,然后需要的用例就去调用就好了。 1.机制:与测试用例同级,或者是测试用例的父级,创建一个conftest.py文件。 2.conftest.py文件里:放所有的前置和后置。 不需要用例.py文件主动引入conftest文件。 3.定义一个函数:包含前置操作+后置操作。 4.把函数声明为fixture :在函数前面加上 @pytest.fixture(作用级别=默认为function) 5.fixture的定义。   如果有返回值,那么写在yield后面。(yield的作用就相当于return)  1. 如下: 定义一个函数名叫open_url的fixture前后置,前置为打开链接,后置为退出浏览器   @pytest.fixture(scope="class") #定义scope的范围   def

生成器

匿名 (未验证) 提交于 2019-12-02 23:49:02
词法分析 和 语法分析 迭代器:python内置的一种节省空间的工具 生成器的本质就是一个迭代器 迭代器和生成器的区别:迭代器python自带的,生成器程序员自己写的 写一个生成器---函数中将return 改成yield就是生成器 def func() print(123) yield "你好啊"# 返回 跟return的作用相同 print(func())产生一个生成器 print(func().__next__()) 结果: <generator object func at 0x000001F35A653C50> 123 你好啊 return 可以返回值 可以写多个但是只执行一次 yield 可以 返回值 可以写多个 可以返回多次 会记录执行位置 在函数内部yield可以暂时阻塞 while for循环 ![QQ图片20190719102807](D:\python听课记录\day1\QQ图片20190719102807.pngdef func(): if 3>2: yield "你好" if 4>2: yield "我好" yield "大家好" g = func() print(g.__next__()) print(g.__next__()) print(g.__next__()) 结果: 你好 我好 大家好 坑 def foo(): for i in range

生成器的应用

匿名 (未验证) 提交于 2019-12-02 23:47:01
# def average(): # sum = 0 # count = 0 # avg = 0 # while True: # num = yield avg # sum += num # 10 # count += 1 # 1 # avg = sum/count # # avg_g = average() # avg_g.__next__() # avg1 = avg_g.send(10) # avg1 = avg_g.send(20) # print(avg1) 获取移动平均值 # def init(func): #装饰器 # def inner(*args,**kwargs): # g = func(*args,**kwargs) #g = average() # g.__next__() # return g # return inner # # @init # def average(): # sum = 0 # count = 0 # avg = 0 # while True: # num = yield avg # sum += num # 10 # count += 1 # 1 # avg = sum/count # # avg_g = average() #===> inner # ret = avg_g.send(10) # print(ret) # ret

Python中yield的理解与使用

匿名 (未验证) 提交于 2019-12-02 22:54:36
总结: 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。使用next可以很好的看出yield的工作机制。当yield使用完成后,就会报出exception。带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)

Python协程,完美掌握!

匿名 (未验证) 提交于 2019-12-02 22:51:30
声明:本人的一切著作,禁止用于以营销为目的的任何转载! 前言 很久以前就听说 Python 的 async/await 很厉害,但是直到现在都没有用过,一直都在用多线程模型来解决各种问题。最近看到隔壁的 Go 又很火,所以决定花时间研究下 Python 协程相关的内容,终于在翻阅了一裤衩的资料之后有了一些理解。 起:一切从生成器开始 以往在 Python 开发中,如果需要进行并发编程,通常是使用多线程 / 多进程模型实现的。由于 GIL 的存在,多线程对于计算密集型的任务并不十分友好,而对于 IO 密集型任务,可以在等待 IO 的时候进行线程调度,让出 GIL,实现『假并发』。 当然对于 IO 密集型的任务另外一种选择就是协程,协程其实是运行在单个线程中的,避免了多线程模型中的线程上下文切换,减少了很大的开销。为了理解协程、async/await、asyncio,我们要从最古老的生成器开始。 回顾 Python 的历史,生成器这个概念第一次被提出的时候是在PEP 255中被提出的,当时的 Python 版本为 Python2.2。我们都知道range()函数,现在考虑一下我们来编写一个自己的range()函数,最直接最容易想到的方法也许是这样: 当你想创建一个很小的序列的时候,例如创建从 0 到 100 这样的列表,似乎没什么问题。但是如果想创建一个从 0 到 999999999