---恢复内容开始---
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的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和