Я просматривал статью на веб-сайте Питера Норвига, где он пытается ответить на следующий вопрос (кстати, это не мой вопрос): «Могу ли я сделать эквивалент (тест? Результат: альтернатива) в 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 * факт (n-1), что то есть измените его на невызываемое выражение. При его запуске интерпретатор входит в бесконечный цикл. У меня есть довольно хорошее представление о том, почему это происходит, то есть функция if_ возвращает то же самое выражение, которое она получает. Но каков тип этого выражения? Что именно здесь происходит? Я не ищу подробного объяснения, а просто некоторые указатели на модель оценки Python, которые могут помочь моему пониманию.
Спасибо!
result if test else alternative
. - person kennytm   schedule 26.04.2010