一,迭代的概念
迭代器是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下次一迭代的初始值
while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1
二,为什么要用迭代器
迭代器:
优点: 1),提供一种不依赖索引的迭代取值方式
2),更加节省内存
缺点: 1),不如按照索引取值的方式灵活
2),取值一次性的,只能往后取值,无法预测值的个数
三,如何使用迭代器
可迭代的对象:str\ list\ tuple \dict \set \文件对象
但凡内置有_iter_方法的对象都称之为可迭代对象
迭代器对象: 文件对象
既可以内置_iter_方法又可以内置_next_方法的对象都称之为迭代器对象
调用可迭代对象_iter_ 方法,会有一个返回值,该返回值就是内置的迭代器对象
d = {'k1': 111, 'k2': 222, 'k3': 333} iter_d = d.__iter__() #将数据类型可迭代对象转变成迭代器对象 print(iter_d) try: #让报错继续运行 print(iter_d.__next__()) print(iter_d.__next__()) print(iter_d.__next__()) print(iter_d.__next__()) except StopIteration: #捕捉'StopIteration'异常 print('取值完毕')
for循环的底层工作原理:
1,调用in后面那个值\对象的_iter方法,拿到一个迭代器对象iter_obj
2,调用迭代器对象iter_obj._next_()将得到的返回值复制变量名k,循环往复直到取值完毕抛出异常StopIteration
3,捕捉异常结束循环
iter_d=d.__iter__() while True: try: v=iter_d.__next__() print(v) except StopIteration: break
生成器:
生成器就是一种自定义的迭代器
如何得到生成器:
但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即定义的迭代器
自定义一个迭代器
def my_range(start, stop, step=1): while start < stop: yield start start += step r = my_range(1, 1000, 5) res = next(r) print(res) for i in my_range(1, 1000, 5): print(i)
总结:
1, 提供一种自定义迭代器的解决方案
2, yield & return
相同点: 都可以返回值,返回值没有类型限制\个数限制
不同点: return 只能返回一个值,yield 却可以让函数暂停在某一个位置,可以返回多次值
列表生成器
把列表推导式的[]换成()就是生成器表达式
with open('a.txt',mode='rt',encoding='utf-8') as f: # print(len(f.read())) # g=(len(line) for line in f) # res=sum(g) res = sum(len(line) for line in f) print(res)
来源:https://www.cnblogs.com/kp1995/p/10060308.html