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 ...
随机推荐
- 多线程(模拟买票)-----java基础知识总结
这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼. 代码: package com.day13.math; /** * 类说明 :模拟三个窗口同时售票 * @author 作者 : ...
- python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...
- python中的functools模块
functools模块可以作用于所有的可以被调用的对象,包括函数 定义了__call__方法的类等 1 functools.cmp_to_key(func) 将比较函数(接受两个参数,通过比较两个参数 ...
- windows命令快捷启动应用-----window小技巧
前言 装逼的道路总是这么漫长 而又充满激情.对于崇尚技术的男儿,了解计算机的世界,是我一辈子都是在追寻的.看着各种黑客电影,有那个大牛还需要鼠标的辅助,想想都是那么的令人兴奋 为了有那么一天的到来,我 ...
- SQL语句(十一)函数查询
(十一)函数查询 1. 聚合函数 对一组值进行计算,得到一个返回值 SUM(), 求和 AVG(), 求平均 MIN(), 求最小 MAX(), 求最大 COUNT(), 计数,即个数 --例1 求所 ...
- dedecms织梦首页判断,添加不同标题
<title> {dede:field.title/} {dede:field name='typeid' runphp="yes"}(@me==0)? @me=&qu ...
- js调试系列: 调试基础与技巧
js调试系列目录: - 昨天我们见识到了断点的强悍,在断点的配合下进行动态调试,让读代码变的轻松不少,特别是ajax之类的.在昨天的课后练习中,确实增加了不少难度,因为 提交评论 按钮是用 jQuer ...
- CS229 笔记07
CS229 笔记07 Optimal Margin Classifier 回顾SVM \[ \begin{eqnarray*} h_{w,b}&=&g(w^{\rm T}x+b)\\[ ...
- element-UI 下拉条数多渲染慢
本文地址:https://www.cnblogs.com/veinyin/p/10120398.html 如果渲染为普通下拉框,用户难以找到要选择的那一项,增加模糊搜索功能,可解决渲染缓慢问题,但用户 ...
- 服务器环境配置安装(mysql+redis+nodejs+nginx)
公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...