可以先看下这篇文章: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. Laravel Ignition 2.5.1 代码执行漏洞(CVE-2021-3129)

    影响范围 Laravel 框架 < 8.4.3 facade ignition 组件 < 2.5.2 poc git clone https://github.com/simonlee-h ...

  2. upload-lab 靶场实战

    文件上传/下载 漏洞 冲冲冲,好好学习 2020.02.13 淦靶场之前,先来点知识铺垫铺垫. 文件上传漏洞 前端Js绕过. MIME类型绕过 后缀名大写写绕过 / php4 .php5 00截断 覆 ...

  3. Adaptive AUTOSAR 学习笔记 12 - 通信管理

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf 缩写 CM:Communicatio ...

  4. 3.python编程与计算机的关系,如何执行python文件

    上一节预告了这一章想讲如何不停地和世界打招呼,这涉及到编程中一个重要的概念:循环. 但经过了两周断更后细想了一下,不行,我们得对上一章进行补充,而且这个补充非常关键!也印证了上一章所说的: 上一节章很 ...

  5. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  6. 【Android面试查漏补缺】之事件分发机制详解

    前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...

  7. Unsatisfied dependency expressed through field 'rabbitTemplate'错误总结

    1. 在springboot中整合RabbitMq的过程中,遇到如下错误:(截取部分) org.springframework.beans.factory.UnsatisfiedDependencyE ...

  8. [开源]入坑Qt,我的第一个小程序:MD5计算器

    版权声明 --------- 本文仅在知乎与博客园发布.开发者为szx0427 MFC和Win32搞了好几年了,也算是懂了个皮毛,但是一直觉得用这两者开发软件都很麻烦,需要将大量的代码花费在UI等地方 ...

  9. Linux中DNS分离解析

    目录 一.分离解析概述 二.DNS分离解析实验 要求 实验步骤 一.分离解析概述 分离解析:同一个dns服务器,同一个域名情况下,不同网段进行访问会解析出不同的IP地址 分离解析的域名服务器实际也是主 ...

  10. Shell-10-标准输入输出错误

    标准输入输出和错误 标准输入.输出和错误 重定向符号 示例 1 1 标准输出 2 错误输出 2 标准输出和错误输出同时定向到一个文件中 >share.txt 2>&1 3 > ...