*我需要根据整数输入制作一个三角形图案的三角形。
例如:
n = 2    *
   ***
 *  *  *
*********
n = 3            *
           ***
          *****
       *    *    *
      ***  ***  ***
     ***************
  *    *    *    *    *
 ***  ***  ***  ***  ***
*************************
我已经弄清楚了单个三角形的代码,但我不知道如何复制它们,以便它们看起来像三角形的三角形。
这是我的一个三角形的代码:
rows = int(input())
for i in range(rows):
    for j in range(i, rows):
        print(" ", end="")
    for j in range(i):
        print("*", end="")
    for j in range(i + 1):
        print("*", end="")
    print()
Tro*_*oll 55
我简化了以下代码,因此它现在看起来比以前更清晰易于理解。
n = int(input("n = "))
rows = n ** 2
base = n * 2 - 1
for row in range(rows):
    triangle = row // n
    level = row % n
    a_space = " " * (n - triangle - 1) * base
    b_space = " " * (n - level - 1)
    line = (a_space + (b_space + "*" * (level * 2 + 1) + b_space)
        * (triangle * 2 + 1)).rstrip()
    print(line)
这种方法一次性打印出所有内容。在下面的解释中,我将分解代码的组成部分、这些变量的含义以及它们的工作原理。
我要提到的第一个变量是n,层数或每个三角形的高度。它也是相互堆叠的三角形的数量。
第二个变量是rows,输出中的行数。我们可以看到行数等于n平方的模式。
下一个变量是base. 它是三角形底部星号的数量。正如我们可能已经注意到的,它也遵循奇数的模式。
之后,我们的循环开始,迭代每一行,并打印出结果。
这些变量告诉我们当前处于哪个三角形以及三角形的水平面。triangle您可以通过打印出来和每次迭代来亲自尝试level。
for row in range(rows):
    triangle = row // n
    level = row % n
    print(triangle, level)
下一部分是缩进。只是为了让您简要了解什么是a_space和b_space是什么,这里有一个描述空间的视觉表示。
a_space在每个三角形之后收缩,并且b_space在每个水平之后收缩。
a_space = " " * (n - triangle - 1) * base
b_space = " " * (n - level - 1)
我们乘以a_space是base因为 1a_space的长度等于底数。
让我们一步步来看。
- 首先,我们以 开始我们的生产线
a_space。Run Code Online (Sandbox Code Playgroud)a_space
- 然后,我们打印出星号。星号的数量遵循奇数的模式。Run Code Online (Sandbox Code Playgroud)
"*" * (level * 2 + 1)
- 我们用 来打开和关闭星号
b_space。Run Code Online (Sandbox Code Playgroud)b_space + "*" * (level * 2 + 1) + b_space
- 然后,我们只需将整个结果乘以水平相邻堆叠的三角形的数量。Run Code Online (Sandbox Code Playgroud)
(b_space + "*" * (level * 2 + 1) + b_space) * (triangle * 2 + 1)
将所有内容放在一起,我们得到该行,将其右剥离,然后打印出来。
line = (a_space + (b_space + "*" * (level * 2 + 1) + b_space)
        * (triangle * 2 + 1)).rstrip()
print(line)
让我们通过一些测试用例来尝试一下。
n = 1*
n = 2    *
   ***
 *  *  *
*********
n = 3            *
           ***
          *****
       *    *    *
      ***  ***  ***
     ***************
  *    *    *    *    *
 ***  ***  ***  ***  ***
*************************
n = 4                        *
                       ***
                      *****
                     *******
                 *      *      *
                ***    ***    ***
               *****  *****  *****
              *********************
          *      *      *      *      *
         ***    ***    ***    ***    ***
        *****  *****  *****  *****  *****
       ***********************************
   *      *      *      *      *      *      *
  ***    ***    ***    ***    ***    ***    ***
 *****  *****  *****  *****  *****  *****  *****
*************************************************
Lyn*_*ynn 18
我认为这个练习试图教给您的内容如下。
让我们看一下你的三角形代码(它没有什么根本性的错误):
size = int(input())
for i in range(size):
    for j in range(i, size):
        print(" ", end = "")
    for j in range(i):
        print("*", end = "")
    for j in range(i + 1):
        print("*", end = "")
    print()
并将其转换为返回行/行列表的函数:
def triangle(size):
    rows = []
    for i in range(size):
        row = []
        for j in range(i + 1, size):
            row.append(" ")
        for j in range(2 * i + 1):    # i + (i+1) = 2*i+1.
            row.append("*")
        for j in range(i + 1, size):  # Let's add spaces at the end, too.
            row.append(" ")           # It'll make sense in a moment!
        rows.append("".join(row))
    return rows
for row in triangle(5):
    print(row)
#     *
#    ***
#   *****
#  *******
# *********
现在我们可以稍微调整它以使用任何矩形字符串列表“构建块”,而不是*:
def triangle(size, block):
    rows = []
    for i in range(size):
        strip = [[] for _ in block]
        for j in range(i + 1, size):
            for s, b in zip(strip, block):
                s.append(" " * len(b))     # Space as wide as the building block
        for j in range(2 * i + 1):
            for s, b in zip(strip, block):
                s.append(b)
        for j in range(i + 1, size):
            for s, b in zip(strip, block):
                s.append(" " * len(b))
        for s in strip:
            rows.append("".join(s))
    return rows
# Make a triangle out of ["abc",
#                         "def"]:
for row in triangle(3, ["abc", "def"]):
    print(row)
#       abc
#       def
#    abcabcabc
#    defdefdef
# abcabcabcabcabc
# defdefdefdefdef
这是有点棘手的代码!尝试print()向此代码添加一些语句以查看其工作原理。zip()并行循环两个列表。实际上,您应该尝试自己从头开始重写这个函数。
回报是非常令人满意的:
fractal = triangle(4, triangle(4, ["*"]))
for row in fractal:
    print(row)
#                         *
#                        ***
#                       *****
#                      *******
#                  *      *      *
#                 ***    ***    ***
#                *****  *****  *****
#               *********************
#           *      *      *      *      *
#          ***    ***    ***    ***    ***
#         *****  *****  *****  *****  *****
#        ***********************************
#    *      *      *      *      *      *      *
#   ***    ***    ***    ***    ***    ***    ***
#  *****  *****  *****  *****  *****  *****  *****
# *************************************************
当然,您现在也可以创建一个“三角形的三角形的三角形”:
for row in triangle(2, triangle(2, triangle(2, ["()"]))):
    print(row)
#                           ()
#                         ()()()
#                     ()    ()    ()
#                   ()()()()()()()()()
#         ()                ()                ()
#       ()()()            ()()()            ()()()
#   ()    ()    ()    ()    ()    ()    ()    ()    ()
# ()()()()()()()()()()()()()()()()()()()()()()()()()()()
这里的教训是概括一个问题:从表面上看,很难制作一个三角形的三角形(三角形的三角形)。但用任何东西制作三角形都相对容易。
如果我们编写一些可以用任何东西制作三角形的代码(如我们的abc def示例),我们可以使用该代码用三角形制作三角形。
与其他答案不同,我们不需要为这里发挥作用的两层“三角形”使用单独的逻辑。