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之生成器的更多相关文章

  1. python 列表生成器

    python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...

  2. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  3. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  4. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  5. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

    yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...

  6. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  7. Python的生成器进阶玩法

    Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...

  8. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

  9. python中生成器对象和return 还有循环的区别

    python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...

  10. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

随机推荐

  1. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

  2. 解读AppIcon图标设置置信息和App内存警告临界值

    前面有同学问到了iOS内存警告临界值和工程项目里AppIcon的一些配置信息,相信对刚入行的同学来说,可能都会碰到类似的问题,记录一下供后来者查询. 1.先简单说下AppIcon的图标的配置信息 1) ...

  3. 【代码笔记】iOS-页面调的时候隐藏工具条

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...

  4. javascript - 状态模式 - 简化分支判断流程

    状态模式笔记   当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象   状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...

  5. 2015-12-01 SQL查询语句基础

    1.查询全体学生的学号与姓名select sno,snamefrom student;3.查询全体学生的详细信息select *from student;4.查询全体学生的姓名及其出生年份select ...

  6. uva 129 krypton factors ——yhx

     Krypton Factor  You have been employed by the organisers of a Super Krypton Factor Contest in which ...

  7. Servlet编程

    Servlet编程 1. servlet概念及相关接口简介 java Servlet是运行在web服务器或应用服务器上的程序,他是作为来自web浏览器或其他HTTP客户端的请求和HTTP服务器山的数据 ...

  8. 【repost】浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具[2]常见引擎 渲染引擎: firef ...

  9. [LeetCode] All O`one Data Structure 全O(1)的数据结构

    Implement a data structure supporting the following operations: Inc(Key) - Inserts a new key with va ...

  10. [LeetCode] Word Break 拆分词句

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...