Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python3.6-我需要一些想法来优化这段代码并使其更干净_Python 3.x_Optimization - Fatal编程技术网

Python 3.x Python3.6-我需要一些想法来优化这段代码并使其更干净

Python 3.x Python3.6-我需要一些想法来优化这段代码并使其更干净,python-3.x,optimization,Python 3.x,Optimization,这就是我现在拥有的。简单地说,它的目的是作为一个更大的程序的一部分,将psuedocode转换成一个游戏板 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 th

这就是我现在拥有的。简单地说,它的目的是作为一个更大的程序的一部分,将psuedocode转换成一个游戏板

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尚未声明


我已经考虑了一段时间,但什么也没想到。我只是需要一些想法,谢谢

这里的关键是删除重复项

  • 您复制了
    第一层\u代码[tilesMade][0:3]
    。你可以在这里做一个局部变量

  • 由于您总是希望对范围(2)中的i执行
    ,因此可以将其重构到一个级别,并在循环体中执行
    if
    s

  • 接下来重复的是[0,(1/3)、(2/3)]中j的
    :。。。矩形(点(xCoordinate+j,yCoordinate+…
    东西)。这些行中唯一真正改变的是第一个列表项(0表示“BLC”,1表示“BRC”,等等)和从坐标中添加/减去的东西。而不是在(…
    矩形(点…)中重复j的
    对于每个块,只需修改随后使用的局部变量即可

    def unrelated():
    字母=第一层代码[TileSmarte][0:3]=“BLC”
    偏移量=[]
    如果字母==“BLC”
    偏移量=[0,1/3,2/3,0,0,1/3,-1,…]
    elif letters=“BRC”
    偏移量=[1,2/3,1/3,1,…]
    对于范围(2)中的i:
    对于[offset[0],offset[1],offset[2]]中的j:
    矩形(点(x+偏移[3])…绘制()
    
    其中,
    偏移量
    是您在
    数学和
    for j
    循环中添加/乘以的数字

    您可以利用
    1-j
    =
    1+(-1)*j
    1+j
    =
    1+(1)*j
    基本上总是进行加法,只需使用1或-1作为“j乘数”

    但是,这很快就会变得难以跟踪,因此您可能希望使用命名项字典来保持偏移量值清晰

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

    offsets = {'BLC': { 'topleft': 1, ... }, 'BRC': }
    
    这将使您避免使用
    ifs
    ,而只需执行字典查找。使用此方法,您的方法大约需要3行代码加上表示“控制”数据所需的任何内容(
    偏移量


  • 希望我给您留下了很多思考的余地,希望这是有帮助的和明确的。

    这确实是一个很好的回应。非常感谢您,我现在正在努力实现这一点。