yield

yield

Table of Contents

  • 1. yield 使用方法(生成器)

    • 1.1. 当方法中包含yield时,该方法为Generator,直接调用不会执行,只有循环或next()可行
    • 1.2. next() 会将带有yield的方法执行,并运行到第一次出现yield的部分,然后再次调用时
    • 1.3. send(self,value)与next类似,但是会传入一个值给yield表达式
  • 2. 有代码如下:
    • 2.1. 通过单步调试发现for循环调用生成器的过程为(注释代码b)(将执行顺序看做指针)
    • 2.2. 当代码b被打开时
    • 2.3. 所以在循环循环体时注意不要对循环体进行操作,如确实需要赋值等操作为保险起见手动调用next与send
  • 3. 相关链接#

1 yield 使用方法(生成器)

1.1 当方法中包含yield时,该方法为Generator,直接调用不会执行,只有循环或next()可行

def show_yield(num):yield 12show_yield(1)
这样没有反应
只有这样
for i in show_yield(1):print(i)
# 这样会打印出12

1.2 next() 会将带有yield的方法执行,并运行到第一次出现yield的部分,然后再次调用时

#执行到下一个,直到没有yield之后抛出异常
def show_yield_next():print('before yield')yield 1print('first yield')yield 2print('last yield')a = show_yield_next()"""
b = show_yield_next() 在这里因为每次调用该函数会返回一个不同的对象,导致如果
这样写的话会一直只调用第一句话
next(show_yield_next())
next(show_yield_next())
next(show_yield_next())会显示三次一样的内容
必须先将对象赋值给一个变量,之后只对该变量进行操作
"""a1 = next(a)
# before yield a1=1
a2 = next(a)
# first yield a2=2
a3 = next(a)
# last yield 并抛出异常

1.3 send(self,value)与next类似,但是会传入一个值给yield表达式

#注意,被传入的值是yield表达式的返回值,而不是yield的值(这点与Ruby不同)
#例如:def show_send_to_yield():print('before')yield_value = yieldprint(yield_value)yield_value = yield 10print(yield_value)yield_value = yield '测试'print(yield_value)
ssy = show_send_to_yield()
next(ssy)  # 必须先执行这一步,将执行位置调整至yield语句部分
ssy.send(100) # 可以看到,yield的后面不论是什么,都会将yield_value的值赋为传入的值
# *但是* 当没有使用send对yield赋值时,yield的整体值就是它的参数
# x = yield 10 没有send时,x就是10#所以如果想要传递一个函数进去,不需要注意yield后面的值,但是在调用时需要记得给参数,如:
ssy.send(lamdba x : print(x))#在调用时要注意给一个参数,如:yield_value(10)#也可以设置一个标识,来使用for循环,当在某步之后执行传递参数的工作
#例如,在某个yield使用完毕之后赋值为指定参数
def show_for_in_yield():yield_value = yield 'send'print(yield_value)for i in ssy:if i == 'send':ssy.send(100)

2 有代码如下:

def show_for_in_yield():yield_value1 = yield 'send'   #1print("yield1  :"+str(yield_value1)) yield_value2 = yield 'sen' #2print("yield2  :"+str(yield_value2))sfy = show_for_in_yield()
try:for i in sfy:  #aif i == 'send':#x=sfy.send(100) #bpassprint(i)
except Exception as exp:print(exp)#因为生成器每次只生成当前使用的部分,所以在第一次进入for时只有一个,执行完毕#1后#2生成,执行2

2.1 通过单步调试发现for循环调用生成器的过程为(注释代码b)(将执行顺序看做指针)

第一步:在a处进入生成器执行#1 并获得yield的值,此时,指针指向#1 执行之后的循环,输出值'send' 第二步:在a处重新进入生成器,并且将#1处的yield值置为None 执行生成器中下一步,输出yield1的值None 第三步:在#2处进入循环,重复上次动作

2.2 当代码b被打开时

