Python 3居中的三角形

时间:2018-10-06 17:12:37

标签: python python-3.x loops while-loop

我正在尝试通过良好的旧三角练习(目前仅需要一个奇数输入)来完善我的Python 3(特别是嵌套循环)。但是,我遇到了一个无法解决的问题。

user_input = 7
x = 1
temp = user_input
spaces = " "
stars = ""
y = temp - 2
t = 0
while x < temp:
    while y > t:
        stars = "*" * x
        spaces = spaces * y
        print(spaces + stars)
        spaces= " "
        y -= 1
        x += 2

我有一个user_input(现在是7,所以我每次运行时都不必输入)。

用于x循环的变量twhile

另一个temp保留我的user_input的基本变量(以防我递减该变量以免“损坏”原始变量)。

一个变量spaces和另一个变量stars(当我试图根据星号绘制三角形时,应该可以自我解释)。

我有一个变量y,它等于temp - 2

预期的输出7应该是这样的:

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

之所以使y等于temp - 2是因为第一行的空格等于user_input - 2

因此,假设我们的输入为7,第一行的空间为5。

如果我们的输入为9,则第一行的空间为7

第一个while循环将从1循环到7(1、3、5、7),这就是为什么我使x等于1的原因。

第二个while循环应从input - 2一直循环到0。

奇怪的是,如果我的user_input等于5,它输出的正是我的期望值。

   *
  ***
 *****

但是一旦我输入类似7的东西,它就会建立一个1到9(1、3、5、7、9)的三角形

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

但是我希望它在最后一行之前结束,它应该输出与我输入的一样多的星号。

我的思考过程错了吗?如果是这样,我到底哪里出错了?

我希望我已尽一切可能弄清楚了。

谢谢。

4 个答案:

答案 0 :(得分:3)

似乎过于复杂。为什么不只是:

input = 7
i = 1
while i <= input:
    spaces = ' ' * ((input-i) // 2) 
    stars = '*' * i
    print(spaces + stars)
    i += 2 

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

或更简单,使用str.center

while i <= input:
    print(('*' * i).center(input))
    i += 2

答案 1 :(得分:1)

让我们稍微澄清一下您的代码:

  • t是无用的,因为它仅包含0且永不更改,请改用0
  • user_input从未使用过,只能用于制作temp = user_input,使用user_input代替temp。至于递减,它是不会发生的,无论如何,您永远不会将它退还给用户,这样就可以了。
  • 这是一种错字,没关系,但是在Stack Overflow上显示某些代码时,避免让调试打印像print(x,y)一样,我们很难理解整个代码。
  • 如果您在spaces = " "的末尾改回while,只需使用spaces = " " * y
  • 您无需在两个while之间进行任何操作,因此可以根据条件与and“合并”。

现在我们有了:

user_input = 9
x = 1
y = user_input - 2
while x < user_input and y > 0:
    stars = "*" * x
    spaces = " " * y
    print(spaces + stars)
    y -= 1
    x += 2

如您所见,while上有两个停止条件,而只有一个更清晰。您的代码使用7而不是更多的原因是因为7是一个条件停止循环与另一个条件停止循环之间的限制。

我建议将您的代码更改为:

user_input = 3
x = 0
while x < user_input//2:
    stars = "*" * (x * 2 + 1)
    spaces = " " * (user_input//2 - x)
    print(spaces + stars)
    x += 1

答案 2 :(得分:1)

您的代码中有一个错误。这是更正的代码。

user_input = 7
x = 1
temp = user_input
spaces = " "
stars = ""
y = temp - 2
t = 0
while x <= temp:
    stars = "*" * x
    spaces = spaces * y
    print(spaces + stars)
    spaces= " "
    y -= 1
    x += 2

由于您的第一个while循环足以满足要求,因此不必检查y>0。由于存在额外的while loop,您将获得(x,y)的含糊值。

答案 3 :(得分:0)

使用内置center()format mini language的惰性解决方案:

user_input = [5,7,9]

def getStars(num):
    return ('*' * i for i in range(1,num+1,2))

def sol1(num):
    for s in getStars(num):
        print(s.center(num)) 

def sol2(num):
    stars = getStars(num)

    for s in stars:
        print( ("{:^"+str(num)+"}").format(s))

for s in user_input:
    sol1(s)
    sol2(s) 

输出:

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