LINUX.ORG.RU

История изменений

Исправление vvn_black, (текущая версия) :

Во, вариант, даже должен работать, сам цикл с постусловием, универсальный:

def repeat_until(body, condition, *args, state=None, **kwargs):
    state = body(state or dict())

    if condition(state):
        return repeat_until(body, condition, state=state)

    return state

Решение с его помощью частной задачки - суммировать ввод из консоли, остановиться если введено отрицательное число:

def body(state):
    c = int(input())
    return {
        'current': c,
        'result': state.get('result', 0) + c
    }

res = repeat_until(body, lambda x: x['current'] >= 0)
print(res['result])

Исправление vvn_black, :

Во, вариант, даже должен работать, сам цикл с постусловием, универсальный:

def repeat_until(body, condition, *args, **kwargs):
    state = body(kwargs['state'] or dict())

    if condition(state):
        return repeat_until(body, condition, state=state)

    return state

Решение с его помощью частной задачки - суммировать ввод из консоли, остановиться если введено отрицательное число:

def body(state):
    c = int(input())
    return {
        'current': c,
        'result': state.get('result', 0) + c
    }

res = repeat_until(body, lambda x: x['current'] >= 0, state = None)
print(res['result])

Исходная версия vvn_black, :

Во, вариант, даже должен работать, сам цикл с постусловием, универсальный:

def repeat_until(body, condition, *args, **kwargs):
    state = body(kwargs['state'] or dict())
    if not condition(state):
        return state
    else:
        return repeat_until(body, condition, state=state)

Решение с его помощью частной задачки - суммировать ввод из консоли, остановиться если введено отрицательное число:

def body(state):
    c = int(input())
    return {
        'current': c,
        'result': state.get('result', 0) + c
    }

res = repeat_until(body, lambda x: x['current'] >= 0, state = None)
print(res['result])