种金字塔数字模式练习

时间:2016-08-17 00:18:27

标签: python design-patterns numbers

您能帮助简化此代码并提高效率吗?我似乎不是最好的版本;我能改进什么?

     1
    232
   34543
  4567654
 567898765
678901109876

这是我制作的代码:

c = -1

for y in range(1, 7):
    print()
    print((6-y) * " ", end="")
    c += 1

    for x in range(1, y+1):
        print(y%10, end="")
        y += 1

    while y - c > 2:
        print(y-2, end="")
        y -= 1

2 个答案:

答案 0 :(得分:0)

首先,我猜你并不是真的想要打印 y 值10;你真的希望将10的基数减少到0.注意你在金字塔底部有一个额外的字符。

当您在循环内部时,更改循环参数的值。具体而言,不要在 for y 循环中更改y。

摆脱 c ;你可以从其他值中得出它。

为了灵活性,请将上限设为参数:有两个常量(6和7)取决于一个概念(行限制)。

这是我的版本:

row_limit = 7

for y in range(1, row_limit):
    print()
    print((row_limit-y-1) * " ", end="")

    for x in range(y, 2*y):
        print(x%10, end="")

    for x in range(2*(y-1), y-1, -1):
        print(x%10, end="")

print()

输出:

     1
    232
   34543
  4567654
 567898765
67890109876

如果你真的想推送东西,你可以用字符串连接和理解来缩短循环,但它可能更难为你阅读。

for y in range(1, row_limit):
    print()
    print((row_limit-y-1) * " " + ''.join([str(x%10) for x in range(y, 2*y)]) + \
              ''.join([str(x%10) for x in range(2*(y-1), y-1, -1)]), end="")

print()

每个循环都变成了列表理解,例如:

[str(x%10) for x in range(y, 2*y)]

然后,这个字符列表没有插页符加入;这形成了一半的行。该行的后半部分是另一个循环(倒计时)。在所有这些之前,我连接了适当数量的空格。

坦率地说,我更喜欢我的第一张表格。

答案 1 :(得分:0)

这是我的实施。

Python 2

def print_triangle(n):
    for row_num in xrange(1, n + 1):
        numbers = [str(num % 10) for num in xrange(row_num, 2 * row_num)]
        num_string = ''.join(numbers + list(reversed(numbers))[1:])
        print '{}{}'.format(' ' * (n - row_num), num_string)

Python 3

def print_triangle(n):
    for row_num in range(1, n + 1):
        numbers = [str(num % 10) for num in range(row_num, 2 * row_num)]
        num_string = ''.join(numbers + list(reversed(numbers))[1:])
        print('{}{}'.format(' ' * (n - row_num), num_string))

<强>输入

print_triangle(5)
print_triangle(6)
print_triangle(7)

<强>输出

    1
   232
  34543
 4567654
567898765
     1
    232
   34543
  4567654
 567898765
67890109876
      1
     232
    34543
   4567654
  567898765
 67890109876
7890123210987