首页 > 编程语言 > 详细

Python3-设计模式-迭代器模式

时间:2017-03-16 17:29:05      阅读:241      评论:0      收藏:0      [点我收藏+]

Python3中的迭代器

  迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存

  注:

    1.只能按照顺序一个一个的通过__next__()访问下一个元素,不能随机访问

    2.只能从头访问到尾,不能访问到中间元素的时候,在去访问前面的元素

    3.Python3中访问下一个元素可以使用标准的函数next(iter)了

    4.如果已经迭代完全部元素,再次调用next(item)则引发异常StopIteration

技术分享
# 使用iter()构造方法创建一个迭代器
it = iter([1, 2, 3, 4, 5, ])
print(next(it))    # 输出结果 1
print(next(it))    # 输出结果 2
print(next(it))    # 输出结果 3
print(next(it))    # 输出结果 4
print(next(it))    # 输出结果 5
print(next(it))    # 输出结果 引发异常:StopIteration
1.使用构造函数创建迭代器
技术分享
# Python内置的 for...in语法访问集合就是使用的迭代的方式 
with open("readme.txt", encoding="utf-8") as log_file:
    for line in log_file:
        print(line)
2.使用for...in迭代会自动结束,不会出现异常

 

Python3中的生成器

  如果一个函数中出现了yield语句,那么这个函数将不再是普通的函数,它将变成生成器函数,生成器函数返回的是一个迭代器,这个函数可以被yield中断,并记录中断的状态,下次还可以继续执行,可以理解为迭代的开始就是函数的开始,迭代的结束就是函数的结束,生成器是比较快捷的创建一个迭代器的方式

技术分享
# 生成器函数,为了便于理解这里没有用循环
def generator_func(count):
    yield_value = "yield_value的默认值"
    print("--------第1个yield之前的代码------------")
    print("yield的值:", yield_value)
    print("count的值:", count)
    count += 1
    yield_value = yield count
    print("--------第2个yield之前的代码------------")
    print("yield的值:", yield_value)
    print("count的值:", count)
    count += 1
    yield_value = yield count
    print("--------第3个yield之前的代码------------")
    print("yield的值:", yield_value)
    print("count的值:", count)
    count += 1
    yield_value = yield count
    print("--------第3个yield之后的代码------------")
    print("yield的值:", yield_value)
    print("count的值:", count)


# 调用生成器函数,返回了一个迭代器对象 gtr
gtr = generator_func(0)

# 虽然类型显示 generator(生成器的意思) 但它是个迭代器
# 可以说生成器就是迭代器,返回这种迭代器的函数叫生成器函数
print(type(gtr))

# 我们可以调用 next(gtr) 或 gtr.send(obj) 来执行上一个yield之后的代码
# 没有上一个yield,就执行第一个yield之前的代码
# next(gtr)和gtr.send(obj)的唯一不同是:
#   gtr.send(obj)会把上一个yield赋值为obj
# 所以如果第一次迭代使用的是gtr.send(obj)方法
# 那一定要这么写: gtr.send(None),因为在这之前并没有上一个yield
# 而且,gtr.send(obj) + next(gtr)有效执行次数(不报错)之和等于最大迭代次数
# 另外,如果yield之后有个对象,那么在执行next(gtr)或gtr.send(obj)时,会将其返回
# 最后,Python3中的 next(gtr) 等价于 gtr.__next__()
gtr.send(None)
next(gtr)
next(gtr)
生成器代码解析

 

Python3-设计模式-迭代器模式

原文:http://www.cnblogs.com/qq1207501666/p/6560403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!