第一步:在a处进入生成器执行#1 并获得yield的值,此时,指针指向#1 并进入生成器,并对yield赋值 第二步:执行#2时,因为上次是跳转到生成器中的,所以直接执行上次未完成的输出语句, 输出了第一个yield的值,并进入下个循环 导致在循环体中没有执行第二个yield,只执行了半个循环体 若想输出完整的内容,需要将for改造如下

for i in sfy:if i == 'send':x=sfy.send(100)print(i)print(x)else:print(i)

2.3 所以在循环循环体时注意不要对循环体进行操作,如确实需要赋值等操作为保险起见手动调用next与send

3 相关链接https://www.oschina.net/translate/improve-your-python-yield-and-generators-explained?lang=chs&page=1#

Author: vz liū

Created: 2017-03-22 Wed 21:07

Emacs 25.1.1 (Org mode 8.2.10)

Validate

转载于:https://www.cnblogs.com/liuvzzvuil/p/6602113.html

python yiled相关推荐

  1. python 生成器 迭代器 yiled

    文章来源:http://python.jobbole.com/81911/ https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449 ...

  2. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  3. python之Scrapy框架的第一个爬虫

    执行: D:\pycodes\python123demo>scrapy crawl demo scrapy crawl demo 学习笔记: 代码: D:\pycodes>scrapy s ...

  4. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  5. python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...

    一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...

  6. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  7. 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器

    1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...

  8. python第三方库有哪些常用的、请列举15个-python基础面试常见题

    Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之一. 2.通过什么途径学习的Python? 通过自学,包括网上查看一些视频,购买一些相关专业的书籍. 3.Pyt ...

  9. python代码基础题-python第一部分基础题1-80题

    各位Python的第一部分1-80道基础题已经整理好了,希望面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之 ...

  10. python进阶免费-【Python进阶,一学就会】系列1(文末免费送10本书)

    请标星公众号,第一时间获取最新资讯 本期作者:Ravindra Parmar 本期编辑:Dotton | 公众号翻译部成员 ↓↓年度巨献↓↓ ↑↑点我↑↑ 送书活动在文末 本系列,我们将会对Pytho ...

最新文章

  1. node.js 下载安装及gitbook环境安装、搭建
  2. 二进制文件被拒_苹果商店上架,二进制文件被拒绝
  3. Unity3D_(游戏)2D坦克大战 像素版
  4. GraphQL —— 标量类型
  5. linux中byte数组长度,android – JNI:如何获得jbyteArray大小
  6. 植保飞行器(G 题)--2021 年全国大学生电子设计竞赛
  7. 基于大数据的舆情分析系统架构(架构篇)
  8. 《游戏力》的读后感作文3600字
  9. mysql 上一周起始时间_mysql 某周的起始和结束日期
  10. wordpress Avada主题banner制作
  11. firefox html5 pop,数组的push、unshift、pop、shift方法实现
  12. 机器学习——统计学三大相关性系数(pearson、spearman、kendall)
  13. Python使用selenium自动打开谷歌浏览器和网页
  14. 一张表格搞懂那些特殊的IP地址
  15. word标题前自动分页
  16. MATLAB利用散点进行函数曲线拟合
  17. 嵌入式和服务器Linux系统下free -m Memory统计信息解析
  18. 网易企业电子邮箱的托管账号服务是什么?怎么用?
  19. 怎么用计算机截图快捷键,教您怎么使用电脑自带的截图快捷键
  20. [从零开始学习FPGA编程-41]:视野篇 - 摩尔时代与摩尔定律以及后摩尔时代的到来

热门文章

  1. 动态生成实物文件思路
  2. 如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
  3. redis内存数据的持久化方式
  4. 论docker中 CMD 与 ENTRYPOINT 的区别
  5. jdbc预编译插入数据操作
  6. LeetCode Repeated DNA Sequences
  7. ife task0003学习笔记(三):JavaScript闭包
  8. javascript 检测密码强度 美化版
  9. 圣殿骑士的一篇关于WPF的培训好文,WPF应用与团队开发(转)
  10. 数据采集之登录那些事