python之生成器
2016-06-04 17:26
316 查看
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,函数挂起。
相关文章推荐
- 使用flask 发送电子邮件时候遇到的几个问题
- 使用python操作solr
- python爬虫:批量下载qq空间里的照片(一)
- Python logging模块
- Python Flask Web 第七课 —— 使用 flask-moment 本地化日期和时间
- [Lintcode 3sum]三数之和(python,二分)
- Python--基础学习--初识
- Python查看远程主机端口是否开放以及BashShell实现
- 素数生成器
- python—threading.thread【threading模块介绍01】
- Python 语法详解
- 使用Python的Flask框架构建大型Web应用程序的结构示例
- Python学习笔记 —— 逻辑语句
- 在Python的Flask框架中构建Web表单的教程
- python 压缩 解压缩 文件
- Python3学习:urllib的使用方法
- python 转义字符
- python综合练习1-- 用户登录
- python综合练习1-- 用户登录
- Python3.5 在Ubuntu16.04上无法画图的解决方案