python中的迭代器与生成器
2018-01-03 19:06
363 查看
迭代器
迭代器的引入
假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式?1、通过索引取值 ,如了l[0],l[1]
2、通过for循环取值
for i in l: print(i)#xxx
但你有没有想过,我们为什么可以使用for循环来取值?
for循环内部是怎么工作的呢?
迭代器
对于一个列表li=[1,2,3,4],我们可以通过这种方式来取值li=[1,2,3,4] for i in li: print(i)
但是如果把li换成li=1234呢
可以看到报出这样一行错误 TypeError: 'int' object is not iterable
这就引出了迭代(iterable)
什么叫迭代:
首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代。那么如果“可迭代”,就应该可以被for循环了。这个我们知道呀,字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的。
迭代就是我们刚刚说的,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。
可迭代协议
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。我们来验证一下
print(dir([1,2])) print(dir((2,3))) print(dir({1:2})) print(dir({1,2}))
移动平均值
def init(func): #在调用被装饰生成器函数的时候首先用next激活生成器 def inner(*args,**kwargs): g = func(*args,**kwargs) next(g) return g return inner @init def averager(): total = 0.0 count = 0 average = None while True: term = yield average total += term count += 1 average = total/count g_avg = averager() # next(g_avg) 在装饰器中执行了next方法 print(g_avg.send(10)) print(g_avg.send(30)) print(g_avg.send(5))
计算移动平均值2
yield from
def gen1(): for c in 'AB': yield c for i in range(3): yield i print(list(gen1())) def gen2(): yield from 'AB' yield from range(3) print(list(gen2()))
相关文章推荐
- python 迭代器与生成器即迭代协议的特别说明
- python中的迭代器和生成器
- Python容器、迭代器、生成器
- 小论python的迭代器和生成器
- python学习笔记-生成器,迭代器,协程定义
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python的迭代器和生成器详解
- Python 三目运算,列表解析,装饰器,迭代器和生成器
- python迭代器,生成器
- 【Python3之迭代器,生成器】
- [python]迭代器与生成器
- python3 迭代器与生成器整理12.24
- python的迭代器与生成器实例详解
- 深入讲解Python中的迭代器和生成器
- Python高手之路【九】python基础之迭代器与生成器
- python基础-生成器,迭代器
- Python3 迭代器与生成器
- Python迭代对象、迭代器、生成器
- python基础-迭代器、for底层机制、生成器、list结合yield、__call__、yield函数列表
- python学习-Day15-python生成式和生成器、迭代器、装饰器