Discuss / Python / day9 -- 2022/4/13

day9 -- 2022/4/13

Topic source

Promethues

#1 Created at ... [Delete] [Delete and Lock User]

### 生成器

l = (x for x in range(1,101,1)) #这是一个generator对象

print(next(l))

print(next(l))

for n in l:

    print(n)

def fib(max):

    n,a,b = 0,0,1

    while n < max:

#        print(b)

        yield b     # 1.类似于return b,遇到yield就返回。2.下次调用generator函数时,从上次yield退出的地方继续

        a,b = b,a+b

        n += 1

    return 'done'

def odd():

    print('step1')

    yield 1         #返回1的意思

    print('step2')

    yield(2)        #返回2

    print('step3')

    yield(3)

g = odd() #g理解为odd函数创建的一个generator对象

next(g)

next(g)

next(g)

#next(g)  # 只有三个yield,所以只能调用三次next,执行每次yield之前的代码 第四次调用会出错

next(odd())

next(odd()) #这种情况下,只会重复打印step1,是因为调用两次odd()函数,创建了两个generator对象

for n in fib(6): # 此时的fib函数成了generator类型函数

    print(n)

g = fib(6)

for n in g: # 这样就好理解了。fib()就是一个生成器函数,fib(6)是一个生成器对象,被g引用到

    print(n)

g= fib(6)

while True:

    try:

        x = next(g)

        print(f'x={x}')

    except StopIteration as e:

        print(f'Generator return value:{e.value}')

        break

###practice 生成器实现杨辉三角

def triangles(v):

    n = 0

    l = [1]

    while n < v:

        yield l

        l = [1] + [l[n] + l[n+1] for n in range(len(l)-1)] + [1]

        n+=1

    return 'done'

def triangles(v):

    l,n=[1],0

    while n < v:

        yield l

        for i in range(1,len(l)):  # 无列表生成式方式

            l[i] = pre[i] + pre[i-1]

        l.append(1)

        pre = l[:]

        n += 1

def triangles(v):

    l,n = [1],0

    while n < v:

        yield l

        l = [sum(i) for i in zip([0]+l,l+[0])] # zip函数,将可迭代对象对应元素打包成tuple,返回tuple组成的列表

        n += 1

g = triangles(5)

for i in g:

    print(i)


  • 1

Reply