迭代器、生成器、模块和包知识点总结
第一部分:迭代器
例1. for....in 运行机制
1 2 3 4 5 6 7 8 9 10 | li = [ 1 , 2 , 3 , 4 ] # 在列表中取值从第一个取到最后一个结束 # for i in li: # print(i) # 1,2,3,4 i = 0 while i < len (li): # 索引 # print(i) # 输出索引 0,1,2,3 print (li[i]) # 取列表值 i + = 1 print (i) # i=4的时候结束 |
运行截图:
例题2. 可迭对象
一个数据类型中包含__iter__魔术方法就被称为可迭对象
__iter__:确定你是一个可迭代对象、生成迭代器
1 2 3 4 5 6 | li1 = [ 1 , 2 , 3 , 4 ] # print(dir(li1)) # 有__iter__ s = 123 s1 = '123' # 可迭代 # print(dir(s)) # 没有__iter__,不可迭代 print ( dir (s1)) # __iter__ |
运行截图:
例3. 迭代器:iter(可迭代对象),取值=next(迭代器),同时具备有__iter__、__next__这两个魔术方法被称为一个迭代器
生成迭代器的两种方法
1.通过iter()函数生成
2.通过__iter__魔术方法
li21=iter(li2) # 必须是可迭代对象才可以生成
# print('================================================')
# li21=li2.__iter__() # 跟上述作用一样的
print(dir(li21)) # 有__iter__' __next__
运行截图:
通过__next__方法取迭代器里面的值:当取完的时候会出现异常,可以写个对应异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | li21 = iter (li2) # 必须是可迭代对象才可以生成 # print('================================================') # li21=li2.__iter__() # 跟上述作用一样的 # print(dir(li21)) # 有__iter__' __next__ print (li21.__next__()) # 1 相当于在一个盒子里面逐一取值 print (li21.__next__()) # 2 [2,3,4] print (li21.__next__()) # 3 print (li21.__next__()) # 4 [] print (li21.__next__()) # 取完了 ===StopIteration # next是一个一个取值 # 与以上方法一样 # print(next(li21)) # print(next(li21)) # print(next(li21)) # print(next(li21)) |
运行截图:
例4. for 循环的实现原理
1 2 3 | li3 = [ 1 , 2 , 3 , 4 ] li31 = li3.__iter__() # 写一个异常try: while True: # print(next(li31)) var=next(li31) print(var)except StopIteration as e: print(e)同理以下写法:def f(o): li31=o.__iter__() try: while True: print(next(li31)) except Exception: passf(li3) |
运行截图:
第二部分:生成器:
是一个函数,函数里面包含一个yield关键字
例1.生成器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def f(): print ( '第一次执行' ) yield 1 # 具备 return的返回值 # return 1 print ( '第二次执行' ) yield 2 print ( '第三次' ) l = f() # l:迭代器 # print(dir(l)) # __iter__,__next__ print (l) # yield:返回、暂停、等待(等待下次取值) print ( next (l)) # 取值 print ( next (l)) # 第二次取值 print ( next (l)) # 第三次执行并抛出一个异常 |
运行截图:
例2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def f2(): i = 0 while i< 5 : yield i i + = 1 j = 0 l = f2() try : while j< 5 : # i和j实际上没什么关联 # l=f2() # 迭代器 print ( next (l)) j + = 1 except Exception: pass |
运行截图:
总结:
生成器,是Python提供的一种非常简便的语法 能让我们来自己写出迭代器;
注意:1. 生成器,是一种特殊的迭代器
2. 生成器指的是一个函数,返回的结果是一个迭代器
第三部分:模块(待续)
练习:
在一个模块中定义一个生成器, 这个生成器可以生成斐波拉契数列, 再另一个模块中使用这个生成器,得到斐波拉契数列
斐波那契数列:数列中每一个数的值都等于前两个数相加的值 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55.........]
方法1:通过函数的方式实现
1 2 3 4 5 6 7 8 9 10 11 12 | def f(n): # n 为序列值 if n = = 1 : return 1 if n = = 2 : return 1 return f(n - 2 ) + f(n - 1 ) # print(f(4)) li = [] for i in range ( 1 , 10 ): li.append(f(i)) |
运行截图:
方法2:通过生成器实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # yield:返回、等待、暂停 # f() 为一个生成器 def f( max ): # max:循环的次数 a = 0 b = 1 # 每个元素值 n = 0 while n < max : yield b # 1 # 改变b的值 a,b = b,a + b # 第一次循环: a=1,b=1(因为是同时性这个时候的a还是0) # 第二次循环: a=1,b=2 # 第三次循环: a=2,b=3 # 第四次循环: a=3,b=5 # 第五次循环: n + = 1 # 改变条件 li2 = [] for i in f( 10 ): li2.append(i) print (li2) # f=f(5) # 调用一次就行了,不能像以下调用多次 # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f)) # 以下形式不可以调用多次 # print(next(f(5))) # 如果传5进去,循环5次 # print(next(f(5))) # print(next(f(5))) # print(next(f(5))) # print(next(f(5))) |
运行截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?