什么是迭代器?为什么会有迭代器?这将是理解迭代器很重要的两个问题。
示例:
l = [1,2,3,4],取列表中的值,我们可以根据索引去取值,也可以通过for循环的形式拿到我们需要的值,但是有个问题1:为什么for循环就可以取到值?
在回答问题1时,我们首先回想下:那些可以进行for循环?,列表(list),元组(tuple),字典(dic), 集合(set),枚举(enumerate),range,字符串等等.
我们通过dir函数来查看,列表,字符串拥有哪些方法:
列表篇----print(dir(list))
得到结果:以下就是列表所拥有的所有方法
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
字符串篇---print(dir(str))
得到结果:以下就是字符串所拥有的所有方法
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
通过比较我们发现,列表和字符串共同拥有一个双下iter方法,即红色__iter__方法,你可以去用dir函数,去查看,字典,文件句柄,等等,结果是一样的。因为他们都拥有这个__iter__方法,实际上这个方法代表可迭代。
结论:只要可以被for循环的都是可迭代的,那么你要想是可迭代的,内部必须有一个__iter__方法。即:只要含有__iter__方法的都是可迭代的------------可迭代协议
for循环的本质:寻找内部是否包含__iter__方法,如果有那么执行for循环,否则报错,例如对int型执行for循环,TypeError: 'int' object is not iterable(不可迭代)只有是可迭代对象的时候,才能用for循环,当我们遇到一个新的变量,不确定能不能for循环的时候回,就判断是否为可迭代。
#总结
1:可以被for循环的都是可迭代的
2:可迭代的内部一定包含__inter__方法
3:可迭代的通过调用__iter___()方法可以得到迭代器
4:只要是迭代器必定是可迭代。
5:迭代器中的__next__()方法可以一个一个的获取值
6:for循环其实就是在使用迭代器
7:可迭代对象
当你感觉应该给你很多个值,但是他没有给你,而是给你一个看起来什么都没做的事情的时候,猜测它可能是个可迭代对象或者是迭代器。
#########迭代器的好处(为什么有这个东西)?***************
1:可以节省内存空间