Python - 制作一个中间有两条线和三个星号的形状

Python - making a shape with two lines and three asterisks in the middle

我应该向用户询问一个数字并打印出以下形状:

用户输入 = 1(1 个单位高,1 个单位在两条线之间)

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

用户输入 = 2(2 个单位高,2 个单位之间)

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

用户输入 = 3

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

等等...

现在,我得到一个带有用户输入数字的空心方块:

side = int(input("Choose a number: "))
inner = side - 2
print ('*' * side)
for i in range(inner):
    print ('*' + ' ' * inner + '*')
print ('*' * side)

通常当你想解决 ASCII-art 问题时,你会从分析图像开始。我们在这里看到的是每张图片:

  1. 第一行有 2*n+3 个星号;
  2. 后跟 n 行,其中有一个星号、n 个空格、一个星号、n 个空格,然后又是一个星号;和
  3. 带有 2*n+3 个星号的一行。

所以我们可以简单地利用 序列 (list, string, tuple) 相乘的事实by a number 是重复给定次数的相同类型的序列。

所以对于第一行和最后一行,我们可以简单地写成'*'*(2*n+3)。中间的线可以用 '*'+' '*n+'*'+' '*n+'*' 构造,我们需要重复 n 次。所以我们可以构造一个行列表:

['*'*(2*n+3)]+['*'+' '*n+'*'+' '*n+'*']*n+['*'*(2*n+3)]
# ^ first     ^ middle line               ^ last line

然后使用'\n'.join(..)将行连接在一起:

def print_pattern(n):
    print('\n'.join(['*'*(2*n+3)]+['*'+' '*n+'*'+' '*n+'*']*n+['*'*(2*n+3)]))

这会生成:

>>> print_pattern(1)
*****
* * *
*****
>>> print_pattern(2)
*******
*  *  *
*  *  *
*******
>>> print_pattern(3)
*********
*   *   *
*   *   *
*   *   *
*********
>>> print_pattern(4)
***********
*    *    *
*    *    *
*    *    *
*    *    *
***********
>>> print_pattern(5)
*************
*     *     *
*     *     *
*     *     *
*     *     *
*     *     *
*************

您还可以通过使用 for 循环使其更具程序性(尽管这通常被认为不那么 Pythonic):

def print_pattern(n):
    print('*'*(2*n+3))
    for _ in range(n):
        print('*'+' '*n+'*'+' '*n+'*')
    print('*'*(2*n+3))

或者在用户输入的程序中:

def print_pattern(n):
    print('*'*(2*n+3))
    for _ in range(n):
        print('*'+' '*n+'*'+' '*n+'*')
    print('*'*(2*n+3))
<b>n = int(input("Eliga un número: "))
print_pattern(n)</b>

您的程序需要做两件主要的事情。首先,您需要计算顶线和底线的长度。这是 3 + 2 * (number from user),因为会有 3 个星号和 2 个空格,每个空格的长度与用户输入的数字相同。

然后你需要使用循环。首先从上面计算的数字中打印出星号的数量。然后使用循环打印出星号和空格。您可以使循环的每次迭代都打印一行,因此循环仅用于打印出正确的行数。然后打印与第一行星号匹配的最后一行。

这应该适合你:

m = 6
n = 2
for i in range(m*n+(m-n)):
    print '*',

print
for c in range(m):
    for i in range(m):
        print "*",
        for b in range(n):
            print ' ',

     print

for i in range(m*n+(m-n)):
print '*',

print

我使用 format() 来概括

def ascing(n, C, patmid = "*{0: <{gap}}*{0: <{gap}}*\n" ):
    mid = (n * patmid).format(' ', gap=n)
    print( "{0}\n{1}{0}".format((3+2*n)*C, mid) )


for x in range(1,7):
    ascing(x, '*')
    print("\n====================\n")