可以先看下这篇文章:http://www.cnblogs.com/jiangtu/articles/6662043.html

原篇是转载的:http://www.python-tab.com/html/2015/pythonhexinbiancheng_0415/946.html  (去掉连字符 - ,博客园显示违禁字。。)

之前对 yield表达式 了解的也不清楚,只知道包含 yield表达式 的函数 会被编译成迭代器,如以下代码:

def g(n):
for i in range(n):
yield i **2 # 打印输出
for i in g(5):
print i # 输出
0, 1, 4, 9, 16

函数 g(n) 包含 yield表达式,所以 g(n) 被编译成迭代器。

插一句:范围都是左开右闭 类似:[..)  (加强记忆 - -.)

但是之后碰到过,一个函数内有多个 yield表达式,或者 yield表达式 前有 return 语句,或者 yiled return 语句,又代表什么呢?(其实g(n)中就有多个 yield表达式的,可是当初我没想到。。)

通过如下代码,可以了解些其过程:

1 # coding:utf-8
2 def g():
3 print "第一次yield之前"
4 yield "第一次yield"
5 print "第二次yield之前"
6 d = yield "第二次yield"
7 print d
8 print "函数结尾,之后没有yield"

输出结果为:

 1 >>> import test
2 >>> fun = test.g()
3 >>> fun
4 <generator object g at 0x7f422a6c3460>
5 >>> fun.next()
6 第一次yield之前
7 '\xe7\xac\xac\xe4\xb8\x80\xe6\xac\xa1yield'
8 >>> fun.send("None")
9 第二次yield之前
10 '\xe7\xac\xac\xe4\xba\x8c\xe6\xac\xa1yield'
11 >>> fun.send("see send function")
12 see send function
13 函数结尾,之后没有yield
14 Traceback (most recent call last):
15 File "<stdin>", line 1, in <module>
16 StopIteration

可以看出,

  • 函数确实被编译成迭代器(line 3~4),
  • 返回迭代器的下一个元素时,即 fun.next() ,
    • 会执行 迭代器当前位置到下一个yield中间的代码段(line5~7),
    • 返回值为下一个yield表达式的值(line 7)。

总结下,就是:包含yield表达式的函数会被编译成迭代器返回,并且,对此迭代器进行迭代时,会将 yield表达式间的代码执行,并将yield表达式后的值作为返回值返回。First next是函数开始到第一个yield表达式,如果末尾没有yield表达式,最后一次迭代会抛异常(StopIteration)。(for循环会检测异常且自动调用next() )

至于 yield return ,直接报错。。但是我怎么记得在哪看到过呢?

其次,可以通过 fun.send(msg) 可以msg赋值给yield表达式,即 "yield '第二次yield' ",所以d的值会是msg。

即:fun.next() == fun.send(None)  详细可以看开头转载的那篇文章

最后,yield表达式在一定程度上实现了协程,参见连接:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000

yield表达式 python语法的更多相关文章

  1. Python语法 - yield表达式(类似 m = yield i )

      yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法, yield表达式可以接收send()发出的参数,yield表达式是跟send方法一起配合使用   send方 ...

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

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

  3. Python语法速查: 5. 运算符、math模块、表达式

    返回目录 (1)一些较容易搞错的运算符 一般简单的如加减乘除之类的运算符就不写了,这里主要列些一些容易搞错或忘记的运算符.运算符不仅仅只有号,有一些英文单词如 in, and 之类,也是运算符,并不是 ...

  4. python语法学习第五天--lambda表达式、filter()、map()

    lambda表达式 python使用lamda表达式来创建匿名函数 lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数 语法: lambda [arg1 [,arg ...

  5. python 之 yield表达式

    如果在某个函数中包含了yield, 这意味着这个函数已经是一个Generator, 它的执行 会和其他普通的函数有很多不同. 比如: def   h(): print    'To   be  bra ...

  6. Python 3 中生成器函数yield表达式的使用

    生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yi ...

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

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

  8. python之yield表达式

    yield表达式用于generator function 调用generator function时,返回一个iterator(函数内语句不被会执行),调用iterator函数时,执行到yield表达 ...

  9. python语法之一

    Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...

随机推荐

  1. react native踩坑记录

    一 .安装 1.Python2 和Java SE Development Kit (JDK)可以直接通过腾讯电脑关键安装, Android SDK安装的时候路径里不能有中文和空格 2.配置java环境 ...

  2. 通过jstack日志分析和问题排查

    简介 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁.死循环 ...

  3. AJAX的学习与使用>前端技术系列

    目录 AJAX的学习与使用 什么是AJAX 为什么要使用AJAX AJAX接收服务器响应数据的3种格式 文本格式(重要) JSON格式(重要) 服务器端响应实体类JSON格式的3种方式 修改实体类的t ...

  4. Mybatis学习笔记-复杂查询

    多个学生,对应一个老师 对于学生而言,关联:多个学生关联一个老师[多对一] 对于老师而言,集合:一个老师,有多个学生[一对多] 复杂查询环境搭建 数据库搭建 CREATE TABLE `teacher ...

  5. 攻防世界misc——János-the-Ripper

    攻防世界misc---János-the-Ripper 附件题目,题目的文件名为:misc100. 下载后,拖入linux中,binwalk发现有隐藏文件.用"strings  János- ...

  6. 我们是Android开发,我们都有着光明的未来

    作为一名程序员经常会逛v2ex论坛,前几天逛着玩的时候忽然发现一篇文章,标题非常吸引眼球名字叫中年危机的终极解法,作为一个步入而立之年的老人,心里非常激动,到底是啥解决法呢,于是迅速点进去查看. 进去 ...

  7. 【C++】使用 libass,完成 Direct3D 11 下的字幕渲染

    前言 前段时间曾经写过一个视频播放器:https://www.cnblogs.com/judgeou/p/14746051.html . 然而这个播放器却无法显示出外挂或者内封的字幕,这里要稍微解释一 ...

  8. 记一次在Windows10桌面环境搭建Jekins的吐血经历

    目录 写在前面 故事背景 踩坑详情 最后总结 写在前面 首先声明,除非万不得已,千万不要在Windows环境做这个事情,否则就等着各种坑吧. 本人一贯的立场都是坚持用正确的方法做事,显然在Window ...

  9. Java中解决多线程数据安全问题

    同步代码块 基本语句 synchronized (任意对象) { 操作共享代码 } 代码示例 public class SellTicket implements Runnable { private ...

  10. Docker部署Mysql实践

    前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...