【问题标题】:python: Nesting蟒蛇:嵌套
【发布时间】:2017-08-06 11:04:17
【问题描述】:

我正在尝试编写代码来显示具有奇数宽度的形状。完成形状后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。 我希望生成一个形状,并使用 for 循环生成一个外部形状。

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

这是我当前的代码。我只知道如何创建一个形状。

char = (input("Enter first charactrer"))

rows = int(input("enter the number of rows"))

for m in range(rows, 0, -1):
    for n in range(0, rows-m):
        print(end=" ")
    for n in range(0,m):
        print(char,end=" ")
    print()

【问题讨论】:

  • 您不需要在第一个 input 周围加上括号,因为它无论如何都会返回 string

标签: python function for-loop


【解决方案1】:

不需要某些 for 循环:

python 中一个有用的功能是您可以将 char 乘以 int 以得到重复的 charstring

例如,如果你这样做:

'c' * 10

你得到:

'cccccccccc'

这对您的情况有用的原因是您可以使用它来打印spaceschars。这将比 for-loops 更整洁,因为您可以一次调用将全部空格数打印为字符串,而不是一遍又一遍地打印单个 chars 而没有换行符。

为了明白我的意思,我使用以下代码编写了您的原始代码:

char = input("enter the char ")
rows = int(input("enter the number of inner rows "))

for r in range(rows, 0, -1):
    print(' ' * 2 * (rows-r), end='')
    print((char+' ') * (2*r+1))

看看它有多整洁?此外,您可以注意到在chars 的每一行的第二个打印中,我使用了计算:2*r +1。这是您转换此模式所需的:

3. * * * *
2.  * * *
1.   * *
0.    *

到这个(根据您的要求):

3. *******
2.  *****
1.   ***
0.    *

您可以看到,对于第二行的每一行,chars 的数量为2 * row +1。所以3 行有7 chars,2 行有5 等等。

如果您愿意,因为您现在已经摆脱了不必要的 for-loops,您可以将两个 prints 放在一个语句中:

print(' ' * 2 * (rows-r) + (char+' ') * (2*r+1))

但是,第一个可能被认为更简洁明了,因此您可能希望坚持使用单独的语句。

将内部三角形嵌入外部三角形

首先,我们需要input 两个不同的chars 用于内部和外部三角形。这将使我们能够区分哪个是哪个。

我认为最好的方法是保留print 语句,它像以前一样在三角形之前创建空格,但修改我们绘制字符及其模式的方式。

这就是我们想要4 行的输入:

0.        .
1.       ...
2.      .....
3.     .......
4.    .*******.
5.   ...*****...
6.  .....***.....
7. .......*.......

注意将printing 进程分成两半是最简单的。所以上半部分只打印一个正三角形,但底部打印一个regular、一个flipped和另一个regular

为此,我们希望遍历8 的每一行并检查我们何时完成了一半。如果过了一半,我们希望每个较小三角形的计算都认为它们位于三角形的顶部,即重置它们的 row 计数,因此当 printing4 时,我们计算就像打印在行 @ 987654360@。为了实现这一点,一旦过了一半,我们需要将 row 变量与总数 rows 的一半取模(现在的总行数不是输入的内容,而是输入数量的两倍,如您所见,我们有一个三角形8 行,但输入的行值为4)。这将使三角形的预期效果是整个三角形的一半。

最后,要考虑的最后一件事是中心/内部三角形需要像我们之前所做的那样翻转。由于我们的行数现在从顶部的 0 向下而不是相反,我们需要将该行的计算更改为 rows - r 以便翻转。

考虑到所有这些,最终代码可能如下所示:

innerChar = input("enter the inner char ")
outerChar = input("enter the outer char ")

rows = int(input("enter the number of inner rows "))

for r in range(2 * rows):
    #print the white space on the left
    print(' ' * 2 * (2 * rows-r), end='')
    if r < rows:
        #top triangle
        print((outerChar+' ') * (2*r + 1))
    else:
        #working with the row modulo 2
        r %= rows
        #bottom three triangles
        print((outerChar+' ') * (2*r + 1), end='')
        print((innerChar+' ') * (2*(rows-r) - 1), end='')
        print((outerChar+' ') * (2*r + 1))

【讨论】:

    【解决方案2】:

    使这更容易的一种方法是一开始不要担心空格。只需生成每一行的非空格符号,并将它们保存到一个列表中。然后在最后,确定最大行的宽度,并使用str.center 方法以正确的空间量打印每一行。

    def tri(n, chars='*.'):
        ic, oc = chars
        outer = range(1, 2*n, 2)
    
        # top triangle chars
        rows = []
        for w in outer:
            rows.append(w * oc)
    
        # lower triangles chars
        inner = reversed(outer)
        for u, v in zip(outer, inner):
            a, b = u * oc, v * ic
            rows.append(a + b + a)
    
        # Get maximum row size
        width = len(rows[-1])
    
        #Print all the rows
        for row in rows:
            print(row.center(width))
    
    # test
    
    tri(5)
    

    输出

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

    要使用的字符作为两个字符串传递给tri,内部字符(ic)和'.'的默认值为'*'。对于外部字符(oc)。但是如果你想使用其他字符,你可以传递它们,像这样:

    tri(4, '@o') 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 2010-10-27
      • 2010-10-21
      • 2016-05-28
      • 2014-08-01
      • 2021-06-28
      • 1970-01-01
      相关资源
      最近更新 更多