打印' X' ' *'的模式

时间:2016-06-25 05:20:35

标签: python

我试图在Python中打印这个模式:

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

并想出了这段代码:

size = 7
inner_size = size - 3
space=0

for i in range(inner_size):
    print (' ' * space + '*' + ' ' * inner_size + '*')
    inner_size -=2
    space +=1
print "    *"

t_size=7
t_inner_size = 0
space=3
for i in range(inner_size):
    print (' ' * space + '*' + ' ' * inner_size + '*')
    inner_size +=2
    space -=1

但是,它打印出来:

*    *
 *  *
  **
   **
    *

如何打印所需的图案? 是否可以在一个循环中执行此操作?

5 个答案:

答案 0 :(得分:3)

以下是一种方法:

def pattern(size):
    for i in range(size):
        print("".join("*" if j == i or size - 1 - j == i else " "
                      for j in range(size)))

详细信息:i是行索引,j是列索引(均为从零开始)。 j == i条件从左上角到右下角生成对角线。 size - 1 - j == i条件从右上角到左下角生成对角线。它们一起产生X形状。

当调用大小为7时:

pattern(7)

打印:

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

请注意,它适用于偶数和奇数尺寸。在大小均匀的情况下,得到的X将在中心包含一个2x2的恒星块。

答案 1 :(得分:2)

您询问是否可以使用' 单循环'来完成。所以你去了:

n = 3
for i in range(-n, n + 1):
    print('{}*{}{}'.format(
        (n + 1 - abs(i)) * ' ',
        (2 * abs(i) - 1) * ' ',
        '' if i == 0 else '*'))

说明:

对于任何给定的行,我们需要2组空格。第一个*之前的空格和第一个*之后的空格。我们将字符串格式化如下:{}*{}

现在我们添加一个额外的占位符,因为每行都有2x'*',中间行除外。我们的计数方式类似于-3 -2 -1 0 1 2 3,中间行有索引0。因此,现在我们的字符串格式变为{}*{}{}

现在,第一个*需要n + 1 - abs(i)之前的空格没有。空间。
在第一个*需要n + 1 - abs(i)没有空格之后的空格。

输出(n = 3):

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

输出(n = 5):

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

虽然人们使用整个图案尺寸作为输入,但我认为使用重复尺寸作为输入更为直观。因此,只需根据需要更改n的值。

PS:这不是最优雅的,也不是最清晰的解决方案。但它适用于 单个 循环。

答案 2 :(得分:1)

解决问题的另一种方法是:

for i in range(5):
      for j in range(5):
           if ((i==j) or j==(5-i-1)):
               print " *",
           else:
               print " ",
       print ""

答案 3 :(得分:1)

你也可以这样做:

pattern_size = 7
for t in range(pattern_size):
    pattern = list(" " * pattern_size)
    pattern[t] = "*"
    pattern[-(t+1)] = "*"
    print("".join(pattern))

输出:

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

答案 4 :(得分:1)

我在问题中使用了现有代码中的想法,并通过简单,清晰的代码在一个循环中进行了一些调整:

def xprint(size):
    i,j = 0,size - 1

    while j >= 0 and i < size:

        initial_spaces = ' '*min(i,j)
        middle_spaces = ' '*(abs(i - j) - 1)
        final_spaces = ' '*(size - 1 - max(i,j))

        if j == i:
            print initial_spaces + '*' + final_spaces
        else:
            print initial_spaces + '*' + middle_spaces + '*' + final_spaces

        i += 1
        j -= 1

xprint(7) 

打印出来:

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

线性时间直接的方式。