如何使用Python 2.7绘制此蝴蝶结图案?

如何使用Python 2.7绘制此蝴蝶结图案?,python,python-2.7,Python,Python 2.7,我需要使用Python While循环绘制以下模式 我花了相当多的时间,并提出了这个代码,打印它完美,但这个代码是如此之长,我觉得它不是一个好的代码之一 如果这里有人能帮我缩小这段代码或者建议一种更好的输出方式 代码如下: #Question 10, Alternate Approach temp = 1 pattern = "" innerSpace = 7 starCount = 1 while temp <= 5: st = 1 while st <= sta

我需要使用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
#问题10,替代方法
温度=1
pattern=“”
内部空间=7
星数=1

而温度使用星号、间距和计数变量

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

因为这看起来像是一个作业,我会给你一个提示,我会怎么做

利用弓的对称性。它围绕水平轴和垂直轴对称。因此,您实际上只需要解算一个角点,然后复制/镜像结果即可得到其余的角点

该代码给出了一种解决问题的方法,即移动初始弦(弓的中间)以获得所需的形状:

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:]
这就产生了:

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

祝你好运

我会使用列表理解和字符串,并利用图形的对称性

不是完整的解决方案,但可能是循环体的一部分

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
*                *
 *              *
我知道你如何使用while循环,就好像他们使用where for循环一样。 我认为这不是你老师想要的

while背后的想法是运行直到满足某个条件,而不是 当迭代次数超过某个限制时

该条件不需要包含在while语句中,您可以稍后进行检查,并使用break命令退出循环

请尝试以下示例:

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

输出只是你作业的一部分,我想你应该能够完成它,最终达到预期的结果

希望此时HW已经完成。由于我使用
动态编程
解决了这个问题,所以我想在这里列出解决方案

意见: 在观察其模式时,观察到下半部分是上半部分的回文。因此,我们只需要计算上半部分

接下来我们看到,对于每一行计数,我们都有类似于,
第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)

不,不是。那个领结和我的不同。修改它,程序员就是这么做的!考虑将结果呈现为临时(随机访问)缓冲区而不是直接流向流。可能是原始问题中没有指定的
collections.defaultdict
?@HenrySpike。嘿,非常感谢,我试过了。虽然有一个bug,但最后两个语句应该是:star\u amount+=counting和space\u amount+=countingperfect。谢谢