Функции exec() и eval() в Python

Чем отличаются функции Python exec() и eval()?

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *