1. 迭代器的概念
迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可迭代对象实现了iter方法,该方法返回一个迭代器对象;可以使用内置函数iter(),把这些都变成Iterator(迭代器)
它是一个带状态的对象,任何实现了iter和next()方法的对象都是迭代器
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
关于迭代器,更多实际应用,欢迎补充~
网友评论