迭代器

Posted Cloud-Tony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器相关的知识,希望对你有一定的参考价值。

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

优点:

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__方法,就是可迭代的对象,如下图:

wps2059.tmp[4]

 

可以next,就是迭代器,如下图:

image

 

还有就是经常操作的文件,文件本身就是迭代器:带有__next__方法:

wps5253.tmp

 

判断是否是迭代器:

下面都是可迭代的,都有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)

以上是关于迭代器的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

行历史查看器 - Git

持久片段和查看器

损坏的顶点和片段着色器

python使用上下文对代码片段进行计时,非装饰器

设计模式迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )