Как использовать переменные из одной функции в другой в Python? Где единственная разница в функциях - это оператор return - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть две абсолютно одинаковые функции, за исключением операторов return. Как использовать переменные в одной функции, чтобы позволить мне сократить вторую функцию?

heuristic и heuristic2 - исходные функции, и в идеале я бы превратил одну из двух в нечто вроде heuristic3.

Это не полные функции, но достаточно, чтобы понять, что я пытаюсь сделать.

def heuristic(self, state):
    for currentState in argsWith0:
        endX = (currentState - 1) // 3
        endY = (currentState - 1) % 3
        newSquare = state[currentState]
        currentDistanceToDirtyNode = abs(endX - startX) + abs(endY - startY)
        if currentDistanceToDirtyNode < distanceToSquare:
            distanceToSquare = currentDistanceToDirtyNode
    return 2 * (distanceToSquare * numDirtySquares + 1) + sum( \
        (numDirtySquares - x) * 4 + 1 for x in range(0, numDirtySquares + 1))


def heuristic2(self, state):
    for currentState in argsWith0:
        endX = (currentState - 1) // 3
        endY = (currentState - 1) % 3
        newSquare = state[currentState]
        currentDistanceToDirtyNode = abs(endX - startX) + abs(endY - startY)
        if currentDistanceToDirtyNode < distanceToSquare:
            distanceToSquare = currentDistanceToDirtyNode
    return 2 * (distanceToSquare * numDirtySquares + 1) + sum( \
        (numDirtySquares - x) * 4 + 1 for x in range(0, numDirtySquares + 1))


def heuristic3(self, state):
    return heuristic2(state) + 2 * \
           (heuristic2(state).distanceToSquare * heuristic2(state).numDirtySquares + 1)

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Нет, вы не можете напрямую получить доступ к состоянию переменной внутри функции. Если вы хотите получить доступ к переменным, подобным этому

heuristic2(state).distanceToSquare

Тогда вам нужно будет heuristic2 вернуть класс со свойством distanceToSquare

class Heuristic():
    def __init__(self, val, dis, dirt):
        self.value = value
        self.distanceToSquare = dis
        self.numDirtySquares = dirt

и скорректировать возвратоператор для возврата каждого значения как части класса

v = 2 * (distanceToSquare * numDirtySquares + 1) + sum( \
        (numDirtySquares - x) * 4 + 1 for x in range(0, numDirtySquares + 1))
return Heuristic(v, distanceToSquare, numDirtySquares)

def heuristic3(self, state):
    h2 = heuristic2(state)
    return h2.value + 2 * (h2.distanceToSquare * h2.numDirtySquares + 1)
0 голосов
/ 30 сентября 2019

Взгляните на нечто, называемое «глобальными» переменными: https://www.programiz.com/python-programming/global-local-nonlocal-variables

По сути, переменная, определенная вне функции, позволит всем функциям иметь возможность доступа и манипулирования этой переменной, тогда как переменные, определенные внутрифункция является «локальной» и может использоваться только внутри этой конкретной функции.

...