Обе функции имеют общую цель: выполнить код 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”.