python笔记:输出杨辉三角


此处转载别人的内容加上一些自己的思考,转载网址: https://blog.csdn.net/Watson_Ashin/article/details/81272803

杨辉三角简介

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合 ----来自百度百科。
总之,杨辉三角特点:它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。
下面是一个直观图:

代码

def count_yanghui():
    """计算每一行杨辉三角数"""
    a=[1]
    while True:
        yield a
        a=[sum(i) for i in zip([0]+a,a+[0])]#杨辉三角算法
def control_circulation(max_num):
    """由用户决定打印几行杨辉三角"""
    n=0
    for x in count_yanghui():
        print(x)#以列表形式输出每一行杨辉三角数,即print(a)
        n+=1
        if n==int(max_num):
            break
if __name__=="__main__":
    n=input("请输入需要打印的杨辉三角行数:")
    control_circulation(n)

输出:

请输入需要打印的杨辉三角数:6
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

代码释疑:

  • count_yanghui()函数中,以列表形式初始化了第一行杨辉三角数,该函数包含关键字yield,表示是一个生成器函数,记录着函数上下文变量的状态。每次执行到yield返回a列表
  • count_yanghui()函数中,讲a=[sum(i) for i in zip([0]+a,a+[0])]之前,先解释zip(),第一次循环返回初始化a列表,第二次循环zip([0]+a,a+[0])相当zip([0,1],[1,0]),zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。其返回[(0,1),(1,0)],其实就是讲第一行杨辉三角数1扩展为0,1,0,接着将列表中的每一个元组(0,1),(1,0)做一个sum()运算保存在列表中此时a=[1,1]。规律就是这样,后面照猫画虎。

优化上文代码

由于打印的杨辉三角数是左对齐,此时想把杨辉三角输出结果居中显示(呈金字塔显示)怎么办?
被转载博主的想法是不以列表的形式输出打印杨辉三角数,而是以字符串形式输出打印杨辉三角数。

def count_yanghui():
    """计算每一行杨辉三角数"""
    a=[1]
    while True:
        yield a
        a=[sum(i) for i in zip([0]+a,a+[0])]
def control_circulation(max_num):
    """由用户决定打印几行杨辉三角"""
    n=0
    for x in count_yanghui():#注意此处x表示整个a列表,不是a列表的一个个元素
        a_cp=x.copy()#不能直接操作a列表,因为如果a和a_copy在同一个内存地址,后续算法会出错
        for i in range(len(a_cp)):
            temp=str(a_cp[i])
            a_cp[i]=temp#首先转换为字符串列表
        str_a_cp=' '.join(a_cp).center(50)#列表元素以空格分开转换为字符串并使用空格填充至长度 width 的新字符串,接着转换为字符串输出
        print(str_a_cp)
        n+=1
        if n==int(max_num):
            break
if __name__=="__main__":
    n=input("请输入需要打印的杨辉三角行数:")
    control_circulation(n)
        

输出:

请输入需要打印的杨辉三角行数:6
                        1                         
                       1 1                        
                      1 2 1                       
                     1 3 3 1                      
                    1 4 6 4 1                     
                  1 5 10 10 5 1   

代码释疑:
唯一的改变就是在control_circulation()函数将直接打印a列表修改为稍微排版好的字符串(仍是一行一行的输出)。具体解释读者可在代码中查看。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值