2

我正在尝试在 Python 中打印此模式:

    *............*
    .**........**
    ..***....***
    ...********
    ...********
    ..***....***
    .**........**
    *............*

并想出了完成这项工作的代码:

for row in range(1,5):
    print "." * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"
for row in range (0,4):
    print("." * (3-row)+ "*" *(4 -row) + row * 4 * "." +"*" *(4 -row))

我的问题:是否可以在不使用两个循环的情况下做到这一点?顺便说一句,这不是家庭作业,我只是在玩 V. Anton Spraul 的“像程序员一样思考”中的一些练习,并用 Python 而不是 C++ 实现解决方案。

提前致谢。

4

3 回答 3

3

在不更改任何其他内容的情况下,您可以在两个范围内进行循环:

for row in range(1,5)+range(4,0,-1):
    print "." * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"

由于您可以将列表添加在一起:

In [8]: range(1,5)
Out[8]: [1, 2, 3, 4]

In [9]: range(4,0,-1)
Out[9]: [4, 3, 2, 1]

In [10]: range(1,5) + range(4,0,-1)
Out[10]: [1, 2, 3, 4, 4, 3, 2, 1]

顺便说一句,您可以使用空格去掉前导点:

for row in range(1,5)+range(4,0,-1):
    print " " * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"

*............*
 **........**
  ***....***
   ********
   ********
  ***....***
 **........**
*............*

更优雅的做法可能是构建一个字符串列表:

X = []
for row in range(1,5):
    X.append(" " * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*")

现在,通过反向复制上半部分来添加下半部分:

X = X + list(reversed(X))

但是当我们打印它时,我们会看到一个列表:

print X
#['*............*', ' **........**', '  ***....***', '   ********', '   ********', '  ***....***', ' **........**', '*............*']

所以我们可以将它们与换行符连接在一起:

print '\n'.join(X)

*............*
 **........**
  ***....***
   ********
   ********
  ***....***
 **........**
*............*
于 2013-05-14T18:54:05.463 回答
0

这是一个while循环的答案

def star(size=14): ##size for the star in your post
    asterisk=1;
    space=0;
    def func(x):
        x+=1
        return x
    def decrement(x):
        x-=1
        return x
    while (asterisk > 0):
        line=''
        line+=' '*space
        if((size-(2*space)-(2*asterisk))<=0):
            line+='*'*(size-(2*space))
        else:
            line+='*'*asterisk
            line+=' '*(size-(2*space)-(2*asterisk))
            line+='*'*asterisk
        print ''.join(line)
        if((size-(2*space)-(2*asterisk))<=0):
            func=decrement ### switch to decreasing number of asterisks after we cross the middle of the star
            print ''.join(line)
        space=func(space);
        asterisk=func(asterisk);

for i in range(20): ##whee
    star(i)
于 2013-05-14T21:09:59.577 回答
0

我喜欢 askewchan 的优雅方法,它注意到顶部和底部之间的对称性。还有左右对称。这是一个利用这一点的尝试(虽然它确实有两个循环):

stars = [" "*(row-1) + "*"*row + " "*(8-row*2) for row in range(1,5)]
for line in stars + list(reversed(stars)):
    print line + line[::-1]
于 2013-05-14T22:03:24.337 回答