Python高级编程 读书笔记: 7、 第3章_迭代对象与迭代器

# -*- encoding: utf-8 -*-

import itertools

'''
7、 第3章_迭代对象与迭代器

关键:
1 迭代器
生成器含义: 是一个函数,按照顺序返回值,执行直到被通知输出一个值,然后继续执行直到再次被通知输出值
迭代器含义:包含__next__方法的任何对象
可迭代对象含义: 任何定义了__iter__方法的对象。__iter__返回迭代器(实现了__next__方法)
特点: 生成器可以是迭代器,但不一定是迭代对象

2 标准库中的生成器
2.1 range
range对象的迭代器是一个生成器,返回序列值
2.2 dict.items及其家族
iterkeys, itervalues和iteritems都是迭代器,是生成器的迭代对象
2.3 zip
一次可迭代多个可迭代对象同一个索引上的元素,并返回这些可迭代对象的元素组成的元组
2.4 map
map接受函数和多个可迭代对象
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 value


class 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 value


if __name__ == "__main__":
    process() 

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/89153571