《Python参考手册(第4版•修订版)》——1.12 生成器-阿里云开发者社区

开发者社区> 异步社区> 正文

《Python参考手册(第4版•修订版)》——1.12 生成器

简介:
+关注继续查看

本节书摘来自异步社区《Python参考手册(第4版•修订版)》一书中的第1章,第1.12节,作者David M. Beazley,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.12 生成器

如果使用yield语句,可以让函数生成一个结果序列,而不仅仅是一个值,例如:

def countdown(n):
    print "Counting down!"
    while n > 0:
         yield n       # 生成一个值(n)
         n -= 1

任何使用yield的函数都称为生成器。调用生成器函数将创建一个对象,该对象通过连续调用next()方法(在Python 3中是__next__())生成一系列的结果,例如:

>>> c = countdown(5)
>>> c.next()
Counting down!
5
>>> c.next()
4
>>> c.next()
3
>>>

next()调用使生成器函数一直运行,到下一条yield语句为止。此时next()将返回传递给yield的值,而且函数将暂时中止执行。再次调用next()时,函数将继续执行yield之后的语句。此过程持续到函数返回为止。

通常不会像上面这样手动调用next(),而是会使用一个for循环,例如:

>>> for i in countdown(5):
...     print i,
Counting down!
5 4 3 2 1
>>>

生成器是编写基于处理管道、流或数据流程序的一种极其强大的方式。例如,下面的生成器函数模拟了常用于监控日志文件的UNIX tail –f命令的行为:

# tail一个文件(如tail -f) 
import time
def tail(f):
    f.seek(0,2)     # 移动到EOF
    while True:
        line = f.readline()    # 尝试读取一个新的文本行
        if not line:           # 如果没有内容,暂时休眠并再次尝试
             time.sleep(0.1)
             continue
        yield line

下面的生成器用于在很多行中查找特定的子字符串:

def grep(lines, searchtext): 
    for line in lines:
        if searchtext in line: yield line

下面的例子将以上两个生成器合并在一起,创建了一个简单的处理管道:

# UNIX "tail –f | grep python"命令的python实现 
wwwlog = tail(open("access-log"))
pylines = grep(wwwlog,"python")
for line in pylines:
    print line,

生成器的微妙之处在于,它经常和其他可迭代的对象(如列表或文件)混合在一起。特别是在编写如for item in s这样的语句时,s可以代表一个列表、文件的各行、生成器函数的结果,或者支持迭代的其他任何对象。能够在s中插入不同对象,为创建可扩展的程序提供了一个强大的工具。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9950 0
python设计模式(十七):迭代器模式——迭代器与生成器
迭代模式:对外提供一个接口,实现顺序访问聚合数据,但是不显示该数据的内部机制。这就是Python中大名鼎鼎的迭代器。 实现迭代模式对于Python来说没有多余的代码,寥寥几行代码足可以实现迭代模式。 示例code: # -*- coding:utf-8 -*-def FibonacciSeque...
1074 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12061 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13697 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载