zoukankan      html  css  js  c++  java
  • 3.4、生成器

     g=(x*x for x in range(0.10))  generator生成器

    next(g)通过next()查看,或者通过循环语句:for n in g:

    def fib(max):
        a, b = 0, 1
        for n in range(max):
            print(b)
            a, b = b, a + b
        return 'done'

    def fib(max):
        a, b = 0, 1
        for n in range(max):
            yield b
            a, b = b, a + b
    m=fib(6)
    for x in m:
        print(x)

    print(b)改成yield b 即可将函数变成生成器

    函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    def f(n):
        t=[]
        s=[1,1]
        for i in range(n):
            t.append(1)   
            if i>1:
                for j in range(1,i):
                    t[j]=s[j]+s[j-1]
                s=t
            yield t
    
    m=f(5)
    for k in m:
        print(k)

    错误原因:s=t,t是一个动态变量,每次执行for循环,s都会跟随t变化,导致后面for循环结果不对

     直接采用 ’ = ’ 赋值方式会使得两个变量占用同一地址,也就是说a 与 b 是同一个对象。而采用切片方式赋值则不会

    def f(n):
        t=[]
        s=[1,1]
        for i in range(n):
            t.append(1)   
            if i>1:
                for j in range(1,i):
                    t[j]=s[j]+s[j-1]
                s=t[:]
            yield t
    m=f(7)
    for k in m:
        print(k)

     

  • 相关阅读:
    LIS
    原根
    数三角形
    组合数问题
    最短路问题
    2020总结
    树状数组
    康托展开
    LCA
    并查集
  • 原文地址:https://www.cnblogs.com/soberkkk/p/12620474.html
Copyright © 2011-2022 走看看