Функции 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”.

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

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

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