1 #編寫一個函數,接受參數n ,n為正整數,左右兩種對齊打印方式,要求數字必須對齊。 2 ''' 3 4 1 6 5 4 3 2 1 5 2 1 5 4 3 2 1 6 3 2 1 4 3 2 1 7 4 3 2 1 3 2 1 8 5 4 3 2 1 2 1 9 6 5 4 3 2 1 1 10 ''' 11 12 # NO 1 最基本的,打印空格方式 13 # 上三角 14 def triangle_print(n): 15 for i in range(1, n+1): 16 for j in range(n,0, -1): 17 if i < j: 18 print(' '* len(str(j)),end=' ')# 因為隨着數字位數不同,寬度不同 19 # ‘12 ’ ‘100 ’ ‘1000 ’ 20 else: 21 print(j, end=' ') 22 print() 23 24 triangle_print(5) 25 26 # 下三角 27 def triangle_print(n): 28 for i in range(1, n+1): 29 for j in range(1, n+1): 30 if i > j: 31 print(' ' * len(str(j)), end=' ') 32 else: 33 print(n+1-j, end=' ') 34 print() 35 36 triangle_print(7) 37 38 39 # NO 2 使用對齊方式,問題是不知道最后一行多寬 40 41 # 思路是 九九乘法表,先都向左靠齊,在整體向右靠齊 42 43 # 上三角 44 def triangle_print(n): 45 for i in range(1, n+1): 46 s = '' 47 for j in range(i, 0, -1): 48 s += '{}{}'.format(j, ' ') 49 print('{:>30}'.format(s)) # 這里的向右靠齊,寬度不能確定 50 51 triangle_print(10) 52 53 # 下三角 54 def triangle_print(n): 55 for i in range(1, n+1): 56 s = '' 57 for j in range(n+1-i, 0, -1): 58 s += '{}{}'.format(j, ' ') 59 print('{:>30}'.format(s)) # 這里的向右靠齊,寬度不能確定 60 61 triangle_print(10) 62 63 # NO 3 基於第二種方法,考慮先打印最后一行,就知道向右靠齊多寬 64 65 # 上三角 66 def triangle_print(n): 67 tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)]) 68 width = len(tail) 69 for i in range(1, n): 70 s = '' 71 for j in range(i, 0, -1): 72 s += '{}{}'.format(j, ' ') 73 print('{:>{}}'.format(s, width+1)) 74 print(tail) 75 triangle_print(15) 76 77 # 優化: 78 def triangle_print(n): 79 tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)]) 80 width = len(tail) 81 for i in range(1, n): 82 print('{:>{}}'.format(' '.join([str(j) for j in range(i, 0, -1)]),width)) 83 print(tail) 84 triangle_print(15) 85 86 # 下三角 87 def triangle_print(n): 88 tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)]) 89 width = len(tail) 90 print(tail) 91 for i in range(1, n): 92 print('{:>{}}'.format(' '.join([str(j) for j in range(n-i, 0, -1)]),width)) 93 94 triangle_print(15) 95 96 ''' 97 98 1 6 5 4 3 2 1 99 2 1 5 4 3 2 1 100 3 2 1 4 3 2 1 101 4 3 2 1 3 2 1 102 5 4 3 2 1 2 1 103 6 5 4 3 2 1 1 104 ''' 105 # NO 5 基於上面的思路,發現,可以通過最后一行得到所有,而不用每一行都計算。也就是切片 106 107 # 上三角 108 def triangle_print(n): 109 tail = ' '.join([str(i) for i in range(n, 0, -1)]) 110 width = len(tail) 111 step = 2 112 start = -1 113 points = {10 ** i for i in range(1,3)} 114 115 for i in range(1, n+1): 116 print('{:>{}}'.format(tail[start:],width)) 117 # if len(str(i+1)) > 2: 118 if i+1 in points: 119 step += 1 120 start = start - step 121 triangle_print(15) 122 123 # 下三角 # 這個版本只能取到10 ,兩位數超過兩個,就出現問題,因為所有的step都按照2 來算了 124 def triangle_print(n): 125 tail = ' '.join([str(i) for i in range(n, 0, -1)]) 126 width = len(tail) 127 print(width) 128 print(tail) 129 130 for i in range(n - 1, 0, -1):# 10,9 131 if len(str(i)) == 2: 132 step = 3 133 if len(str(i)) == 1: 134 step = 2 135 start = width - step * (n - i)# 9-2*1 136 print('{:>{}}'.format(tail[-start:],width)) 137 138 triangle_print(10) 139 140 # NO 6 141 ''' 142 143 1 6 5 4 3 2 1 144 2 1 5 4 3 2 1 145 3 2 1 4 3 2 1 146 4 3 2 1 3 2 1 147 5 4 3 2 1 2 1 148 6 5 4 3 2 1 1 149 ''' 150 # 下三角 打印最后 一行,剩余的 遇到一個空格,就把之前的都化為空格,后面的打印,也是利用切片 151 def showtail(n): 152 tail = ' '.join([str(i) for i in range(n, 0, -1)]) 153 print(tail) 154 for j in range(len(tail)): 155 if tail[j] == ' ': 156 print(' ' * j ,tail[j+1:]) 157 showtail(15)