# -*- 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()
Python高级编程 读书笔记: 7、 第3章_迭代对象与迭代器
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/89153571
今日推荐
周排行