首页 > 代码库 > 迭代器
迭代器
为什么要用迭代器,先看看它的优点与缺点
优点:
1: 迭代器提供了一种不依赖于索引的的取值方式,这样就可以遍历没有索引的可迭代对象(如:字典\集合)
2:迭代器与列表比较,迭代器惰性计算的,更节省内存
缺点:
从列表取值是一次一个,迭代器也是一次一个,迭代器不知道某个值的位置,只能next取值。但是列表可以取出列表某个位置的值, 无法获取迭代器的长度。
迭代器是一次性的和只能往前,在next()以后 就不能返回去再取走过的那一个值了。 而列表可以取某个位置的值。
迭代器则只能下一个、下一个。
eg=(‘%s‘%i for i in range(100)) print(next(eg)) print(next(eg)) print(next(eg))
而列表可以来回取值。
li=[1,2,3,4,5] print(li[3]) print(li[0])
只要有 __iter__方法,就是可迭代的对象,如下图:
可以next,就是迭代器,如下图:
还有就是经常操作的文件,文件本身就是迭代器:带有__next__方法:
判断是否是迭代器:
下面都是可迭代的,都有iter方法。 但是判断不了是否是 迭代器
s=‘hello‘ l=[1,2,3] t=(1,2,3) d={‘a‘:1} set1={1,2,3,4,} f=open(‘a.txt‘) s.__iter__() l.__iter__() t.__iter__() d.__iter__() set1.__iter__() f.__iter__() print(isinstance(s,Iterable))
判断是否是迭代器:
print(isinstance(s,Iterator)) print(isinstance(f,Iterator))
生成器函数:
生成器函数:
生成器与 return 有何区别:
return 只能返回一次函数就彻底结束,而yield 能返回多次值,这就是生成器。
生成器就是一个函数,这个函数内包含有yield 这个关键字
#yield 到底干了什么事情:
1、yield 把函数变成生成器--> 就是迭代器
2、yield 用 return 返回只能返回一次,而yield返回多次
3、函数在暂停以及继续下一次运行时的状态是由yield 保存
4、yield 相当于 将 __iter__() __nex__() 封装成 yield 了,就成了迭代器
yield 可以帮助我们 ,自己做for i in name: 这样的事情:
当碰到yield就停下来:凡是有yield 的函数 就是生成器:
def countdown(n): print(‘start countdown‘) while n>0: yield n n-=1 print(‘done‘) g=countdown(5) # for i in g: # print(i) while True: try: print(next(g)) except StopIteration: break
模拟linux 的tail 命令与grep命令的作用:
file_path=‘/self_study/2017-04-11/a.txt‘ def cat(file_path): with open(file_path,‘r‘) as cat_re: for line in cat_re: yield line res=cat(file_path) def grep(pattern,lines): for line in lines: if pattern in line: yield line iterone=grep(‘apple‘,res) for i in iterone: print(i)
迭代器