如何使用Python 2.7绘制这个领结图案?

时间:2017-10-04 15:16:00

标签: python python-2.7

我需要使用Python While循环来绘制以下模式。

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

5 个答案:

答案 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)