2

我正在尝试使用 *s 打印出箭头。到目前为止,我的代码看起来像这样。

def head(n):
    while n > 0:
        print n * "*"
        n = n - 1

print head(input())

它可以工作,但如果我输入 11,它会打印:

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

但我希望它像这样打印:

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

哪个箭头少,但我不知道该怎么做。

4

5 回答 5

4

它使函数更简单地考虑你想要多少行:

def head(lines):
    for n in range(1,lines*2,2):           # count 1,3,5...
        print(('*'*n).center(lines*2-1))

输出:

>>> head(5)
    *    
   ***   
  *****  
 ******* 
*********

这是使用不那么明显的可变长度格式的另一种方法:

def head(lines):
    for n in range(1,lines*2,2):
        print('{:^{}}'.format('*'*n,lines*2-1))
于 2013-10-28T11:21:05.840 回答
2

使用字符串格式:

def head(size):
    n=1
    while n < size+1:
        stars = n * "*"
        print '{:^30}'.format(stars)
        n += 2

它会将您的星号集中在 30 个字符宽的字段上。

于 2013-10-28T10:53:23.893 回答
1
def printHead(n):
    for l in range(1,n):
        print " "*(n-l)+"*"*(1 if l==1 else 2*l-1)

每行都有level-1空格。那么如果是第一个级别的开始,否则它有2*level-1

>>> printHead(6)
     *
    ***
   *****
  *******
 *********
于 2013-10-28T10:55:09.943 回答
0
  1. 一行上的星数等于 2n - 1,其中 n 是行号。
  2. 我不会在这个函数中调用参数“n”,因为我不清楚它是指线条还是星星。
  3. 您可以使用该center函数根据指定的宽度用空格包围字符串。您希望箭头以最长的线为中心,因此您需要 2 个变量,一个用于跟踪当前行,另一个用于记住最大的行。
  4. 您希望以与您演示的相反的方向进行迭代,因为您希望箭头指向上方,而不是向下。

我认为这应该适合你:

def head(total_lines):
  for current_line in range(1, total_lines + 1):
    print ((2 * current_line - 1) * "*").center(2 * total_lines - 1)
于 2013-10-28T10:56:29.400 回答
0
def head(n):
    total = 2 * n - 1
    s = ''
    for i in xrange(1, n + 1):
        k = 2 * i - 1
        s += ' ' * ((total - k) / 2) + '*' * k + '\n'
    return s
于 2013-10-28T10:57:43.420 回答