生成器的另一个示例,这个生成器功能是从大小生,生成斐波那契数列
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) # 打印每个斐波那契数列值生成器完整示例
##调用生成器的元素
f = fib(100) print(f._next__())
##利用循环一次调取生成器的结果可以用for
for i in f:
print(i)
但是利用for 打印不会打印循环后的语句,print(done)估记不在线程内,如果循环10次,调第十一次的时候内部有抛异常,只有抓住异常才会显示如果要在生成器中打印出 "done" 语句,可以在生成器结束后迭代生成器对象。在迭代过程中,当生成器抛出 StopIteration 异常时,我们可以捕获该异常并在异常处理中添加打印 "done" 的操作。
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'
标签:fib,python,max,生成器,斐波,Ai,done,那契 From: https://www.cnblogs.com/fgxwan/p/18070623