yield, async
yield实现斐波那契序列:
import sys, time def fib():
a,b,c = 0,1,0
while True:
yield c
a,b = b, c
c = a + b if __name__ == '__main__':
fib_iter = fib()
for i in range(int(sys.argv[1])):
print(fib_iter.__next__())
Send:
send函数用来向fib_iter发送数据,这样数据就可以双向流动。我们尝试使用send来模拟一个比较慢的生成器,我们让它一秒钟生成一个数:
import sys, time def fib():
a,b,c = 0,1,0
while True:
sleep_sec = yield c
time.sleep(sleep_sec)
a,b = b, c
c = a + b def fib1():
index = 1
a = 0
b = 1
while index:
yield b
a, b = b, a + b
index += 1 if __name__ == '__main__':
fib_iter = fib()
print(fib_iter.__next__()) #先执行一下,让它停留在yield
for i in range(int(sys.argv[1])):
result = fib_iter.send(1) #
print(result)
yield from 是什么?
在上面的yield中,我们通过for循环使用__next__()方法来获取下一个值,也就是说想要获取下一个值就要重新yield一下;yield from 它可以简化这个过程,看看实例:
import sys, time def fib(n):
a,b,c = 0,1,0
while c < n:
yield c
a,b = b, c
c = a + b def gener(n):
yield from fib(n) if __name__ == '__main__':
print(list(gener(5000)))
执行结果:
D:\>python fib.py
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4
181]
yield from , send传递信息:
import sys, time def fib(n):
a,b,c = 0,1,0
while c < n:
sleep_sec = yield c
time.sleep(sleep_sec)
a,b = b, c
c = a + b def gener(n):
yield from fib(n) if __name__ == '__main__':
gen = gener(10)
print(gen.send(None))
print(gen.send(1))
print(gen.send(1))
执行结果:
D:\>python fib.py
0
1
1
asyncio 和 yield from:
asyncio是一个基于事件循环的实现异步的I/O模块。通过yield from, 我们可以将协程asynico.sleep的控制权交给事件循环,然后挂起当前协程;之后,由事件循环决定何时唤醒asyncio.sleep,然后接着执行后面的代码; 实例中我们用sleep来模拟阻塞:
import sys, time, asyncio def fib(n):
a,b,c = 0,1,0
while c < n:
yield from asyncio.sleep(2)
print('-->', c)
a,b = b, c
c = a + b def stupid_fib(n):
a,b,c = 0,1,0
while c < n:
yield from asyncio.sleep(2)
print('==>', c)
a,b = b,c
c = a + b if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = [asyncio.async(fib(10)), asyncio.async(stupid_fib(10))]
loop.run_until_complete(asyncio.wait(tasks))
print('all task finished')
loop.close()
执行结果:
D:\>python fib.py
--> 0
==> 0
--> 1
==> 1
--> 1
==> 1
--> 2
==> 2
--> 3
==> 3
yield, async的更多相关文章
- ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...
- 理解Python协程:从yield/send到yield from再到async/await
Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...
- [转] Understanding JavaScript’s async await
PS:Promise的用处是异步调用,这个对象使用的时候,call then函数,传一个处理函数进去,处理异步调用后的结果 Promise<Action>这样的对象呢,异步调用后的结果是一 ...
- async/await 的基本实现和 .NET Core 2.1 中相关性能提升
前言 这篇文章的开头,笔者想多说两句,不过也是为了以后再也不多嘴这样的话. 在日常工作中,笔者接触得最多的开发工作仍然是在 .NET Core 平台上,当然因为团队领导的开放性和团队风格的多样性(这和 ...
- python---await/async关键字
推文:玩转 Python 3.5 的 await/async 首先看正常的两个函数之间的执行 def func1(): print("func1 start") print(&qu ...
- cps变换
网上看了很多内容,很少有给出一个准确的概念,它的英文全称是continuous passing style, 直译为连续传递样式,那么cps transform就是将一些原本不是continuous ...
- typescript 的 polyfill 学习
我们知道typescript 是ES 超集.这意味着,不仅仅ES 的各种语法特性都会包括,还能保证通过typescript的编译服务可以很方便的转成ES向下兼容的版本,这得意于typescript强大 ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- es7预览
哈哈,es6才刚刚掌握,就给大家介绍es7了. es7的草案其实早已经定下来了,而且更加向着java这些高级语言看齐了 chrome的高版本其实也已经对es7的部分功能实现了!! 1.数组 inclu ...
随机推荐
- Python 基础数据类型之tuplu
Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 1.元组的定义 tuple1 = ("hello", "world&qu ...
- dynamic
dynamic的特性很多,好像和反射也有关,不过这里先介绍一个特性,关于反射的再补充. 我们来看一个方法: public virtual ActionResult Insert(T info) 有一个 ...
- spring框架学习(三)spring与junit整合测试
package cn.mf.b_test; import javax.annotation.Resource; import org.junit.Test; import org.junit.runn ...
- 模拟jQuery中的ready方法及实现按需加载css,js
一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...
- [转载]CSS Tools: Reset CSS
http://meyerweb.com/eric/tools/css/reset/ The goal of a reset stylesheet is to reduce browser incons ...
- python导出数据到excel
1,SMTP发送带excel附件的邮件: def sendMail(filename, addressee): """ :param content: 发送内容 :par ...
- sql server查询某年某月有多少天
sql语句如下: ),) date from (),,)+'-01' day) t1, ( ) t2 ),) ),,)+'%' 查询结果如下: 2017年2月共有28天,查询出28条记录.
- TensorBoard 简介及使用流程【转】
转自:https://blog.csdn.net/gsww404/article/details/78605784 仅供学习参考,转载地址:http://blog.csdn.net/mzpmzk/ar ...
- vs code 的背景颜色主题还有背景图片的自定义方法
先说颜色主题吧: 依次点击文件--->首选项---->颜色主题 你就可以看到不同的颜色主题了 如果你还觉得不好看,不满意,不符合你的审美风格 你还可以在插件库里面下载相关插件: THEME ...
- Java IO流杂谈
创建文件和删除文件(File类) import java.io.File; import java.io.IOException; public class T2 { public static vo ...