python控制台打印美觀楊輝三角


復習python基礎的時候發現楊輝三角的控制台打印很有意思,所以就想在控制台上打印出跟平常所見的那種楊輝三角,可以打印出任意高度的楊輝三角而保持形狀。

如:

上代碼:

#百度楊輝三角得到規律后不用生成器函數實現獲取指定的一行楊輝三角數字組合
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 -- 填充的字符,默認為空格。
'''

學習楊輝三角主要目的是為了熟悉生成器,所以給出了以下幾種生成器實現迭代獲取楊輝三角的數字組合:

#我想到的生成楊輝三角生成器的方法,代碼不夠精簡,理解不夠透徹
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]
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM