Я вырос на C++. В настоящее время я в основном работаю с Python. Несколько дней назад мне пришлось отлаживать свой код, и проблема заключалась в том, что у меня все еще было мышление C++; и я думаю, что он у меня всегда будет.

Как всем известно, грубо говоря: C++ код всегда должен проходить через компилятор, поэтому компилятор выдает бинарный исполняемый код. Python код интерпретируется Python shell, который транслирует код в OS команды.

Поскольку код C++ в первую очередь проверяется компилятором, компилятор выполняет несколько оптимизаций кода (особенно пытаясь предсказать, какой будет следующая операция). Вот почему обычно скомпилированный код работает быстрее интерпретируемого. Если внешних входных данных нет, компилятор имеет полное представление о коде и его области действия.

Мой код Python был похож на:

Вывод этого кода:

Я не ожидал, что произойдет последний звонок foo. Я думал, что, поскольку все условия в цикле while должны быть истинными, чтобы продолжать работать внутренний код цикла, Python перестанет оценивать условия в цикле, как только одно из них станет False.

Другими словами, когда i == 3, i < 3 == False. Нет необходимости проверять foo(i), потому что False & True == False и False & False == False.

Именно это произойдет, если вы закодируете что-то подобное в C++:

Результат:

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

Первоначально опубликовано на http://github.com.