2016-08-17 2 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

Прежде всего, я предполагаю, что вы действительно не хотите, чтобы напечатать что у значение 10; что вы действительно хотели уменьшить базовое 10 до 0. Обратите внимание, что у вас есть дополнительный символ в базе пирамиды.

Do не изменить значение параметра цикла, когда вы находитесь внутри цикла. В частности, не меняйте y в пределах для y.

Get rid 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)] 

Затем этот список персонажей соединяется с не интерстициального характера; это составляет половину строки. Вторая половина строки - это другой цикл (отсчет). Перед этим я конкатенирую необходимое количество пробелов.

Честно говоря, я предпочитаю свою первую форму.

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
Смежные вопросы