我们已知:
  生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器
yield的功能:
  1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
  2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
  3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的 yield的表达式:
  x = yield  将yield的值传给x,那么yield的值哪里来?用send( )传入
send的效果:
  1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
  2:与next的功能一样

def init(func):    # 此装饰器给foo()函数做初始化,next(g)停留在yield。
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper @init #foo=init(foo)
def foo():
print('starting')
while True:
x=yield None#return 1
print('value : ',x) g=foo() #wrapper() g.send(2)  # 然后用g.send(2)传值给yield,执行顺序为:send()传值给yield,yield传值给x,然后执行next()的功能。
练习: 食客吃饭上菜
def init(func):
def wrapper(*args, **kwargs):
g = func(*args,**kwargs)
next(g)
return g
return wrapper @init
def eater(name):
print('%s start to eat' %name)
food_list= []
while True:
food=yield food_list
food_list.append(food)
print('%s start to eat %s' %(name, food)) def make_food(people,n):
for i in range(n):
people.send('food%s' %i) e = eater('alex')
make_food(e,5)

  

 
 

python3 yield表达式形式应用的更多相关文章

  1. python函数式编程之yield表达式形式

    先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res ...

  2. Python基础(9)_生成器(yield表达式形式)、面向过程编程

    一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...

  3. yield表达式形式

    首先了解 1.iterator iterator叫做迭代器,用来遍历可以序列化的数据,比如一个list,set 等,当然如果对象想要能够使用迭代器来遍历,只要在该对象的类中添加__iter__()方法 ...

  4. yield 表达式形式的应用

    import random foods=['banana','apple','peach','grape','pear'] def deco(func): def wrapper(*args,**kw ...

  5. yield的表达式形式与内置函数

    yield的功能: 1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行. 2.为封装好的的函数能够使用 ...

  6. yield的表达式形式的应用(待补充)

    1.yield的表达式形式应用的定义: 在一个生成器函数内,将yield赋值给一个变量,这就是yield的表达式形式.也叫生成器的表达式形式 2.send方法的定义: (1)定义: yield的表达式 ...

  7. yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

    一.yield的表达形式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo ...

  8. Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...

  9. python基础之生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...

随机推荐

  1. web入门脑图

  2. 给虚拟机发送键盘按键key

    使用举例:virsh send-key 11 KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE作用:发送"ctrl+alt+del"给虚拟机,linux虚拟机 ...

  3. ardupilot_gazebo仿真(三)

    ardupilot_gazebo仿真(三) 标签(空格分隔): 未分类 创建ROS node 实现对无人机的控制(软件在环) MAVROS MAVROS是ROS中的一个能够连接支持MAVLink地面站 ...

  4. k8s第一个实例创建redis集群服务

    1.创建redis-master-controller.yaml apiVersion: v1 kind: ReplicationController metadata: name: redis-ma ...

  5. Dispose的调用顺序

    非托管资源的释放顺序. 这是应该先释放 reader  再释放 stream. 或者直接使用using,防止出错 .

  6. Mac下安装OpenCV问题

    最近看了纹理特征方面的paper,看了一些资料之后,想要实际动手实现一下其中LBP算法,果然OpenCV中已经实现. 问题 No module named "cv2" 当我在我们项 ...

  7. 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向

    医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...

  8. Android调用Java WebSevice篇之一

    一.服务端WebService 1.服务端环境配置          MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...

  9. Windows 64下elasticsearch-1.7.1集群 安装、启动、停止

    elasticsearch-1.7.1 (es Windows 64) 安装.启动.停止的详细记录 https://blog.csdn.net/qq_27093465/article/details/ ...

  10. BZOJ4318 OSU!(动态规划+概率期望)

    设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率).暴力转移显然.前缀和优化即可. 但是这个前缀和精度无法承受,动不动就nan. 考虑增加一位的贡献.若之前后缀1的个数 ...