0

我是 python 和编程的新手,并且得到了这个练习。我可以使用下面的代码获得预期的结果,但想知道使用 Python 3.x 还有什么其他方法可以解决这个问题。

练习是取一个数字并生成以下模式:

用户输入:1

X

用户输入:2

O O O
O X O
O O O

用户输入:3

X X X X X
X O O O X
X O X O X
X O O O X
X X X X X

等等...

这是我所拥有的:

def makePattern():
    num = int(input("Enter a number: "))
    def makeBoxes(num):
        width = (num * 2) - 1
        midpoint = num - 1
        matrix = [ [ "X" for i in range(width) ] for j in range(width) ]
        for d1 in range(width):
            mpD1 = abs(midpoint - d1)
            for d2 in range(width):
                mpD2 = abs(midpoint - d2)
                if (mpD1 % 2 == 1):
                    if mpD2 <= mpD1:
                        matrix[d1][d2] = "O"
                if (mpD2 % 2 == 1):
                    if mpD1 <= mpD2:
                        matrix[d1][d2] = "O"
        printBoxes(matrix,width)
        makePattern()
    def printBoxes(matrix,width):
        holder = ""
        count = 1
        for row in matrix:
            for point in row:
                holder += (point + " ")
                if count % width == 0:
                    print(holder)
                    holder = ""
                count += 1
    makeBoxes(num)
makePattern()
4

1 回答 1

0

您似乎正在尝试打印具有特定图案的电路板。如果没有进一步的描述,很难说更多。

关于您使用 python 的一些具体评论:

  • 总的来说,它感觉很不合时宜。它太冗长了。避免骆驼套。
  • 重复的逻辑太多了。printBoxes 中的宽度似乎是不必要的
  • printBoxes 可能会好很多。研究做什么" ".join(row)。知道这一点,在 python 3 printBoxes 应该是一个简单的单行列表理解。

关于您的算法的一些具体评论:

  • 我可以想到几个比你的算法简单得多的算法,给定一个位置矩阵[i][j],你知道它是否需要是一个'X'或一个'O'也需要一个衬里。

如果你把它们放在一起,这可以生成列表应该是一行 python,打印它应该是另一行。具有讽刺意味的是,这也应该增加代码的可读性。

于 2013-05-14T04:54:41.020 回答