本文共 2040 字,大约阅读时间需要 6 分钟。
# -*- encoding: utf-8 -*-import itertools'''7、 第3章_迭代对象与迭代器关键:1 迭代器生成器含义: 是一个函数,按照顺序返回值,执行直到被通知输出一个值,然后继续执行直到再次被通知输出值迭代器含义:包含__next__方法的任何对象可迭代对象含义: 任何定义了__iter__方法的对象。__iter__返回迭代器(实现了__next__方法)特点: 生成器可以是迭代器,但不一定是迭代对象2 标准库中的生成器2.1 rangerange对象的迭代器是一个生成器,返回序列值2.2 dict.items及其家族iterkeys, itervalues和iteritems都是迭代器,是生成器的迭代对象2.3 zip一次可迭代多个可迭代对象同一个索引上的元素,并返回这些可迭代对象的元素组成的元组2.4 mapmap接受函数和多个可迭代对象map(function, iter1, iter2, ...)2.5 文件对象文件对西那个有一个页数方法readline,每次可读取一行数据3 何时编写生成器原则: 只有当需要值时才会确定这个值3.1 分块访问数据没有必要存储整个数据副本应用场景: 打算迭代大量数据的情况3.2 分块计算数据仅仅在需要的时候才计算数据,例如fibonacci序列可能是无穷的4 何时使用生成器单力模式很多生成器是单例模式的。有些迭代对象可以有多个迭代器,有些迭代对象则不可以。5 生成器内部的生成器python 3中引入了yield from,作用: 为生成器提供调用其他生成器的直接方式样例:def visitGeneratorWithPython3(): yield from generator1() yield from generator2()分析:上述被称为生成器委托,任何发送给封装生成器的值都会被发送给当前的委托生成器参考:Python高级编程'''def useMap(): generator = map(lambda x,y: max(x, y), [4, 1, 7], [3, 4, 5]) for value in generator: print valueclass Fibonacci(object): def __init__(self): self.numbers = [] ''' 实现了__iter__方法的都是可迭代对象,返回迭代器(实现__next__方法) ''' def __iter__(self): return self def __next__(self): if len(self.numbers) < 2: self.numbers.append(1) else: self.numbers.append(sum(self.numbers)) self.numbers.pop(0) return self.numbers[-1] def send(self, value): pass ''' 为兼容python2 ''' next = __next__def useIterator(): fib = Fibonacci() iter1 = iter(fib) print next(iter1) print next(iter1) print next(iter1) print next(iter1) print next(iter1) iter2 = iter(fib) print next(iter2)def generator1(): yield 'a' yield 'b'def generator2(): yield 'c' yield 'd'def visitGenerator(): for data in itertools.chain(generator1(), generator2()): yield data# def visitGeneratorWithPython3():# yield from generator1()# yield from generator2()def process(): useMap() useIterator() for value in visitGenerator(): print valueif __name__ == "__main__": process()
转载地址:http://ivlfn.baihongyu.com/