首页 > 代码库 > 迭代器

迭代器

为什么要用迭代器,先看看它的优点与缺点

优点:

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)

迭代器