python:嵌套

2024-04-25 13:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写代码,将显示一个奇数宽度的形状。完成形状后,它将被放置在外部形状中。用户将能够输入用于形状和行数的字符。 我希望产生一个形状,并与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()

Tags: 代码用户in密码forinput宽度range
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') 

不需要某些for循环:

python中一个有用的特性是可以用char乘以int得到重复stringchar。你知道吗

例如,如果您这样做:

'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。所以行37个字符,行25

如果您想,现在已经摆脱了不必要的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时,我们的计算就像打印在0行一样。为了实现这一点,一旦过了一半,我们需要将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))

相关问题 更多 >