2017-10-04 13 views
2

我需要使用Python While循环绘制以下模式。如何使用Python 2.7绘制这个领结图案?

enter image description here

我花了相当多的时间和与此代码打印它完美地来到了但是这个代码是这么多长,我觉得它不是那种好码之一。

如果这里有人能帮我缩小这段代码或者提出一个更好的输出方式吗?

这里是代码:

#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

不,它不是。这个领结与我的相比有不同的模式。 –

+0

修改它,这就是程序员所做的! –

+0

考虑渲染到临时(随机访问)缓冲区,而不是直接渲染到流。也许'collections.defaultdict'? – o11c

回答

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:] 

其中产量此:

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

祝你好运!

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 
+0

非常感谢,但它在我的大学任务中,我需要通过循环来完成。 –

+0

@HenrySpike原始问题中没有指定。 – SethMMorton

+0

我已经编辑它到您的需求 –

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 
*    * 
*    * 
2

的一部分循环多,如果他们在那里为循环。 我不认为这是你的老师想要的。

背后的想法是运行,直到满足某些条件,而不是 必然当迭代次数超过一定的限制。

条件并不需要包括在while语句中,您可以稍后检查,并使用突破命令逃跑的循环

尝试例如这样的:

start = '*' 
while True: 
    print start 
    if start[0] == '*': 
     start = ' ' + start 
    else: 
     start = '*' + start   
    if (start == '* * *'): 
     break 

输出只是你作业的一部分,认为你应该能够把它解决到最终的预期结果!

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)