迭代器:迭代的工具,迭代是更新换代,就像传宗接代同样。单纯的重复就不算迭代。迭代的每一次结果都是基于上一次结果来的。函数
python中一切皆对象,如工具
# 可迭代(具备__iter__方法) 对象 x = 1 # 不可迭代对象(数字类型为不可迭代对象) s = 'nick' # 可迭代对象 s.__iter__() lt = [1, 2, 3] # 可迭代对象 dic = {'a': 1, 'b': 2} # 可迭代对象 tup = (1,) # 元组只有一个元素必须得加逗号# 可迭代对象 se = {1, 2, 3} # 可迭代对象 f = open('time.py') # 可迭代对象(文件类为可迭代器对象) def func(): # 不可迭代对象 pass
总结:code
有__iter__()方法的对象就是可迭代对象,而后出了数字类型和函数以外都是可迭代对象,经过__next__进行迭代对象
# 迭代器对象: 具备__iter__以及__next__方法的叫作迭代器对象 s = 'nick' # 可迭代对象,不属于迭代器对象, 基于索引(基于上一次结果)经过__next__进行迭代 s.__iter__() lt = [1, 2, 3] # 可迭代对象,不属于迭代器对象 dic = {'a': 1, 'b': 2} # 可迭代对象,不属于迭代器对象 tup = (1,) # 元组只有一个元素必须得加逗号# 可迭代对象,不属于迭代器对象 se = {1, 2, 3} # 可迭代对象,不属于迭代器对象 f = open('time.py') # 可迭代对象,迭代器对象 # 只有文件是迭代器对象
只有字符串和列表都是依赖索引取值的,而其余的可迭代对象都是没法依赖索引取值的。所以咱们得找到一个方法能让其余的可迭代对象不依赖索引取值。索引
在找到该方法前,首先咱们给出迭代器对象的概念:可迭代的对象执行__iter__
方法获得的返回值。而且可迭代对象会有一个__next__
方法。内存
总结:字符串
迭代器对象:执行可迭代对象的__iter__
方法,拿到的返回值就是迭代器对象。it
特色:io
__next__
方法,执行该方法会拿到迭代器对象中的一个值__iter__
方法,执行该方法会拿到迭代器自己缺点:
由于迭代器使用__iter__
后仍是迭代器自己,所以for循环不用考虑in后的对象是可迭代对象仍是迭代器对象。
因为对可迭代对象使用__iter__
方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__
后才会吐出一个一个值。如lis = [1,2,3,4,5,...]
至关于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__
至关于一只老母鸡,若是你须要蛋,只须要__next__
便可。
lt = [1,2,3] lt_iter = lt.__iter__() while 1: try: print(lt_iter.__next__()) except StopIteration: break # 1. 首先使用iter把lt变成迭代器对象;对于文件也要使用iter方法吧文件再一次iter下 # 2. 而后使用next方法进行迭代取值 # 3. 判断StopIteration异常,遇到异常终止