一、迭代器
迭代取值的工具,每一次迭代都必须基于上一次的结果
为什么要用迭代器
迭代器给你提供了一种不依赖于索引取值的方式
怎么用迭代器
l = [1,2,3,4,5] s = 'hello' n = 0 while n <len(l): print(l[n]) n += 1
需要迭代取值的数据类型
字符串,列表,元祖,集合,字典
可迭代对象的定义
只有通过内置有__iter__方法的都叫做可迭代对象
补充:针对双下线开头 双下线结尾的方法,推荐读作 双下+方法名
基本数据类型中,是可迭代对象的有
字符串
列表
元祖
字典
集合
可迭代对象
执行内置的__iter__方法得到的就是该对象的迭代器对象
二、迭代器对象
1、内置有__iter__方法
2、内置有__next__方法
迭代器一定是可迭代对象
迭代器取值
l = [1,2,3,4] iter_l = l.__iter__()#生成一个迭代器对象 print(iter_l.__next__()) # 迭代器取值 调用 __next__ print(iter_l.next__()) ... #可以一直取,但是取完了 就会直接报错
迭代器对象无论执行了多少次 __iter__方法得到的还是迭代器对象本身
迭代器取值的异常处理:
while Ture: try: print(lter_d.__next__()) except StopeTeration: #报错类型 break
迭代器取值的特点
只能往后取 不能往后退
总结
可迭代对象:内置有__iter__方法的
迭代器对象:即内置有__iter__也内置有__next__方法
迭代取值:
优点
1.不依赖索引取值
2.内存中永远只占一份空间,不会导致内存溢出
缺点
1.不能够获取指定的元素
2,取完后之后会报stopIteration错
三、for循环的本质
for循环的本质
1.将in后面的对象调用__iter__转成可迭代对象
2.调用__next__迭代取值
3.内容有异常捕获StopIteration,当__next__报这个错 自动结束循环
四、生存器
用户自定义的迭代器
yield关键字
函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
列子
初始化函数,将函数变成迭代器
def func()
print('frist')
yield
yield 后面跟的值就是调用迭代器__next__方法你能得到的值,既可以返回一个值也可以返回
多个值,并且多个值也是按照元组的形式返回
def func(): print('second') yield 777 print('third') yield 888 print('forth') yield yield g = func() print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) #没有值得话就是None
range生成器
def my_range(start,end,step): # 实现range功能 while start < end: yield start start += step for j in my_range(1,100,2): print(j)
了解知识点
yield支持外界为其传参
当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器
yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返值
与return之间的异同点
相同点:都可以返回值,并且都可以返回多个值
不同点:
yield可以返回多次值而return只能返回一次函数立即结束
yield还可以接受外部传入的值
五、生成式表达式
表达式
res = (i for i in range(1,100)if i !=4)
print(res)
生成器不会主动执行一行代码
必须通过__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循环g=(add(n,i) for i in test()) # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test())) print(n) res=list(g) """ for i in (add(10,i) for i in test()): 会执行所有的生成器内部的代码 add(n,i) """ #A. res=[10,11,12,13] #B. res=[11,12,13,14] #C. res=[20,21,22,23] 答案 #D. res=[21,22,23,24]