我正在尝试通过良好的旧三角练习(目前仅需要一个奇数输入)来完善我的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
循环的变量t
和while
另一个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)的三角形
*
***
*****
*******
*********
但是我希望它在最后一行之前结束,它应该输出与我输入的一样多的星号。
我的思考过程错了吗?如果是这样,我到底哪里出错了?
我希望我已尽一切可能弄清楚了。
谢谢。
答案 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。至于递减,它是不会发生的,无论如何,您永远不会将它退还给用户,这样就可以了。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)
输出:
*
***
*****
*
***
*****
*
***
*****
*******
*
***
*****
*******
*
***
*****
*******
*********
*
***
*****
*******
*********