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

私の質問: 2 つのループを使用せずにこれを行うことは可能ですか? ところで、これは宿題ではありません。私は、V. Anton Spraul による「Think Like a Programmer」のいくつかの演習をいじって、C++ ではなく Python でソリューションを実装しているだけです。

前もって感謝します。

4

3 に答える 3

3

他に何も変更せずに、2 つの範囲でループを実行できます。

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

これが1つの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のエレガントなアプローチが気に入りました。左右対称もあります。これを利用する試みを次に示します (ただし、2 つのループがあります)。

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 に答える