python优化if语句

时间:2018-11-07 16:07:53

标签: python optimization

我想优化python中的IF语句林。 我真的不知道这是怎么回事。但是我必须减少代码的大小。

def function(pos):
    dg = 2
    if (board[pos[0] + pat2[0][0]][pos[1] + pat2[0][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat2[1][0]][pos[1] + pat2[1][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat2[2][0]][pos[1] + pat2[2][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat2[3][0]][pos[1] + pat2[3][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat2[4][0]][pos[1] + pat2[4][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat8[0][0]][pos[1] + pat8[0][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat8[1][0]][pos[1] + pat8[1][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat8[2][0]][pos[1] + pat8[2][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat8[3][0]][pos[1] + pat8[3][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat8[4][0]][pos[1] + pat8[4][1]] == 2):
            dg *= 2
    if (board[pos[0] + pat2[0][0]][pos[1] + pat2[0][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat2[1][0]][pos[1] + pat2[1][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat2[2][0]][pos[1] + pat2[2][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat2[3][0]][pos[1] + pat2[3][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat2[4][0]][pos[1] + pat2[4][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat8[0][0]][pos[1] + pat8[0][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat8[1][0]][pos[1] + pat8[1][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat8[2][0]][pos[1] + pat8[2][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat8[3][0]][pos[1] + pat8[3][1]] == 1):
            dg /= 3
    if (board[pos[0] + pat8[4][0]][pos[1] + pat8[4][1]] == 1):
            dg /= 3
    return dg

正如您所看到的,不同的行非常相似,我正在寻找一种除了while方法之外的解决方案。 如果您有任何想法,我会在这里。

谢谢

谢谢

3 个答案:

答案 0 :(得分:1)

第一步是使循环从0到4,以避免对不同的索引进行多次重复ifs

for i in range(0, 5):
    if (board[pos[0] + pat2[i][0]][pos[1] + pat2[i][1]] == 2):
        dg *= 2
    if (board[pos[0] + pat8[i][0]][pos[1] + pat8[i][1]] == 2):
        dg *= 2
    if (board[pos[0] + pat2[i][0]][pos[1] + pat2[i][1]] == 1):
        dg /= 2
    if (board[pos[0] + pat8[i][0]][pos[1] + pat8[i][1]] == 1):
        dg /= 2

答案 1 :(得分:0)

您可以做的另一件事是为firstSum创建两个函数pat2和为secondSum创建pat8

def firstSum(board, pat2, pos, i):
    return board[pos[0] + pat2[i][0]][pos[1] + pat2[i][1]] 

def secondSum(board, pat8, pos, i):
    return board[pos[0] + pat8[i][0]][pos[1] + pat8[i][1]] 

然后您创建两个函数multiplydivide来相应地修改dg的值:

def multiply(dg):
    return dg * 2

def divide(dg):
    return dg / 2

然后,您创建一个字典,在其中将上述功能绑定来自if条件(在这种情况下为12的值)

action = {"2" : multiply, "1" : divide}

最后,您创建@juvian的答案中提到的循环,如下所示:

for i in range(0,5):
    first = firstSum(board, pat2, pos, i)
    second = secondSum(board, pat8, pos, i)

    dg = action[str(first)](dg)
    dg = action[str(second)](dg)

这样,您就可以避免在代码中包含if条条件。

答案 2 :(得分:0)

假设class MyComponent extends React.Component { myMethod() { const { propOfInterest, } = this.props // do something with propOfInterest } render() { const { propOfInterest, } = this.props return ( <div className={propOfInterest}> </div> ) } } pospat2[i]应该都是成对的,这不只是简化为:

pat8[i]