可以先看下这篇文章: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. 硬核万字长文,深入理解 Java 字节码指令(建议收藏)

    Java 字节码指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,"Java 字节码难学吗?我能不能学会啊?" 讲良心话,不是我谦虚,一开始学 Java 字 ...

  2. Redis.conf分析

    Redis.conf 单位 配置文件对大小写不敏感 # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1m ...

  3. 使用js实现全选功能。(全选,全不选,反选)

    作业210721 提交代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. Spring Cloud 专题之六:bus

    书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...

  5. 通读BadCode

    简介 就是旋哥的BadCode系列,这次好好通读下,然后我在旋哥的注释上又加了一些,函数原型等. 项目地址:https://github.com/Rvn0xsy/BadCode 第一课 主要介绍了下c ...

  6. Python语法之用户交互与基本运算符

    一.与用户交互 1.接收用户输入 python3中的input会把用户输入的所有内容都存成str类型 age = input("请输入您的年龄: ") # "内容&quo ...

  7. Android太太太太太卷了,累了

    我们聊到互联网行业的时候,一个不可避免的话题就是"内卷",而在程序员这个群体中,Android,绝对是卷得最厉害的. 毕竟前几年Android兴起的时候,入门门槛低,培训机构培养了 ...

  8. Flutter 中的动画

    Flutter 中动画的创建有很多种, 需要根据具体的需求选择不同的动画.如果只是简单的布局等的动画直接使用最简单的隐式动画就可以了,因为隐式动画是由框架控制的,所以仅仅只需要更改变需要变化属性就可以 ...

  9. Nacos 权限控制介绍及实战

    方案背景 Nacos自开源依赖,权限控制一直需求比较强烈,这也反应了用户需求将Nacos部署到生产环境的需求.最新发布的Nacos 1.2.0版本已经支持了服务发现和配置管理的权限控制,保障用户安全上 ...

  10. Ubuntu上安装gevent

    安装libevent; 安装greenlet: sudo easy_install gevent (need net access) bingo! -> python-dev -> lib ...