复习python基础的时候发现杨辉三角的控制台打印很有意思,所以就想在控制台上打印出跟平常所见的那种杨辉三角,可以打印出任意高度的杨辉三角而保持形状。
如:
上代码:
#百度杨辉三角得到规律后不用生成器函数实现获取指定的一行杨辉三角数字组合
'''
遇到不懂的问题?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]
'''