generator输出杨辉三角(python)

最近在学廖雪峰老师的python教程,做下练习方便查询:
杨辉三角定义如下:

      1
     / \
    1   1
   / \ / \
  1   2   1
 / \ / \ / \
1   3   3   1

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

# 期待输出:
# [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]

python

def triangles():  
    L=[1]  
    yield L  
    while True:  
        L=[1]+[L[x]+L[x+1] for x in range(len(L)-1)]+[1]  
        yield L  

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

generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。

要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
请注意区分普通函数和generator函数,普通函数调用直接返回结果:

>>> r = abs(6)
>>> r
6
generator函数的“调用”实际返回一个generator对象:

>>> g = fib(6)
>>> g
<generator object fib at 0x1022ef948>
杨辉三角是一个由数字组成的三角形,数字满足如下规律: 1. 每行的端点数字为1; 2. 除了端点数字外,每个数字等于它上方两个数字之和。 下面是四种方法输出杨辉三角的前n行: 方法一:使用嵌套循环打印杨辉三角 ```python n = int(input("请输入要输出杨辉三角的行数:")) triangle = [] for i in range(n): row = [] for j in range(i+1): if j == 0 or j == i: row.append(1) else: row.append(triangle[i-1][j-1] + triangle[i-1][j]) triangle.append(row) for row in triangle: print(row) ``` 方法二:使用递归函数计算杨辉三角 ```python def pascal_triangle(n): if n == 1: return [[1]] else: triangle = pascal_triangle(n-1) row = [] for i in range(n): if i == 0 or i == n-1: row.append(1) else: row.append(triangle[-1][i-1] + triangle[-1][i]) triangle.append(row) return triangle n = int(input("请输入要输出杨辉三角的行数:")) triangle = pascal_triangle(n) for row in triangle: print(row) ``` 方法三:使用生成器生成杨辉三角 ```python def generate_pascal_triangle(): triangle = [] while True: if not triangle: triangle.append([1]) else: row = [1] for i in range(len(triangle[-1])-1): row.append(triangle[-1][i] + triangle[-1][i+1]) row.append(1) triangle.append(row) yield triangle n = int(input("请输入要输出杨辉三角的行数:")) triangle_generator = generate_pascal_triangle() for i in range(n): triangle = next(triangle_generator) print(triangle[-1]) ``` 方法四:使用lambda函数和reduce函数计算杨辉三角 ```python from functools import reduce def generate_next_row(row): return [1] + [row[i] + row[i+1] for i in range(len(row)-1)] + [1] n = int(input("请输入要输出杨辉三角的行数:")) triangle = [[1]] for i in range(n-1): row = reduce(lambda x, y: generate_next_row(x), range(i+1), triangle[-1]) triangle.append(row) for row in triangle: print(row) ``` 以上是四种方法输出杨辉三角的代码,其中方法一和方法二比较容易理解和实现,方法三和方法四则使用了生成器和函数式编程的思想,代码相对更加简洁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值