什么是解决此练习的更好方法?

时间:2013-05-14 04:22:08

标签: python-3.x

我是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()

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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