---恢复内容开始---

iterable 可迭代的

       str,列表,tuple,set ,dict 都是可迭代的

       可迭代的对应的标志__iter__

可迭代协议:

           用print('__iter__'in dir([1,2,3]))判断一个变量是否可迭代

           凡是可迭代的变量内部都有一个__iter__方法

迭代器协议:迭代器既有__iter__方法,又有__next__方法

迭代器   : 内置__iter__,__next__方法    大部分都是在python的内部去使用的我们直接拿来用就行了

判断是否是迭代器和可迭代对象的简便方法:

s='abc'

print(isintance(s,Iterable))(判断是否是可迭代的)

print(isintance(s,Iterator))(判断是否是迭代器)

不管是一个迭代还是一个可迭代的对象,都可以用for循环遍历

迭代器出现的原因:帮你节省内存

迭代器的特点:

                   1.可用for循环

                   2.可以节省内存

                   3.只能用一次

生成器:(generator)

生成器的本质是迭代器

1.生成器函数,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是生成器返回按需要产生结果的一个对象,而不是一次构建一个结果列表

生成器函数:

初识生成器

生成器监听文件输入:

import time

def dail(filename):

     f=open(filename)

     f.seek(0,2)#从文件末尾算起

      while True:

              line=f.redline()#读取文件中新的问本行

              if not line:

                     time.sleep(0.1)

                     continue

                yield line

tail_g = tail('tmp')

for line in tail_g:

       print(line)

计算移动平均值:

def wrap(func):
def inner(*args,**kwargs):
g = func(*args,**kwargs)
next(g)
return g
return inner

@wrap
def averager():
total = 0
day = 0
avrage = 0
while True:
day_num = yield avrage #return avrage
total += day_num
day += 1
avrage = total/day

列表推导式和生成器表达式

例子:

#老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥

egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析

#峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下

laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
print(laomuji)
print(next(laomuji)) #next本质就是调用__next__
print(laomuji.__next__())
print(next(laomuji))

总结:

把列表解析的[]换成()得到的就是生成器表达式

列表解析与生成器表达式都是一种便利点的编程方式,只不过生成器表达式更节省内存

Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和

 

posted on 2017-08-03 00:15  无痕5201314  阅读(171)  评论(0编辑  收藏  举报