2016-08-17 107 views
0

您可以帮助简化此代码并使其更高效吗?我觉得它不是最好的版本;我可以改进什么?金字塔数字样式练习

 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 

回答

0

首先,我猜你真的不想要打印Y的10值;你真的希望base-10减少到0.请注意,你在金字塔底部有一个额外的字符。

不是当您在循环内时更改循环参数的值。具体而言,请勿在y循环中更改中的y。

摆脱Ç的;你可以从其他值中派生出来。

为了提高灵活性,让您的上限参数:你有两个常量(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)] 

然后,字符的这个列表被接合没有间隙字符;这形成了该行的一半。该行的后半部分是另一个循环(倒数)。在所有这一切的前面,我连接了适当数量的空格。

坦率地说,我更喜欢我的第一种形式。

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 
789