day5_python之协程函数
一、yield
1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器
2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值
3:函数暂停与再继续运行的状态是有yield保存
def func(count):
print('start')
while True:
yield count
count += 1
g=func(10)
print(g)
print(next(g))
print(next(g))
二、yield的表达式形式的应用
函数里有yield,一旦执行,那么这个函数就是个生成器
def eater(name):
print('%s 说:我开动啦' % name)
while True:
food = yield
print('%s eat %s' % (name, food)) alex_g = eater('alex') ##执行
print(alex_g)###得到生成器<generator object eater at 0x00000000022FB200> print(next(alex_g))#打印alex 说:我开动啦,返回nane,并且函数暂停在food = yield
print('==============>')
print(next(alex_g))#alex eat None,返回none,然后进入循环,暂定在food = yield
print('==============>')
print(next(alex_g))
三、用法
def eater(name):
print('%s 说:我开动啦' % name)
food_list = []
while True:
food = yield food_list # 针对表达式的yield,分两个阶段去使用,第一,初始化,第二,给yield传值
food_list.append(food) # ['骨头','菜汤']
print('%s eat %s' % (name, food)) alex_g = eater('alex')
#####第一阶段:初始化
g = next(alex_g) # 等同于alex_g.send(None)
print(g)
print('===========>') # 第二阶段:给yield传值
print(alex_g.send('骨头')) # 1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
# print('===========>')
print(alex_g.send('菜汤'))
print(alex_g.send('狗肉包子'))
四、单线程下实现并发的效果
def eater(name):
print('%s 说:我开动啦' % name)
food_list = []
while True:
food = yield food_list
food_list.append(food) # ['骨头','菜汤']
print('%s eat %s' % (name, food)) def producer():
alex_g = eater('alex')
# 第一阶段:初始化
next(alex_g)#第一阶段
# 第二阶段:给yield传值
while True:#第二阶段
food = input('>>: ').strip()
if not food: continue
print(alex_g.send(food)) producer()
五、解决初始化问题
########解决初始化问题
def init(func):
def wrapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g) ###解决初始化问题
return g ##返回的是初始化以后的g return wrapper @init
def eater(name):
print('%s 说:我开动啦' % name)
food_list = []
while True:
food = yield food_list
food_list.append(food) # ['骨头','菜汤']
print('%s eat %s' % (name, food)) alex_g = eater('alex')
#####第二阶段:给yield传值
print(alex_g.send('骨头')) # 1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
print('===========>')
day5_python之协程函数的更多相关文章
- Python基础(协程函数、内置函数、递归、模块和包)-day05
写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04 ...
- python之协程函数、递归、二分法
一.协程函数: 协程函数的语法: def eater(name): print('%s说:我开动啦' %name) food_list=[] while True: food=yield food_l ...
- python协程函数、递归、匿名函数与内置函数使用、模块与包
目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...
- python基础之协程函数、列表表达式、生成器表达式
一.协程函数 协程函数的定义?如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数称为协程函数 协程函数补充: def init(func): def wrapper( ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- python自动化 协程函数、二分查找、模块搜索
协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式
一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...
- python 列表表达式、生成器表达式和协程函数
列表表达式.生成器表达式和协程函数 一.列表表达式: 常规方式示例: egg_list=[] for i in range(100): egg_list.append("egg%s" ...
随机推荐
- hibernate 查询最大值(数据条目数)
如下 使用 SELECT COUNT(*) 然后获取最大值 Integer.parseInt(query.list().).toString()); 比如 StringBuffer hql1; hql ...
- Vue.之.项目开发工具选用
Vue.之.项目开发工具选用 上篇文章记录了创建项目,这篇文件记录,如何对创建的项目进行开发.这里选择一个工具:Visual Studio Code (请自行下载安装) 1. 打开VSCode工具,并 ...
- 第八章—BOM(一)
ECMAscript是JS的核心,而要在web上使用JS,那么BOM无疑是真正的核心.BOM叫浏览器对象模型,它提供了许多对象,用于访问浏览器的功能. BOM的核心对象是window,它表示浏览器的一 ...
- BZOJ 3057圣主的考验题解
老师居然考这么毒瘤的题目!!!!! 很容易想到dp,f[i][j]表示有i个节点,左子树的最深深度为j的方案数 枚举左子树有多少节点然后转移,复杂度为n^3 T飞~ 我们考虑到有深度为h的树的节点有多 ...
- 报错OPTION SQL_SELECT_LIMIT=
org.quartz.JobPersistenceException: Couldn't acquire next trigger: You have an error in your SQL syn ...
- 大数据技术之Kafka
Kafka概述 1.1 消息队列 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息 ...
- 关于JSP的淘汰问题(转)
来源:http://1t.click/peD 大中型公司需要专业人才,小公司需要全才,但是对于个人职业发展来说,我建议是分开.你要是这辈子就吃java这碗饭,就不要去研究什么css,js等等. 把你的 ...
- Apache Camel继承Spring Boot 实现文件远程复制和转移
pom.xml <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-f ...
- LocalDateTime计算时间差
LocalDateTime 为java8的新特性之一 LocalDateTime.now() 获得当前时间 java.time.Duration duration = java.time.Durati ...
- IntelliJ IDEA 添加项目后编译显示包不存在的解决方案
File -> Project Structure -> Modules 看看是否有多个项目,删掉无用的.或者调整一下项目,重新 Mark as 一下,指定成 Sources