迭代器:
如同遍历一般,这样理解起来可以发现不是特别的绕,刚开始的时候我觉得这个迭代特别的不好理解,概念看来好几遍,还是一头蒙。突然发现把迭代这两词换成遍历这之后,思路一下就打开了!
先一步一步的来了解吧~
1. 迭代的概念
使用 for 循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程。
for value in [2, 3, 4]:
print(value)
结果:
2
3
4
2. 可迭代对象
使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串
可迭代的对象说明是可以被迭代(遍历)的,但是只有迭代器可以使用!
3. iter()函数与next()函数
不好理解,先不看着里~~~
iter函数: 获取可迭代对象的迭代器,会调用可迭代对象身上的iter方法
next函数: 获取迭代器中下一个值,会调用迭代器对象身上的next方法
也就是说:这两个函数必须同时在一个类里,同时实现两个方法。
4. 自定义可 迭代 对象
自定义可迭代对象: 在类里面定义__iter__方法创建的对象就是*可迭代(遍历)对象*
class MyList(object):
def __init__(self,age):
# 初始化
self.age = age
def __iter__(self):
# 返回本身
return self
"说明:这个类是可迭代对象,实现了__iter__ 方法。
到这里只能说明,是可以被迭代(遍历),
如同现在就是一个列表;可以做为遍历取值的对象。"
# 现在它只是迭代器的一部分,只实现了两个方法中的一个。
5.自定义 迭代器
自定义迭代器对象: 在类里面定义iter和next方法创建的对象就是迭代器对象。
这里同时实现两个方法,所以叫迭代器。
class MyClass(object):
"""功能:实现迭代出任意范围数字的值;
例如:遍历出1到100的数字。
"""
# 初始化
def __init__(self, age):
self.age = age
self.num = 0
# 作用:把这个类变成一个可迭代对象
def __iter__(self):
return self
# 作用:在迭代(遍历)时,取出下一个值
def __next__(self):
"""根据条件实现的功能主要是写在这!"""
# 判断是否大于遍历的值
if self.num >= self.age:
# 停止迭代(遍历)
raise StopIteration
else:
# 继续迭代(遍历)直到满足条件为止
self.num += 1
return self.num
#创建对象
MyClass = MyClass(100)
#使用for循环遍历,说明这个类是迭代器。
for x in MyClass:
print(x)
结果:
1
2
3
4
….
…..
99
100
6.概念理解总结
迭代器: 就是定义一个类,在类里面实现iter和 next这两个方法;则这个类就是 迭代器;可以使用for迭代(遍历)。
(个人理解)注:
iter 的作用是把 这类变成 可迭代(遍历)的对象,返回本身。
next 就是能在迭代(遍历)的时候,依次取出下一个值。
7.迭代器的应用场景
———-迭代器:我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的。
———意味着不在依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
8.举个例子
举个例子,比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
现在我们想要通过for…in…循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。
class Fibonacci(object):
def __init__(self, num):
# num:表示生成多少fibonacci数字
self.num = num
# 记录(斐波拉契数列)fibonacci前两个值,
self.a = 0
self.b = 1
# 记录当前生成数字的索引
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
if self.current_index < self.num:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.current_index += 1
return result
else:
raise StopIteration
fib = Fibonacci(5)
# value = next(fib)
# print(value)
for value in fib:
print(value)
执行结果:
0
1
1
2
3