python:嵌套

时间:2017-08-06 11:04:18

标签: python function for-loop

我正在尝试编写将显示奇数宽度的形状的代码。一旦形状完成,它就被放置在外形内。用户将能够输入用于形状和行数的字符。 我希望能够生成一个形状,并且带有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()

2 个答案:

答案 0 :(得分:2)

不需要一些for循环:

python中一个有用的功能是,您可以将char乘以int,以获得重复string的{​​{1}}。

例如,如果你这样做:

char

你得到:

'c' * 10

这对您的案例有用的原因是您可以使用它来打印'cccccccccc' spaces。这将比chars更整洁,而不是一遍又一遍地打印单个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。因此,行+13个字符,行72等。

如果您愿意,因为您现在已经摆脱了不必要的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计数,以便在rowprinting时,我们计算好像在行4上打印一样。要做到这一点,一旦过了一半,我们需要将0变量模数为总row的一半(现在总行数不是输入的数量,但输入数量加倍,因为你可以看到我们有一个三角形,rows行,但输入的行值为8)。这将使三角形的预期效果为整个三角形的一半大小。

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

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

rows - r

答案 1 :(得分:0)

使这更容易的一种方法是首先不要担心空间。只需生成每行的非空格符号,并将它们保存到列表中。然后在最后,确定最大行的宽度,并使用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,默认值为&#39; *&#39;对于内部字符(ic)和&#39;。&#39;对于外部字符(oc)。但是如果你想使用其他字符,你可以传递它们,如下所示:

tri(4, '@o')