斐波那契数列(生成器用的少,面试处理大数据时使用)

  1. 一般用for来迭代生成器,当list来处理,不是直接生成一个列表(数据过大),我们保存的是算法,通过算法一个个推导
f=(i**2 for i in range(1,10))
  1. 函数实现生成器(yield语句),推导算法复杂,用列表生成式for循环无法实现,将return变成yeild
def func():
    print('aaaa')
    print("bbbbb")
    print('ccccc')
    yield 5
    print('zzzzz')
    yield 6
f=func()#生成器,生成的东西当作list理解

next(f)
next(f)
next(f)
# for i in f:
#     print(i)

访问:生成器,生成的东西当作list理解
1.生成器可以通过next(f)来实现访问,每次next到yield停止,下次从yield后继续
2.while 1:
next(f)一直访问但是最后会报错StopIteration
3. for i in f:
print(i)

斐波那契数列
法1:函数的形式

def fib(count):
    index=0
    x,y=0,1

    while index < count:
        print(y)
        x,y=y,x+y
        index+=1
fib(9999)

法2:生成器形式

def fib(count):
    index=0
    x,y=0,1

    while index < count:
        yield y
        x,y=y,x+y
        index+=1
    return 'sunck is a good man'

g=fib(9)##生成器
# for i in g:##for 有个缺点就是执行到yield就停止了,拿不到generator的返回值,如果想拿要捕获StopIteration
#     print(i)

#用while
while 1:
    try:
        ret=next(g)
        print(ret)
    except StopIteration as e:
        print("返回值:",e.value)
        break

法3 递归50次就卡死了

import sys#递归50次就卡死了
sys.setrecursionlimit(1000000)  # 例如这里设置为一百万
def f(n):
    if n==1 or n==2:
       return 1
    else:
        return f(n-1)+f(n-2)
n=int(input())
a=f(n)
print(a%10007)
发布了10 篇原创文章 · 获赞 4 · 访问量 411

猜你喜欢

转载自blog.csdn.net/m0_46204224/article/details/104676918
今日推荐