5.迭代器

2022-04-04  本文已影响0人  软件开发技术修炼

1. 迭代器的概念

迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可迭代对象实现了iter方法,该方法返回一个迭代器对象;可以使用内置函数iter(),把这些都变成Iterator(迭代器)
它是一个带状态的对象,任何实现了iternext()方法的对象都是迭代器

2. 可以直接作用于for循环的数据类型

(1) 集合类数据类型,如list, tuple, dict, set, str等
(2) generator,包括生成器和带yield的generator function.
以上这些直接作用于for循环的对象统称为可迭代对象:Iterable.

3. 判断一个对象是不是可迭代对象(Iterable)

可以使用isinstance,需要导入模块

from collections import Iterator
from collections import Iterable

print(isinstance("abc",Iterable))   # 字符串为可迭代对象
print(isinstance("abc",Iterator))   # 字符串不为迭代器
print(isinstance(iter("abc"),Iterator))   # 转为迭代器

以下类型:str / list / tuple / dict / set / for 都为可迭代对象

print(isinstance([1,4,6], Iterable))
print(isinstance((1,'a',3), Iterable))
print(isinstance({1,2,3}, Iterable))
print(isinstance({"a":"ko","value":2}, Iterable))
print(isinstance((x for x in range(10)), Iterable))

'''for item in Iterable   循环的本质:
先通过iter()函数获取可迭代对象Iterable的迭代器,
(在后台for语句对容器对象调用iter()函数,iter()函数会返回一个定义了next()方法的迭代器对象)
然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束'''

4. 自定义迭代器

把一个类作为一个迭代器,需要在类中实现两个方法:iter() 与 next()

class Fib(obj):

    def __init__(self,max):
        super(Fib,self).__init__()
        self.max = max
    def __iter__(self):
        self.a = 0
        self.b = 1
        return self
    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

5. 常见几种迭代器:range、 zip 、 enumerate 、 filter 、 reduce

zip生成列表,生成字典
zip()函数接受一系列可迭代对象作为参数,将不同对象中相对应的元素打包成一个元组(tuple),返回由这些元组组成的list列表

l1 = [1,3,6]
l2 = [5,8,9]
for (x,y) in zip(l1,l2):
    print(x,y,x+y)

#结果:
1 5 6
3 8 11
6 9 15
    
keys = ['a','c','f']
vals = [1,7,3]
D2 = {}
for (k,v) in zip(keys,vals): D2[k]=v
print(D2)

#结果:{'a': 1, 'c': 7, 'f': 3}

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环中

enumerate(seq, [start=0]) ,返回枚举对象

seasons = ['spring', 'summer', 'winter']
a = list(enumerate(seasons))
for i,element in enumerate(seasons):
  print(i,element)

#结果:
0 spring
1 summer
2 winter

6、

'''
yield ,首先可以看成return,程序返回某个值,返回后程序不再往下运行
generator的一部分:带yield的函数为真正迭代器
'''

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)

g = foo()
print(next(g))
print("*"*20)
print(next(g))

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("20*"*20)
print(g.send(7))

def foo(num):
    print("starting...")
    while num < 10:
        num = num + 1
        yield num
for n in foo(0):
    print(n)

6. 迭代器优缺点:

适合用于遍历一个巨大的或无限的集合,比如几个G的文件:

对于无法随机访问的数据结构:set(),迭代器是唯一的访问元素的方式
省内存:迭代器不会一次性把所有元素加载到内存,不需要事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或销毁

list2={1,9,8,4}
a=iter(list2)
while True:
    try:
        print(next(a))
    except:
        StopIteration
#结果:
8
1
4
9

关于迭代器,更多实际应用,欢迎补充~

上一篇 下一篇

猜你喜欢

热点阅读