python之生成器
def repeater(value):
while True:
new = yield value
print(first, new)
if new is not None:
value = new
print('second', value)
1.调用函数,并且使用next()方法
>>>r = repeater(42)
>>>type(r)
<class 'generator'>
>>>next(r)
42
理论知识
生成器是一个包含yield关键字的函数。当被调用时,在函数中的代码不会被执行,而会返回一个迭代器。每次用next()方法请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句挂起该函数并向调用者发送回一个值,但是函数会保留足够的状态以使它被唤醒时就从停止的那点继续执行。而return语句意味着函数要停止执行。
调用next方法时,迭代器会返回它的下一个值。
代码分析
第一行:函数调用,返回一个迭代器,但是不会执行repeater中的代码,参数value =42。
第二行:用next()方法请求一个值。执行函数中的代码,直到遇到yield语句,也就是到第三行,yield语句生成值42。然后函数挂起(暂停执行,并等待重新唤起)。注意:此时new还未和yield返回值绑定。
2.继续使用next()方法访问
>>>next(r)
('first', None)
42
理论知识
当生成器重新(不是第一次,即之前运行过yield语句)被运行的时候,yield方法返回一个值——若调用next()方法,返回None; 若调用send方法,yield表达式返回send方法发送的值。
代码分析
调用next()方法,函数被唤醒。yield语句返回None(注意:此时value的值并没有重新绑定,仍然为42),new和返回值None绑定。执行print语句。if语句判断为假,此次循环结束。while语句判断为真,遇到yield语句,返回value值42,函数挂起。
3.使用send()方法
>>>r.send('hello')
('first', 'hello')
('second', 'hello')
'hello'
代码分析
调用send方法后,yield返回hello(注意:value值仍然为42),并和变量new绑定,即new=hello。执行print语句。if语句判断为真,value值重新绑定为hello,并且执行print语句。while语句为真,继续循环执行代码,直到调用了yield方法,而yield方法返回value值hello,函数挂起。
4.再次使用next()方法
>>>next(r)
('first', None)
'hello'
代码分析
调用next方法后,yield返回None(value绑定值并没有改变,仍然为hello),并和new绑定。执行print语句。if语句判断为假.while判断为真,执行yield语句返回value的值hello,函数挂起。
python之生成器的更多相关文章
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
- python 迭代器 生成器
迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- python中和生成器协程相关yield from之最详最强解释,一看就懂(二)
一. 从列表中yield 语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...
随机推荐
- GreenDao2.2升级GreenDao3.0的适配之路
前言.为什么要升级到Greendao3.0? 1. 多人开发 以往的数据库建表建Dao等操作要新开一个module,在统一的地方管理数据库建表,现在可以直接写Entity.多人开发时自己管自己的Ent ...
- mac下查看.mobileprovision文件及钥匙串中证书.cer文件
mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...
- ASP .NET MVC 之Entity Framework入门教程及源码
本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework 快速门 实验环境: OS: Windows Server 20 ...
- MySQL学习笔记
数据库 P3306create database [if not exists] db_name [characterset gbk];use database;//跳转数据库show databas ...
- CentOS安装Nginx-1.6.2+安全配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 在安装Nginx之前,请确保已经使用yum安装了pcre等基础组件,具体见<CentOS安装LNMP环境的基础 ...
- x01.MagicCube: 简单操作
看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...
- Web服务
Web服务的相关信息 Apache服务器是web服务的重要应用 在这也是讲的apache 这里需要安装一个http服务软件才行! Apache的根文档在/var/www/html 主配置文件 /e ...
- [译]Thinking in React
编者按 使用React的思想来构建应用对我在实际项目中以及帮助他人解决实际问题时起到了很大作用,所以我翻译此文来向那些正在或即将陷入React或React-Native深坑的同胞们表示慰问.网上已经有 ...
- [python]获取网页中内容为汉字的字符串的判断
实际上是这样,将获取到网页中表单内容与汉字字符串作比较,即: a = request.POST['a'] if a == '博客园': print 'ok' else: print 'false' a ...
- Which language is best, C, C++, Python or Java?什么编程语言最好
Either you fuck the life or the life fucks you. 转载自 quora 大致翻译一下,不喜勿喷,谢谢支持!以下是内容: I have used each o ...