【问题标题】:Python 3 centered trianglePython 3 中心三角形
【发布时间】:2019-03-11 21:30:54
【问题描述】:

我正在尝试使用旧的三角形练习(目前只需要一个奇怪的输入)来磨练我的 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,所以我不必每次运行时都输入)。

用于while 循环的变量xt

另一个包含我的user_inputtemporary 变量(以防我将其递减以不“损坏”原始变量)。

一个变量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) 的三角形

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

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

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

我希望我已经尽可能地澄清了一切。

非常感谢。

【问题讨论】:

  • 您的输入 (user_input) 是否保证始终为奇数?如果不是,如果是偶数会发生什么?
  • @G_M 是的。这个程序只能接受奇数输入(目前)我计划将我的程序扩大到接受偶数输入,一旦我现在完成了奇数部分。我认为我应该首先将问题拆分为“子问题”:)

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


【解决方案1】:

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

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

【讨论】:

  • 我试图避免“for”循环和函数。我专注于嵌套的“while”循环。不过还是谢谢你的回答。
  • @KoyaCho 编辑了我的答案。删除了便利功能并更改为 while 循环;)
  • 请问为什么你每次在循环中都除以 2? :)
  • 最后一行包含input 星号,当你往上走时,你用空格替换星号。但实际上你只打印剩余星星之前的空格,所以只有一半,因此除以 2。
【解决方案2】:

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

  • t 没用,因为它只保存 0 并且永远不会更改,请使用 0 代替
  • user_input 从未使用过,除了制作 temp = user_input,使用 user_input 代替 temp。至于递减它,它不会发生,而且无论如何你永远不会将它返回给用户,所以它会没关系。
  • 这是一个拼写错误,所以没关系,但是当您在 Stack Overflow 上显示一些代码时,请避免让您的调试打印像 print(x,y) 这样,我们很难理解整个代码。
  • 如果您在while 的末尾改回spaces = " ",只需使用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

【讨论】:

  • 我对错字表示歉意!我已按要求将其删除。另一方面,您将如何使用嵌套的while 循环来处理它?非常感谢,巴蒂斯特!
  • 使用嵌套的while循环是什么意思?在这里使用另一个循环的唯一方法是添加一个无用的循环,或者找到像while &lt;something working for the n first steps&gt; while &lt;something working for the other steps&gt; 这样的案例,所以我认为你不应该这样做。
  • 编程的一般规则是简单胜于复杂所以如果你可以只用一个循环而不是两个循环,大多数时候最好只使用一。但对于更一般的情况,有时需要使用嵌套循环,即使越少越好。
【解决方案3】:

您的代码中存在错误。这是修正后的代码。

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

没有必要检查y&gt;0,因为你的第一个while循环足以满足要求。由于那个额外的while loop,你得到了(x,y)的模棱两可的值。

【讨论】:

  • 我说的是你用来打印星星和空格的 x 和 y 的值。
【解决方案4】:

使用内置 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) 

输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2016-02-24
    • 2013-11-12
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多