您的位置:首页 > 编程语言 > Python开发

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()))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: