python Ai 应用开发基础训练,字符串,字典,文件,函数,装饰品,生成器(下)
生成器的另一个示例,这个生成器功能是从大小生,生成斐波那契数列
1 2 3 4 5 6 7 8 9 10 | def fib( max ): # 定义一个函数fib,参数为max a, b = 0 , 1 # 初始化两个变量a和b,分别赋值为0和1 n = 0 # 初始化计数变量n为0 while b < max : # 当b小于max时继续循环 print (b) # 打印当前的斐波那契数列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契数列 n + = 1 # 计数变量n加1 print ( 'done' ) # 循环结束后打印'done' fib( 100 ) # 调用fib函数,设定max为100 |
现在只需要在上面代码第五行,,print(b) 这一句改为 yield b 可以变为生成器生成 ,改变性存 # 使用yield关键字返回当前的斐波那契数列值,改成生成器后 在打印这个fib(100)时,只会返回结果,如果需要调用每一句值,就需要用到__next__()

def fib(max): # 定义一个生成器函数fib,参数为max a, b = 0, 1 # 初始化两个变量a和b,分别赋值为0和1 while b < max: # 当b小于max时继续循环 yield b # 使用yield关键字返回当前的斐波那契数列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契数列 return 'done' # 循环结束后返回'done' # 调用生成器函数并遍历输出结果 for num in fib(100): # 调用fib函数并传入max为100 print(num) # 打印每个斐波那契数列值
1 2 | ##调用生成器的元素<br>f = fib(100) print (f._next__())<br> ##利用循环一次调取生成器的结果可以用for<br>for i in f:<br> print(i)<br><br> |
但是利用for 打印不会打印循环后的语句,print(done)估记不在线程内,如果循环10次,调第十一次的时候内部有抛异常,只有抓住异常才会显示如果要在生成器中打印出 "done" 语句,可以在生成器结束后迭代生成器对象。在迭代过程中,当生成器抛出 StopIteration 异常时,我们可以捕获该异常并在异常处理中添加打印 "done" 的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def fib( max ): # 定义一个生成器函数fib,参数为max a, b = 0 , 1 # 初始化两个变量a和b,分别赋值为0和1 while b < max : # 当b小于max时继续循环 yield b # 使用yield关键字返回当前的斐波那契数列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契数列 raise StopIteration( 'done' ) # 抛出StopIteration异常,并附带提示信息 'done' # 调用生成器函数并遍历输出结果 gen = fib( 100 ) # 调用fib函数并传入max为100 try : while True : num = next (gen) # 获取生成器的下一个值 print (num) # 打印每个斐波那契数列值 except StopIteration as e: print (e) # 打印异常中的提示信息 'done' |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)