一、迭代器
1、迭代器:拥有__iter__和__next__方法的对象就是迭代器。
2、迭代:是访问集合元素的一种方式,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫迭代。
3、可迭代协议:内部实现了__iter__方法。
4、迭代器协议:必须拥有__iter__方法和__next__方法。
5、能被for循环的内容:list,dic,str,set,tuple,f.open(),range(),enumerate
6、dir()方法能获取对应数据类型的所有方法。例如:print(dir([]))
①利用dir()查看共有方法。
a = set(dir([])) & set(dir({})) & set(dir("")) & set(dir(range(1)))
print(a) #{'__gt__', '__iter__', '__ge__', '__delattr__', '__new__', '__contains__', '__le__', '__str__', '__init_subclass__', '__init__', '__class__', '__setattr__', '__eq__', '__sizeof__', '__getitem__', '__getattribute__', '__lt__', '__hash__', '__subclasshook__', '__dir__', '__reduce__', '__format__', '__repr__', '__ne__', '__doc__', '__len__', '__reduce_ex__'}
②判断int类型是否有__iter__方法。
print("__iter__" in dir(int)) #False
7、iter()方法的作用:返回一个迭代器。
a = [1,2,3,4,5]
b = a.__iter__()
print(b) #<list_iterator object at 0x00000000020E7470>处理list对象的迭代器位于XX地址
print(next(b)) #1,运行一次迭代器,输出1
8、打印迭代器中的方法:
a = set(dir([].__iter__())) - set(dir([])) #求差值
print(a) #{'__length_hint__', '__setstate__', '__next__'}
9、for循环原理
①for循环一个可迭代对象(实现__iter__方法)
②__iter__方法返回一个迭代器(迭代器实现了__iter__和__next__方法)
③for先判断对象哪些范围需要迭代,然后调用迭代器的__next__方法获取值
10、迭代器作用:节约内存
11、数据类型转换:例如元组和列表间的转换底层,就是使用迭代器实现的
a = "hello"
b = list(a)
print(b) #['h', 'e', 'l', 'l', 'o']
c = (1,2,3)
d = list(c)
print(d) #[1, 2, 3]
12、利用迭代器,生成斐波那契数列
class Fib():
def __init__(self,num):
self.num = num
self.a = 1
self.b = 1
self.current = 1
def __iter__(self):
return self #返回自己,调用自己的__next__方法
def __next__(self):
if self.current <= self.num: