廖雪峰python教程:生成器generator(杨辉三角练习题)

        刚开始对生成器(generator)并不是很明白,编程的时候就一直报错……其实生成器就是记住数产生的算法逻辑,需要调用的时候再进行计算,简单逻辑的生成器可以直接用小括号表示,较为复杂的生成器可以通过构建函数并利用“yield”构造generator。

注意:generator和函数的执行顺序不同。函数是顺序执行,遇到return或最后一条执行语句时才返回(把所有工作都做完了才结束);generator每次生成一个值(yield)的时候就返回该值,若需要生成下一个值时才从yield下一条指令继续执行(有种推一下做一下的感觉)。

练习题:

杨辉三角定义如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list:

(依旧是我啰嗦的代码。。。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Donna5126

# 杨辉三角
def triangles():
    n = 1
    l_list = [1]
    while True:
        yield l_list
        n += 1
        i = 0
        l_temp = l_list
        l_list = []
        for i in range(0, n):
            if i == 0 or i == n-1:
                l_list.append(1)    # 此处由于忘记list的命令对l_list直接赋值导致报错“list assignment index out of range”
            else:
                l_list.append(l_temp[i-1]+l_temp[i])

n = 0
for t in triangles():
    print(t)
    if n == 10:
        break
    else:
        n+=1

生成结果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]

围观大神的代码:

def triangles():
    L = [1]
    while True:
        yield L
        L.append(0) # 想一想还是觉得很巧妙呀,在最后一个加上0,不管是第一个数或是最后一个数都是1+0
        L = [L[i - 1] + L[i] for i in range(len(L))]

生成结果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]

这差距真的是T-T

多注意数字之间的关系,多转弯多动脑。。。


你可能感兴趣的:(python)