使用循环创建菱形图案

时间:2015-09-16 16:03:49

标签: python python-3.x

我正在尝试编写一个读取整数的程序,并使用星号显示给定边长的填充菱形。例如,如果边长为4,程序应显示

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

这是我想要做的。它正在执行,但我似乎无法为程序提供合适的空间来正确显示钻石形状....

userInput = int(input("Please input side length of diamond: "))

if userInput > 0:
    for i in range(userInput):
        for s in range(userInput -3, -2, -1):
            print(" ", end="")
        for j in range(i * 2 -1):
            print("*", end="")
        print()
    for i in range(userInput, -1, -1):
        for j in range(i * 2 -1):
            print("*", end="")
        print()

谢谢!

5 个答案:

答案 0 :(得分:6)

以下内容如何:

side = int(input("Please input side length of diamond: "))

for x in list(range(side)) + list(reversed(range(side-1))):
    print('{: <{w1}}{:*<{w2}}'.format('', '', w1=side-x-1, w2=x*2+1))

,并提供:

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

那它是如何运作的?

首先,我们需要一个计数最多为side的计数器,然后再次退回。没有什么可以阻止你将两个范围列表附加在一起,所以:

list(range(3)) + list(reversed(range(3-1))

这会为您提供一个列表[0, 1, 2, 1, 0]

从这里我们需要计算出每行所需的正确空格和星号数量:

  *        needs 2 spaces 1 asterix
 ***       needs 1 space  3 asterisks
*****      needs 0 spaces 5 asterisks

因此需要两个公式,例如side=3

x   3-x-1   x*2+1
0   2       1
1   1       3
2   0       5

使用Python的字符串格式,可以指定填充字符和填充宽度。这避免了必须使用字符串连接。

如果您使用的是Python 3.6或更高版本,则可以使用f字符串表示法:

for x in list(range(side)) + list(reversed(range(side-1))):
    print(f"{'': <{side - x - 1}} {'':*<{x * 2 + 1}}")

答案 1 :(得分:0)

这可能会对您有所帮助:

var promise = $q.when(true);

for (var i = 0; i < jobs; i++) {
  promise = promise.then(function () {
    return $http(job);
  })
}

userInput = 6的输出:

n = userInput

for idx in range(n-1):
    print((n-idx) * ' ' + (2*idx+1) * '*')
for idx in range(n-1, -1, -1):
    print((n-idx) * ' ' + (2*idx+1) * '*')

答案 2 :(得分:0)

感谢大家,我能够根据我收到的帮助制定/更正我的代码。感谢您的所有投入并帮助SO社区!

if userInput > 0:              # Prevents the computation of negative numbers
    for i in range(userInput):
        for s in range (userInput - i) :    # s is equivalent to to spaces
            print(" ", end="")
        for j in range((i * 2) - 1):
            print("*", end="")
        print()
    for i in range(userInput, 0, -1):
        for s in range (userInput - i) :
            print(" ", end="")
        for j in range((i * 2) - 1):
            print("*", end="")
        print()

答案 3 :(得分:0)

    def build(width):
        if width%2==0: 
            x=[(' *'*i).center(width*2,' ') for i in range(1,(width*2/2))]
        else: 
           x=[(' *'*i).center(width*2+1,' ') for i in range(1,((width*2+1)/2))]
        for i in x[:-1]+x[::-1]: print i

这适用于任何正宽度,但有空格填充* s

答案 4 :(得分:0)

这个怎么样:

n = 5
stars = [('*' + '**'*i).center(2*n + 1) for i in range(n)]

print('\n'.join(stars + stars[::-1][1:]))

输出:

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

这与上面的一些答案类似,但我发现语法更简单易读。