python三大器之 迭代器与生成器
1.迭代器
迭代器的两种生成方式:
方式一:可迭代对象调用iter_obj = obj.__iter__()
方式二: 使用生成器 yield 产生迭代器
''' 1.迭代器 2.生成器 3.三元表达式 4.列表生成式 5.递归与二分法 6.匿名函数 7.内置函数 ''' # 迭代器:迭代的工具 # 1.什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代, # 并且每一次重复的结果是下一次重复的初始值 l = ['a','b','c'] count = 0 while count < len(l): print(l[count]) count+=1 # 2.为什么要有迭代器? # 对于序列类型:str,list,tuple,可以依赖索引来迭代取值 # 但是对于dict,set,文件,python必须给我们提供一种不依赖于索引的迭代取值方式 #3. 可迭代对象(下列都是):obj.__iter__ :凡是有__iter__方法的都是可迭代对象 name = 'egon' l = [1,2,3] t = (1,2,3) d = {'name':'egon','age':18,'sex':'male'} s = {'a','b','c'} f = open('a.text','w',encoding='utf-8') name.__iter__ l.__iter__ t.__iter__ d.__iter__ s.__iter__ f.__iter__ #4. 迭代器对象(文件是):obj.__next__,obj.__iter__ f.__iter__ f.__next__ # 总结: # 1.可迭代对象不一定是迭代器对象 比如列表必须调用iter方法,才能生成迭代器 # 2.迭代器对象一定是可迭代对象 文件是迭代器 既有iter方法,也有next方法 # 3. 调用__iter__()方法,得到是迭代器对象(迭代器对象调用iter方法得到的是其本身) # d = {'name':'egon','age':18,'sex':'male'} # d_iter = d.__iter__() # f = open('a.text','w',encoding='utf-8') # f_iter = f.__iter__().__iter__().__iter__() # print(f_iter is f) # d = {'name':'egon','age':18,'sex':'male'} # d_iter = d.__iter__() # print(d_iter.__next__()) # print(d_iter.__next__()) # print(d_iter.__next__()) # print(d_iter.__next__()) #迭代器d_iter没有值了,就会抛出异常StopIteration # f = open('a.text','r',encoding='utf-8') # print(f.__next__()) #一行一行取 # print(f.__next__()) # print(f.__next__()) # print(f.__next__()) # l = ['a','b','c'] # l_iter = l.__iter__() # print(l_iter.__next__()) # print(l_iter.__next__()) # print(l_iter.__next__()) # print(l_iter.__next__()) # d = {'name':'egon','age':10,'sex':'male'} # d_iter = iter(d) # d_iter = d.__iter()__ # # len(obj) 等同于 obj.__len()__ # # # while True: # try: # print(next(d_iter)) # except StopIteration: # break #for 循环迭代原理 # 1.调用in 后的obj.__iter__() # 2.k = obj_iter.__next__() # 3. 捕捉StopIteration异常,结束迭代 d = {'name':'egon','age':10,'sex':'male'} for k in d: print(k) # 总结:迭代器的优缺点 # 优点: # 1.提供一种统一的不依赖于索引的取值方式,为for循环的实现提供了依据 # 2.迭代器同一时间在内存中只有一个值,更节省内存空间 # # 缺点: # 1. 只能往后取,并且是一次性的,不能依赖索引取到某个值 # 2. 无法统计长度,没有len方法
2.生成器
生成器表达式: g = ('egg%s'i for i in range(5))
# 1.什么是生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,该结果就是生成器 def func(): print('===1') yield print('====2') yield print('====3') #生成器就是迭代器 g = func() res1 = next(g) print(res1) res2 = next(g) print(res2) res3 = next(g) print(res3) #yield功能 #1.yield 为我们一种自定义迭代器的方法 #2.yield与return的区别:1.yield可以返回多次值 2.函数暂停与再继续的状态是由yield帮我们保存的 def my_range(start,stop,step=1): while start< stop: yield start start+=step g = my_range(1,5,2) print(next(g)) print(next(g)) for i in my_range(1,5,2): print(i)