Как напечатать этот шаблон? Я не могу получить логику устранения средней части

Напишите программу, которая запрашивает у пользователя ввод n (предположим, что пользователь вводит положительное целое число) и печатает только границы треугольника, используя звездочки '*' height n.

Например, если пользователь вводит 6, высота треугольника должна быть 6, как показано ниже, и между звездочками сверху не должно быть пробелов строка:

******
*   *
*  *
* *
**
*

Я не могу понять, как печатать часть между вершиной и концом рисунка? Это мой код:

n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
    print ("*" * i)

Цикл for предназначен для печати треугольника обратных звездочек. Препятствие - распечатать среднюю часть.

Ответ 1

На каждой итерации цикла for Вы печатаете одну строку рисунка, а длина - i. Итак, в первой и последней строке шаблона у вас будет "*" * i. В каждой другой строке шаблона вы должны напечатать один * в начале строки, один * в конце и (i - 2) пробелы посередине, потому что уже были напечатаны 2 звезды, что приводит к "*" + (" " * (i - 2)) + "*". После объединения этих двух случаев мы получаем следующий код:

n = int(input("Enter a positive integer value: "))
for i in range(n, 0, -1):
    if i == 1 or i == n:   
        print("*" * i)
    else:
        print("*" + (" " * (i - 2)) + "*")

Ответ 2

Попробуйте следующее: он избегает использования инструкции if в цикле for:

n = int(input("Enter a positive integer value: "))
print('*' * n)

for i in range (n-3, -1, -1):
    print ("*{}*".format(' ' * i))

print('*')

В течение 6 вы получите следующий результат:

******
*   *
*  *
* *
**
*

Вы также можете обрабатывать специальный случай 1 следующим образом:

n = int(input("Enter a positive integer value: "))

if n == 1:
    print '*'
else:
    print('*' * n)

    for i in range (n-3, -1, -1):
        print ("*{}*".format(' ' * i))

    print('*')

Ответ 3

Поставьте разные условия для разных способов печати. ​​

Используя тернарный оператор, вы можете сделать его одним строковым кодом:

n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
    print ("*" * i if i == n or i == 1 else "*" + " " * (i - 2) + "*")

Обратите внимание, что у вас есть только два способа печати. ​​

Трюк заключается в следующем:

Обратите внимание, что вы действительно печатаете непрерывно, когда i == n or i == 1:

******
*

Но в остальном вы даете пробелы целых (i - 2)

*   * #for 5, 3 spaces
*  *  #for 4, 2 spaces
* *   #for 3, 1 space
**    #for 2, 0 space

(Примечание: ** можно классифицировать как оба случая, тем не менее)

И поэтому вы можете сделать 1 оператор строки, чтобы выполнить его.

Edit:

Или, как Bakuriu, предложенный в комментарии, вы можете использовать результат булевой оценки Python как 1, когда true и 0, когда false, чтобы напечатать его без тройного оператора например:

n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
    print('*' + '*'[i==n]*(i-2) + '*' * (i>1))

Ответ 4

А для цикла будет более компактным, но цикл while, возможно, проще, если вы не используете петли Python

print('*'*n)
num_spaces = n - 3 # bounded by two stars, and one char shorter
while num_spaces >= 0:
    print('*' + ' '*num_spaces + '*')
    num_spaces = num_spaces - 1
if n > 1: # Don't need another asterisk for 1
    print('*')

Ответ 5

Это похоже на другие... просто используя rjust(), чтобы сделать промежутки в середине.

def print_a_triangle(n):
    print("*" * (n+3))
    for i in range(n):
        print("{}{}{}".format("*", str(" ").rjust(n-i), "*"))

    print("*")

print_a_triangle(6)

*********
*      *
*     *
*    *
*   *
*  *
* *
*