2013-05-14 5 views
2

Я пытаюсь напечатать этот шаблон в Python:Печать X-типа рисунка в Python 2.7

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

И придумал этот код, который делает работу:

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

Мой вопрос: можно ли это сделать без использования двух петель? Кстати, это не для домашних заданий, я просто играю с некоторыми упражнениями от «Подумайте, как программист» В. Антона Спара и реализуя решения на Python, а не на C++.

Заранее благодарен.

ответ

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) 

*............* 
**........** 
    ***....*** 
    ******** 
    ******** 
    ***....*** 
**........** 
*............* 
+0

Спасибо. Я не знал, что вы можете добавлять диапазоны вместе. Но, как вы сказали, поскольку вы можете добавлять списки, это имеет смысл. –

+0

И на самом деле все «.» Должны быть пробелами, я просто использовал их для отслеживания пробелов. –

+0

Вы можете, и это объясняет, почему '[1,1] + [2,2]' не '[3,3]'. Также см. Мое обновление о том, как отменить и добавить список. – askewchan

0

вот ответ с один в то время как петля

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) 
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] 
Смежные вопросы