yield表达式 python语法
可以先看下这篇文章: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语法的更多相关文章
- Python语法 - yield表达式(类似 m = yield i )
yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法, yield表达式可以接收send()发出的参数,yield表达式是跟send方法一起配合使用 send方 ...
- Python基础(9)_生成器(yield表达式形式)、面向过程编程
一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...
- Python语法速查: 5. 运算符、math模块、表达式
返回目录 (1)一些较容易搞错的运算符 一般简单的如加减乘除之类的运算符就不写了,这里主要列些一些容易搞错或忘记的运算符.运算符不仅仅只有号,有一些英文单词如 in, and 之类,也是运算符,并不是 ...
- python语法学习第五天--lambda表达式、filter()、map()
lambda表达式 python使用lamda表达式来创建匿名函数 lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数 语法: lambda [arg1 [,arg ...
- python 之 yield表达式
如果在某个函数中包含了yield, 这意味着这个函数已经是一个Generator, 它的执行 会和其他普通的函数有很多不同. 比如: def h(): print 'To be bra ...
- Python 3 中生成器函数yield表达式的使用
生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yi ...
- python函数式编程之yield表达式形式
先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res ...
- python之yield表达式
yield表达式用于generator function 调用generator function时,返回一个iterator(函数内语句不被会执行),调用iterator函数时,执行到yield表达 ...
- python语法之一
Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...
随机推荐
- Jenkins(8080)未授权访问
下载地址http://mirrors.jenkins.io/debian/ 测试 浏览器访问http://localhost:8080/manage可以直接访问 点击脚本命令行 println &qu ...
- wireshark常见分析
转载于https://www.cnblogs.com/sn1per/p/12553064.html https://www.cnblogs.com/csnd/p/12332421.html 直接看上面 ...
- 开发者如何快速搭建自己的电商App?
面向电商购物场景,HMS Core提供了创新的电商解决方案,帮助应用快速获客.提升转化率,实现业务增长.为了帮助开发者了解如何在电商购物类应用中集成HMS Core的各项能力,HMS Core开发了电 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...
- 一专属SRC - XSS - Bypass长亭Waf
bypass是预言表哥绕的,擦,我这篮子玩xss什么都绕不过 https://www.cnblogs.com/yuyan-sec 这博客我直接倒背如流 主要记录下这次挖掘的过程 先说下 bypass姿 ...
- 且看一文梳理VS2019中dll的创建使用
动态链接库(dll) Windows下有静态链接(lib)库和动态链接库(dll)两种共享代码的方式. 本文将介绍dll的应用场景,以及在vs2019平台下的生成和使用. 今天的笔记内容说的是平时经常 ...
- 3 分钟了解 JSON Schema
大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...
- HTTP协议之:HTTP/1.1和HTTP/2
目录 简介 HTTP/1.1 HTTP/2 传输模式对比 流优先级 缓冲区溢出处理 预测资源请求 压缩 总结 简介 HTTP的全称是Hypertext Transfer Protocol,是在1989 ...
- .net 温故知新:【5】异步编程 async await
1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...
- 【网络编程】TCPIP-小笔记集合
目录 前言 TCP/IP 网络编程笔记散集 参考 前言 主要记录TCPIP一些小笔记 说明: demo 基于 Linux. TCP/IP 网络编程笔记散集 快速入门: I/O 缓冲: I/O 缓冲在每 ...