我需要使用Python While循环来绘制以下模式。
我花了很多时间并想出了这个代码,它完美地打印出来但是这段代码太长了,我觉得它不是那些好的代码之一。
如果这里有人可以帮我缩小这段代码或建议更好的输出方法吗?
这是代码:
#Question 10, Alternate Approach
temp = 1
pattern = ""
innerSpace = 7
starCount = 1
while temp <= 5:
st = 1
while st <= starCount:
pattern = pattern + "*"
if st != starCount:
pattern = pattern + " "
st = st + 1
sp = 0
if temp == 5:
innerSpace = 1
while sp < innerSpace:
pattern = pattern + " "
sp = sp + 1
st = 1
while st <= starCount:
if temp == 5:
st = st + 1
pattern = pattern + "*"
if st != starCount:
pattern = pattern + " "
st = st + 1
temp = temp + 1
innerSpace = innerSpace - 2
pattern = pattern + "\n"
if temp % 2 == 0:
pattern = pattern + " "
else:
starCount = starCount + 1
starCount = 2
innerSpace = 1
while temp > 5 and temp <= 9:
st = 1
while st <= starCount:
pattern = pattern + "*"
if st != starCount:
pattern = pattern + " "
st = st + 1
sp = 0
while sp < innerSpace:
pattern = pattern + " "
sp = sp + 1
st = 1
while st <= starCount:
pattern = pattern + "*"
if st != starCount:
pattern = pattern + " "
st = st + 1
temp = temp + 1
innerSpace = innerSpace + 2
pattern = pattern + "\n"
if temp % 2 == 0:
starCount = starCount - 1
pattern = pattern + " "
print pattern
答案 0 :(得分:3)
由于这看起来像是一项任务,我会给你一个提示,我会怎么做。
利用弓的对称性。它关于水平轴和垂直轴是对称的。因此,你真的只需要解决1个角,然后复制/镜像结果以获得其余的角色。
这段代码提供了一种查看问题的方法,它只是移动一个初始字符串(弓的中间)来获得所需的形状:
m = '*'
size = 4
n = 5 # must be odd
pad = ' ' * n
middle = (m + pad) * size
half = int(n / 2) + 1
print middle
print middle[half*1:]
print middle[half*2:]
print middle[half*3:]
print middle[half*4:]
print middle[half*5:]
print middle[half*6:]
产生这个:
* * * *
* * *
* * *
* *
* *
*
*
祝你好运!
答案 1 :(得分:2)
使用星号和间距并计算变量
counting=1
star_amount=1
space_amount=6
loop_var=7
while loop_var>0:
loop_var-=1
if space_amount==0:
counting*=-1
stars=" * "*star_amount
spaces=" "*space_amount
print(stars+spaces+stars)
star_amount+=counting
space_amount-= counting*2
答案 2 :(得分:2)
我会使用列表推导和字符串,并会利用图中的对称性。
不是一个完整的解决方案,但可能是循环体的一部分
In [2]: a = '*' + ' '*8
In [3]: a
Out[3]: '* '
In [24]: result = ''
In [25]: result += a
In [26]: result
Out[26]: '* '
In [27]: result += a[-1::-1]
In [28]: result
Out[28]: '* *'
In [29]: result += '\n'
In [30]: a = ' '+'*' + ' '*7
In [31]: a
Out[31]: ' * '
In [32]: result += a
In [33]: result += a[-1::-1]
In [34]: result += '\n'
In [36]: print result
* *
* *
答案 3 :(得分:2)
恕我直言,你在循环时使用,就像 循环一样。 我认为这不是你老师想要的。
时背后的想法是在满足某个条件之前运行,而不是 必要时迭代次数超过一定限度。
条件不需要包含在while语句中,您可以稍后检查并使用 break 命令来转义循环
试试这个例子:
start = '*'
while True:
print start
if start[0] == '*':
start = ' ' + start
else:
start = '*' + start
if (start == '* * *'):
break
输出只是你作业的一部分,你认为你应该能够把它解决出最终的预期结果!
答案 4 :(得分:2)
希望此时HW已经完成。由于我使用dynamic programming
解决了这个问题,我想我会在这里列出解决方案。
观察:
在观察模式时,观察到下半部分是上半部分的palindrome
。因此我们只需要计算上半部分。
接下来我们看到,对于每一行计数,我们都有类似的模式
第1行= 1,n
第2行= 2,n -1
第3行= 1,3,n-2,n
第4行= 2,4,n-3,n-1
..等等。
将迭代索引作为行数并将n
作为输入值,我们可以非常有效地动态计算剩余值。
<强>源代码强>
def get_list(bound, alist):
tmp_list = []
for i in xrange(1,bound + 1):
tmp_list.append(star if i in alist else dot)
return tmp_list
star = "*"
dot = " "
n = 20 #How large of BowTie do you want?
m = (n * 2) - 1
#get top half list
th = []
for idx,k in enumerate(xrange(1,n+1)): #run through 1 - n
row = idx + 1
tmplst = []
if row % 2 != 0:
tmplst.append(i for i in xrange(1,row + 1) if i % 2 != 0)
tmplst.append(i for i in xrange(m, m-row, -1) if i % 2 != 0)
else:
tmplst.append(i for i in xrange(1,row + 1) if i % 2 == 0)
tmplst.append(i for i in xrange(m, m-row, -1) if i % 2 == 0)
#append each row value to top half list.
th.append(sorted(set([j for i in tmplst for j in i])))
#create palindrome of top half which is our bottom half
th = th + th[len(th) -2::-1]
#create list of * and blanks
final = [get_list(m, i) for i in th]
#Print BowTie
for i in final:
print ' '.join(i)