【问题标题】:Python 3.6 - I need IDEAS to optimize this chunk of code and make it cleanerPython 3.6 - 我需要 IDEAS 来优化这段代码并使其更干净
【发布时间】:2017-06-02 07:05:01
【问题描述】:

这是我目前拥有的。简而言之,它的目的是一个更大的程序的一部分,以获取伪代码并将其变成一个游戏板。

FIRST_LAYER_CODE = [] # This is where the psuedocode goes.

def irrelevant_name(tilesMade, xCoordinate, yCoordinate):
    # There is some other stuff in this function, but it is not relevant to the question.
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "BLC":
        for i in range(2):
            for j in [0, (1/3), (2/3)]:
                Rectangle(Point(xCoordinate + j, yCoordinate + j), Point(xCoordinate + j + (1/3) + (i * (1 - (j + (1/3)))), yCoordinate + 1 - (i * ((2/3) - j)))).draw(window)
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "BRC":
        for i in range(2):
            for j in [1, (2/3), (1/3)]:
                Rectangle(Point(xCoordinate + j, yCoordinate + 1 - j), Point(xCoordinate + j - (1/3) - (i * (j - (1/3))), yCoordinate + 1 - (i * (j - (1/3))))).draw(window)
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "TLC":
        for i in range(2):
            for j in [0, (1/3), (2/3)]:
                Rectangle(Point(xCoordinate + j, yCoordinate + 1 - j), Point(xCoordinate + j + (1/3) + (i * (1 - (j + (1/3)))), yCoordinate + (i * ((2/3) - j)))).draw(window)
    elif FIRST_LAYER_CODE[tilesMade][0:3] == "TRC":
        for i in range(2):
            for j in [1, (2/3), (1/3)]:
                Rectangle(Point(xCoordinate + j, yCoordinate + j), Point(xCoordinate + j - (1/3) - (i * (j - (1/3))), yCoordinate + (i * (j - (1/3))))).draw(window)

此代码按预期工作,但我总是看到人们拥有更时尚的代码,更重要的是优化了更好的代码。我可以做些什么来简化这段代码?我不是要你给我任何代码!!!我只是想优化此代码,因为我是编程新手!!! (大写字母并不是一种卑鄙的姿态,但我不希望人们说我只是在要求代码。)

现在我知道我得到的第一个建议是 for 循环似乎是重复的,我应该创建一个具有 for 循环并制作矩形的新函数,但问题是制作新矩形的部分不同对于每个循环,我不能通过诸如 (1 - j) 之类的参数,因为 j 还没有被声明。

我一直在考虑这个问题,但什么也没想到。我只是需要一些想法,当然谢谢!

【问题讨论】:

    标签: python-3.x optimization


    【解决方案1】:

    这里的关键是删除重复项

    1. 您复制了FIRST_LAYER_CODE[tilesMade][0:3]。你可以在这里创建一个局部变量

    2. 由于您总是想要for i in range(2),因此您将其重构到一个级别并在循环体内执行您的ifs。

    3. 下一个被复制的是for j in [0, (1/3), (2/3)]: ... Rectangle(Point(xCoordinate + j, yCoordinate + ... 的东西。这些行中唯一真正改变的是第一个列表项(0 表示“BLC”,1 表示“BRC”等)以及您从坐标中添加/减去的内容。无需为每个块重复 for j in (...Rectangle(Point..) 内容,只需修改之后使用的局部变量即可。

      def irrelevant():
          letters = FIRST_LAYER_CODE[tilesMade][0:3] == "BLC"
          offsets = []
          if letters == "BLC"
              offsets = [0, 1/3, 2/3, 0,0, 1/3, -1, ...]
          elif letters = "BRC"
              offsets = [1, 2/3, 1/3, 1, ...]
          for i in range(2):
              for j in [offsets[0], offsets[1], offsets[2]]:
                  Rectangle(Point(x + offsets[3])...draw()
      

      其中offsets 是您在Point 数学和for j 循环中使用的数字相加/相乘。

      您可以利用 1 - j = 1 + (-1)*j1 + j = 1 + (1)*j 的事实来基本上总是使用 1 或 -1 作为“j 乘数”来进行加法。

      不过,这很快就会变得难以跟踪,因此您可能需要使用命名项字典来保持偏移值清晰。

      offsets = { 'topleft': 1, .... }
      ...
      
    4. 更进一步,您可以定义一个基于 3 个字母的字典作为键并在其中存储偏移值。

      offsets = {'BLC': { 'topleft': 1, ... }, 'BRC': }
      

      这将使您避免使用ifs,而只需进行字典查找。有了这个,您的方法将是大约 3 行加上表示“控制”数据所需的任何内容 (offsets)。

    希望我给您留下了很多思考,希望这对您有所帮助和清晰。

    【讨论】:

    • 这真是一个很好的回应。非常感谢,我正在努力实施。
    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多