Python:可以交换数学运算符以避免代码重复吗?

我有这个功能(见下文),看起来像重复了四遍。四个代码段非常相似,只是在某些数学运算符上有所不同。是否可以使此代码更短?我找不到方法,但是我希望能够调用一个在代码片段中交换“-”,“ +”和“ ”符号的函数(该函数),以便不必重复它们吗?

CODE

def diag_grannar(storlek,troll_position): #funktion som kollar efter diagonala grannar
    ny_rad = troll_position[0]
    ny_kol = troll_position[1]
    diag_grannar = []

    # while-loopen letar efter diagonala grannar snett vänster ovanifrån troll_position
    while True:
        ny_rad -= 1
        ny_kol -= 1
        if ny_rad >= 1 and ny_kol >= 1:
            diag_grannar.append([ny_rad,ny_kol])
        else:
            ny_rad = troll_position[0]
            ny_kol = troll_position[1]
            break

    # while-loopen letar efter diagonala grannar snett vänster nedanifrån troll_position
    while True:
        ny_rad += 1
        ny_kol -= 1
        if ny_rad <= storlek and ny_kol >= 1:
            diag_grannar.append([ny_rad,ny_kol])
        else:
            ny_rad = troll_position[0]
            ny_kol = troll_position[1]
            break

    # while-loopen letar efter diagonala grannar snett höger nedanifrån troll_position
    while True:
        ny_rad += 1
        ny_kol += 1
        if ny_rad <= storlek and ny_kol <= storlek:
            diag_grannar.append([ny_rad,ny_kol])
        else:
            ny_rad = troll_position[0]
            ny_kol = troll_position[1]
            break

    # while-loopen letar efter diagonala grannar snett höger ovanifrån troll_position
    while True:
        ny_rad -= 1
        ny_kol += 1
        if ny_rad >= 1 and ny_kol <= storlek:
            diag_grannar.append([ny_rad,ny_kol])
        else:
            ny_rad = troll_position[0]
            ny_kol = troll_position[1]
            break

    return diag_grannar

请清楚一点,我指的是以下代码段:

while True:
    ny_rad -= 1
    ny_kol += 1
    if ny_rad >= 1 and ny_kol <= storlek:
        diag_grannar.append([ny_rad,ny_kol])
    else:
        ny_rad = troll_position[0]
        ny_kol = troll_position[1]
        break

最诚挚的问候;

lvxh88 回答:Python:可以交换数学运算符以避免代码重复吗?

让我们首先完全摆脱循环:

def diag_grannar(storlek,troll_position):
    ny_rad = troll_position[0]
    ny_kol = troll_position[1]
    diag_grannar = []

    diag_grannar.extend([x,y] for x,y in zip(range(ny_rad-1,-1),range(ny_kol-1,-1)))
    diag_grannar.extend([x,y in zip(range(ny_rad+1,storlek+1),range(ny_kol+1,storlek+1)))
    diag_grannar.extend([x,storlek+1)))

    return diag_grannar

现在我们可以根据需要反转范围。 range(x-1,-1)reversed(range(1,x))相同。

def diag_grannar(storlek,troll_position):
    ny_rad = troll_position[0]
    ny_kol = troll_position[1]
    diag_grannar = []

    xs = range(1,ny_rad + 1)
    ys = range(1,ny_kol + 1)

    diag_grannar.extend(list(t) for t in zip(reversed(xs),reversed(ys))
    diag_grannar.extend(list(t) for t in zip(xs,ys))
    diag_grannar.extend(list(t) for t in zip(reversed(xs),ys))
    return diag_grannar
,

如果将重复的代码放入函数中,则可以将内置operator模块的函数作为参数传入,并使用它们。

,

我们可以遍历同一事物的各种参数化...要注意的是,与其交换数学运算符,我们总是可以使用加法,而只需加上1或-1(比交换匹配运算符更容易)

def diag_grannar1(storlek,troll_position): #funktion som kollar efter diagonala grannar
    ny_rad = troll_position[0]
    ny_kol = troll_position[1]
    diag_grannar = []
    def diag_compare(v1,leq):
        if leq:
            return v1 <= storlek
        else:
            return v1 >= 1
    params = [((-1,-1,False,False)),((1,True,1,True)),((-1,True))]

    for v1,v2,leq1,leq2 in params:
        while True:
            ny_rad += v1
            ny_kol += v2
            if diag_compare(ny_rad,leq1) and diag_compare(ny_kol,leq2):
                diag_grannar.append([ny_rad,ny_kol])
            else:
                ny_rad = troll_position[0]
                ny_kol = troll_position[1]
                break

    return diag_grannar
本文链接:https://www.f2er.com/2823302.html

大家都在问