Обе функции имеют общую цель: выполнить код Python, переданный в виде строкового ввода или объекта кода. Несмотря на то, что цель у них одна и та же, exec() и eval() не равнозначны.
Возвращаемые значения
Функция exec() не возвращает никакого значения, в то время как функция eval() возвращает значение, вычисленное из выражения.
expression = "3 + 5" result_eval = eval(expression) print(result_eval) result_exec = exec(expression) print(result_exec) # Вывод: # 8 # None
При выполнении этого кода мы получим 8 и None. Это означает, что eval(expression) вычислила результат и сохранила его в result_eval, а exec(expression) ничего не вернула, поэтому в result_exec сохраняется значение None.
Выполнение
Функция exec() способна выполнять код, занимающий больше одной строки и содержащий несколько предложений, причем неважно, простой он или сложный, содержит ли он циклы и условия, классы и функции.
А функция eval() ограничена выполнением однострочного кода, который может быть простым или сложным выражением.
expression = """
for x in range(5):
print(x, end=" ")
"""
exec(expression)
eval(expression)
Посмотрите на этот пример. У нас есть многострочный код, который печатает числа до заданного диапазона. Функция exec(expression) выполнит его и выведет результат, а eval(expression) выдаст ошибку.
0 1 2 3 4 SyntaxError: invalid syntax
Однако если мы преобразуем это выражение в одну строку, как показано ниже, eval(expression) не выдаст никакой ошибки.
expression = "[print(x, end=' ') for x in range(5)]" eval(expression) -------------------- 0 1 2 3 4
Резюме
| eval() | exec() |
|---|---|
| Возвращает значение. | Не возвращает никакого значения. |
| Выполняет одно выражение, простое или сложное. | Может выполнять многострочный код со многими предложениями, содержащий циклы, условия, функции и классы. |
Используйте eval(), когда нужно вычислить одно выражение и использовать результат. | Используйте exec(), когда нужно выполнить сложный код, состоящий из нескольких блоков. |
Перевод статьи “Difference between exec() and eval() with Examples”.

