Python语言之Python迭代器和生成器
小标 2018-08-09 来源 : 阅读 1047 评论 0

摘要:本文主要向大家介绍了Python语言之Python迭代器和生成器,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言之Python迭代器和生成器,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

迭代器:
  迭代的意思是重复做一些事很多次——就像循环一样。我们经常在for循环中对列表或字典进行迭代,但事实上也能对其它对象进行迭代,只要该对象实现了__iter__方法。__iter__方法返回一个迭代器(iterator),迭代器就是具有next方法(该方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,则会引发一个StopIteration异常。更精确的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。
  说到这,那我们为什么要使用迭代器?因为迭代器更通用、更简单、更优雅。举个例子,创建一个迭代器,每次返回的数都在原基础上加2:

class add():
    def __init__(self):
        self.a = 0
        self.b = 2
    # python3中迭代器对象应该实现__next__方法,而不是next方法,而新的内建函数next可以用于访问这个方法。
    # 换句话说,next(it)等同于python2中的it.next()。
    def __next__(self):
        self.a = self.a + self.b
        return self.a
    def __iter__(self):
        return self

  这里需要注意的是,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身,这样操作,程序就能返回所需的迭代器,就能直接在for循环中使用迭代其本身了。请看下述例子:

#创建一个add对象,可以在for循环中使用该对象
Add = add()
for i in Add:
    if i > 2000:
        print(i)
        break

#输出结果:
2002

   迭代器有两个重要方法:iter() 和 next(),内建函数iter可以从可迭代对象中获取迭代器,next函数可以获取它返回的下一个值。举个例子:

list = [1,2,3,4,5]
it = iter(list)
while True:
    try:
        print(next(it))  #或者 it.__next__()
    except Exception as e:
        break

生成器:
  任何包含yield语句的函数称为生成器,跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。举个例子:

import sys

def fibonacci(n): #生成器函数 - 斐波那契
    a,b,no = 0,1,0
    while True:
        if (no > n):
            return
        yield a
        a,b = b,a+b
        no += 1

f = fibonacci(20) # f是一个迭代器,由生成器返回生成

while True:
    try:
        print(next(f),end=",")
    except StopIteration:
        sys.exit()

#运行结果:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程