python控制台打印美观杨辉三角

复习python基础的时候发现杨辉三角的控制台打印很有意思,所以就想在控制台上打印出跟平常所见的那种杨辉三角,可以打印出任意高度的杨辉三角而保持形状。

如:
image.png
上代码:

#百度杨辉三角得到规律后不用生成器函数实现获取指定的一行杨辉三角数字组合
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def getTriangles(n):
    if n==1:
        return [1]
    mid=n//2+n%2
    l=[1]
    for i in range(1,mid):
        C_up,C_down=1,1
        for j in range(1,i+1):
            C_up=C_up*(n-j)
            C_down=C_down*j
        C=C_up/C_down
        l.append(int(C))
    if n%2 == 1:
        l=l+l[::-1][1:]
    else:
        l=l+l[::-1]
    return l

#杨辉三角控制台打印
#输入任意数字,打印出输入数字高度的杨辉三角
#控制台打印杨辉三角我认为最美观的组合是上一排两两相加构成的下一排数字组合要用'\ /'联系起来。
def printTriangles(n):
    #首先得到要打印的杨辉三角的最大值,因为打印要根据最大值的数字位数来调整数字之间的间隔保持美观
    maxValue=getTriangles(n)[n//2+n%2]
    maxValueLen=len(str(maxValue))
    #数字之间最小就是3个空格间隔
    spaceLen=3
    if maxValueLen>3:
        spaceLen=spaceLen+maxValueLen-3
    sumLen=n+(n-1)*spaceLen
    for i in range(1,n+1):
        l=getTriangles(i)
        if len(l) == 1:
            s=str(l[0])
            s=s.center(sumLen)
        else:
            #得到/\字符串
            s1='/'+' '*(spaceLen-2)+'\\'
            for j in range(len(l)-2):
                s1=s1+' '+'/'+' '*(spaceLen-2)+'\\'
            s1=s1.center(sumLen)
            print(s1)
            s='1'
            for k in range(1,len(l)):
                preLen=len(str(l[k-1]))
                s=s+' '*(spaceLen-preLen+1)+str(l[k])
            s=s.center(sumLen)
        print(s)
printTriangles(20)
'''
center() 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。
如果指定的长度小于字符串的长度则返回原字符串。
str.center(width[, fillchar])函数
 width -- 指定填充指定字符后中字符串的总长度.
fillchar -- 填充的字符,默认为空格。
'''

学习杨辉三角主要目的是为了熟悉生成器,所以给出了以下几种生成器实现迭代获取杨辉三角的数字组合:

#我想到的生成杨辉三角生成器的方法,代码不够精简,理解不够透彻
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def triangles():
    n,pre=1,[1]
    while 1:
        if n==1:
            yield [1]
        else:
            now=list(1 for i in range(n))
            temp=n//2+n%2
            for i in range(temp):
                if i==0:
                    now[i]=pre[i]
                    now[n-1]=now[i]
                else:
                    now[i]=pre[i-1]+pre[i]
                    now[n-i-1]=now[i]
            pre=now.copy()
            yield now
        n=n+1

#网友的两种精简实现方法
'''
def triangles():
    row = [1]
    while True:
        yield(row)
        row = [1] + [row[k] + row[k + 1] for k in range(len(row) - 1)] + [1]

def triangles():
    row = [1]
    while True:
        yield(row)
        row, rowR = row + [0], [0] + row
        for k in range(len(row)):
            row[k] += rowR[k]
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值