модель оценки параметров функции python - PullRequest
2 голосов
/ 26 апреля 2010

Я просматривал статью на сайте Питера Норвиг, где он пытается ответить на следующий вопрос (кстати, это не мой вопрос) «Могу ли я сделать эквивалент (тест? Результат: альтернатива) в Python?»

вот один из перечисленных им вариантов,

def if_(test, result, alternative=None):
    "If test is true, 'do' result, else alternative. 'Do' means call if callable."
    if test:
        if callable(result): result = result()
        return result
    else:
        if callable(alternative): alternative = alternative()
        return alternative

А вот пример использования.

>>> fact = lambda n: if_(n <= 1, 1, lambda: n * fact(n-1))
>>> fact(6)
720

Я понимаю, как это работает (я думаю), но я просто играл с кодом и решил посмотреть, что произойдет, когда я изменю третий аргумент в определении «факта» выше на n * fact (n-1), то есть измените его на не вызываемое выражение. При запуске интерпретатор входит в бесконечный цикл. У меня есть довольно хорошее представление о том, почему это происходит, то есть функция if_ возвращает обратно то же выражение, которое получает. Но каков тип этого выражения? Что именно здесь происходит? Я не ищу подробного объяснения, но только для некоторых указателей на модель оценки python, которая могла бы помочь моему пониманию.

Спасибо!

1 Ответ

4 голосов
/ 26 апреля 2010

Причина, по которой цикл никогда не завершается при изменении fact на n * fact(n-1), заключается в том, что n * fact(n-1) должен вычислять первым (в качестве третьего аргумента для if). Оценка этого приводит к другому вызову fact, до бесконечности (поскольку больше нет базового случая, чтобы остановить его).

Ранее вы передавали функциональный объект (lambda), который не оценивался бы до тела if, а его результат проверялся бы с помощью test.

Это известно (я полагаю) как энергичная оценка, когда аргументы функции оцениваются до того, как они передаются в функцию. В схеме ленивых вычислений аргументы не будут оцениваться, пока они не будут использованы в теле функции.

...