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)

     

  • 相关阅读:
    【题解】P2262 [HNOI2004]FTP服务器
    关于大模拟
    CodeForces 666E Forensic Examination
    Bzoj3233 [Ahoi2013]找硬币
    Bzoj4350 括号序列再战猪猪侠
    UOJ#31 【UR #2】猪猪侠再战括号序列
    UOJ#21 【UR #1】缩进优化
    51nod1667 概率好题
    [CodeChef
    51nod1245 Binomial Coefficients Revenge
  • 原文地址:https://www.cnblogs.com/soberkkk/p/12620474.html
Copyright © 2011-2022 走看看