迭代器
'''' ''' ''' 什么是迭代器 迭代:更新换代的过程,每次迭代必须基于上次迭代的结果 迭代器:迭代取值的工具 可以迭代取值的数据类型 字符串 列表 元组 集合 字典 如何判断是否是可迭代对象 内置方法有.__iter__的数据就是可迭代数据 如何判断迭代器对象? 内置方法有.__iter__ .__next__ 两种内置方法的称为迭代器对象 文件属于迭代器对象 迭代器对象不管执行多少次.__iter__ 最后还是迭代器本身 l = [1,2,3,4] iter_f = l.__iter__() print(iter_f is iter_f.__iter__().__iter__().__iter__().__iter__()) # True 内置方法.__iter__ 就是将可迭代对象转换为迭代器对象 l = [1,2,3,4] iter_l = l.__iter__() print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) # 迭代次数超过迭代器对象中元素个数时,会报错StopIteration 异常处理 l = [1,2,3,4] iter_l = l.__iter__() while True: try: print(iter_l.__next__()) except StopIteration: print('取值结束') break 迭代器取值的特点: 只能往后依次取 不能返回再次取值 '''
for循环原理
''' for 循环的本质 for循环是将in后面的对象调用.__iter__ 转换成迭代器对象 调用__next__ 进行迭代取值 内部有异常捕获StopIteration 当__next__报错这个错时,直接结束循环 迭代取值的优缺点 优点:不依赖索引取值 内存中只占一个空间,内存不会溢出 缺点:不能索引取值 全部取完再取会报StopIteration '''
生成器
''' 生成器:就是 用户自己定义的迭代去,本质上就是迭代器 def func(): print('hello') yield 在函数定义中出现yield就是代表生产器 但是函数名加括号 不会触发函数体代码的运行 ''' def func(): print('cly') yield 1 print('clysb') yield 1,2 print('clydsb') yield 1,2,3,4,5 f = func() # 生成器初始化,将函数变成迭代器 print(f.__next__()) print(f.__next__()) print(f.__next__()) ''' yield关键字后面跟的值,就是__next__需要返回的值 yield不能结束函数,但能暂定函数,需要再次__next__取值才会继续执行 yield后 返回多个值时,会将多个值以元组的形式返回 yield 与 return的相同点在于 都能返回值,返回多个值都是以元组的形式返回 yield 与 return的不同点在于 return能直接结束函数 , yield只是暂停函数 能从外部给yield传值 def func(): print('今天学了啥') while True: study = yield print(study) f = func() f.__next__() f.send('迭代器') # 内部共做了两个步骤 给yield左边的变量传参,在执行f.__next__一次 # f.__next__() ''' ''' 生成器表达式: f = (i for i in range(10) if i != 4) 这是一个生成器,并不是元组生产器 生产器不会主动执行任何一行代码, 必须通过.__next__触发代码执行 ''' def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) # 第一次for循环 add(1,i) for i in test() # 第二次for循环 add(10,i) for i in (add(1,i) for i in test()) print(n) res=list(g)