-
如何判断一个对象是否可以迭代
from collections import Iterable isinstance(obj,Iterable) 返回一布尔值
-
可迭代对象的本质
-
可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。
可迭代对象通过
__iter__
方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.==一个具备了
__iter__
方法的对象,就是一个可迭代对象==
-
-
iter()函数与next()函数
- **我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。
- iter()函数实际上就是调用了可迭代对象的
__iter__
方法。 - 注意,当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有数据都已迭代完成,不用再执行next()函数了
-
如何判断一个对象是否是迭代器
from collections import Interator isinstance(obj,Interator) 返回:布尔值
-
迭代器
-
Python3中是对象的
__next__
方法,Python2中是对象的next()方法 -
构造一个迭代器的两个充分条件:
-
python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现
__iter__
方法,而__iter__
方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__
方法返回自身即可def __iter__(self): return self
-
实现它的
__next__
方法
-
-
-
for...in...循环的本质
- 先通过iter()函数获取可迭代对象Iterable的迭代器
- 对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item
- 当遇到StopIteration的异常后循环结束
-
迭代器的应用场景(省内存)
-
迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间
-
用迭代器实现斐波那契数列:
# -*- coding: utf-8 -*- # _Version__: python 3.8.3 # __date__ : 2020/10/1 class Febonacci(): def __init__(self, all_num): self.all_num = all_num self.a = 0 self.b = 1 self.current_num = 0 def __iter__(self): return self def __next__(self): if self.current_num < self.all_num: ret = self.a self.a, self.b = self.b, self.a + self.b self.current_num += 1 return ret else: raise StopIteration febo = Febonacci(20) for num in febo: print(num)
-
-
并不是只有for循环能接收可迭代对象
li = list(Febonacci(15)) print(li) tp = tuple(Febonacci(6)) print(tp)
分析:
- 从本质上来说,不能认为他们是类型转换
- 从迭代器取出一个对象,添加到list或tuple中
- 生成列表和元组
网友评论