Python 打印一个';X';'*';

Python 打印一个';X';'*';,python,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 " *"

我正在尝试用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
但是,它打印了这个:

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

这里有一种方法:

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的恒星块。

这里有一种方法:

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的星块。

您询问是否可以使用“单圈”。那你就来了:

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

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

现在我们添加一个额外的占位符,因为除了中间的一行之外,每一行都有2个“*”。我们以一种类似于
-3-2-10123
的方式计算,中间的一行有索引
0
。因此,现在我们的字符串格式变成了
{}*{}{}

现在,第一个
*
前面的空格需要
n+1-abs(i)
空格数。
第一个
*
后面的空格需要
n+1-abs(i)
空格数

输出(n=3):

输出(n=5):

虽然人们使用整个图案大小作为输入,但我认为使用循环大小作为输入更直观。因此,只需根据需要更改
n
的值即可


PS:这不是最优雅的,也不是最易读的解决方案。但是它是在一个单循环中工作的。

您询问是否可以用一个“单循环”来完成。那你就来了:

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

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

现在我们添加一个额外的占位符,因为除了中间的一行之外,每一行都有2个“*”。我们以一种类似于
-3-2-10123
的方式计算,中间的一行有索引
0
。因此,现在我们的字符串格式变成了
{}*{}{}

现在,第一个
*
前面的空格需要
n+1-abs(i)
空格数。
第一个
*
后面的空格需要
n+1-abs(i)
空格数

输出(n=3):

输出(n=5):

虽然人们使用整个图案大小作为输入,但我认为使用循环大小作为输入更直观。因此,只需根据需要更改
n
的值即可


PS:这不是最优雅的,也不是最易读的解决方案。但是它是在一个循环中工作的。

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

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

~

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

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

~

您也可以这样做:

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

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

您也可以这样做:

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

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

我在问题中使用了您现有代码中的想法,并做了一些调整,以使用简单、清晰的代码在单个循环中完成:

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) 
def xprint(大小):
i、 j=0,尺寸为-1
当j>=0且i
它打印出:

* * * * * * * * * * * * * * * * * * * * * * * * * *
一种线性时间的简单方法

我在问题中使用了您现有代码中的想法,并做了一些调整,使用简单、清晰的代码在单个循环中完成:

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) 
def xprint(大小):
i、 j=0,尺寸为-1
当j>=0且i
它打印出:

* * * * * * * * * * * * * * * * * * * * * * * * * *
一种线性时间的简单方法

上述模式的另一个代码

i = 0
j = 6
for row in range(7):
    for column in range(7):
        if(column == i or column == j):
            print("*",end="")
        else:
            print(" ",end="")
    print("\n")
    i += 1
    j -= 1
结果:


上述模式的另一个代码

i = 0
j = 6
for row in range(7):
    for column in range(7):
        if(column == i or column == j):
            print("*",end="")
        else:
            print(" ",end="")
    print("\n")
    i += 1
    j -= 1
结果: