Python 打印杨辉三角形

今天是愉快的星期天,终于可以睡个懒觉了。

今天是准备被这周的所以内容归纳一下的,然后看到的经典的杨辉三角形,所以就把代码整理了一下。给他取了个狂野的名字。

==================================疯狂的杨辉三角形===================================

1.普通的杨辉三角形


​​

 杨辉三角形的规则就是出意每行的第一个数字之外,每个数字等于上一行对应两个数字的和。就不多说啦~~

  • 先用函数的思想
def triangle():
    N = [1]
    while True:
        yield N     #generator特点在于:在执行过程中,遇到yield就中断,下次又继续执行
        N.append(0)  #每次都要在最后一位加个0,用于后续的叠加
        N = [N[i]+N[i-1] for i in range(len(N))]

def print_triangle(x):
    a = 0
    for t in triangle():  #这里可以每次调用一个N(得力于Yield函数)
        print(t)
        a += 1
        if a ==x:
             break
print_triangle(10) #打印10行
  • 下面是个简洁的方法,杨辉三角的关键在于每次打印之后要在列表最后以为加上0这个元素
N = [1]
for i in range(10):  #打印10行
    print(N)
    N.append(0)
    N = [N[k] + N[k-1] for k in range(i+2)]

好,以上就是非常常规的两个杨辉三角形的打印方法,那来拓展一下好了

1.居中的杨辉三角形(就是让打印出来的数字排成一个三角形)

思路:普通的杨辉三角形打印出来的是列表,而现在要让他呈金字塔状输出,即让每行输出有个中轴线
           列表是不能想这样对其剧中的(也许有办法???),而字符串有
           所以我们要先将列表转换为字符串,并在每个数字直接放置间隔
           然后在剧中打印,剧中长度就是最后一会字符串的长度+最后一行数字的个数

  • 首先我们要想如何把列表变成一个字符串,方法很多这里用一个选择一种使用
    list1 = [1,2,3,4,5,6]  #随便定义一个字符串,字符串中的元素是int类型
    for i in range(len(list1)):
        temp = str[i]
        list1[i] = temp  #遍历list1里所有元素,将其转换为str类型,再重新赋值给list1
    list_to_str = ' '.join(length) #用join函数将字符串们组合起来,注意引号里有空格,让个数字隔开
    list_to_str = list_to_str.center(90) #将字符串改装成一个长度是90的字符串,原字符串居中(这两部可以一起写)
    print(list_to_str) #在打印就会得到一个剧中的字符串了

    上述这个为什么是90,因为懒得算应该是多少,所以取一个比较大的数字就好了~~~

  • 现在知道如何居中之后就想把这段引用到杨辉三角形里(代码如下)

    N = [1] #先把第一行给定义好
    for i in range(10):  #打印10行
    #从这里开始我们就要把list转换为一个剧中的字符串打印出来
        L = N.copy()   #我们需要吧N复制给L,而不能直接L = N,因为这样L和N会在同一个地址,后续算法就会出错
        for j in range(len(L)):   #遍历和转化
            temp = str(L[j])
            L[j] = temp
        l = ' '.join(L).center(50)  #组合和剧中一起写
        print(l)      #这里就是打印l了
        N.append(0)   #因为复制之后L是L,N是N,所以我们还是继续在N末尾加0
        N = [N[k] + N[k-1] for k in range(i+2)]

    因为昨天刚刚看了装饰器,所以想能不能把转化的过程放在装饰器里面
    装饰器还没深入理解,只能尽量写一下

  • 代码如下

  • def transfor(fun):   #定义一个转换函数,
        def war(N):  #带参数的装饰器,把参数传闭包里
            L = N.copy()
            for j in range(len(L)):
                temp = str(L[j])
                L[j] = temp
            l = ' '.join(L).center(90)
            fun(l)
        return war
    @transfor   #甜甜的函数糖
    def f1(N):    #把print定义成f1()函数
        print(N)
    
    N = [1]
    for i in range(10):
        f1(N)   #这里注意要用f()代替print()
        N.append(0)
        N = [N[k] + N[k-1] for k in range(i+2)]

    我一直在想如何不把print() 换成f1(),就是让装饰器直接作用在系统的print上,但是都失败了,好像大概是调用__main__,这样的函数,....还得在研究一下,或者有大神们知道的透露一下,谢谢啦!~~~~

猜你喜欢

转载自blog.csdn.net/Watson_Ashin/article/details/81272803