execとevalとの違い
execもevalも引数に式を指定することができ、指定した式の処理を実行することができます。ですが、execとevalは大きく次の2点が異なります。
execは文も引数にとれる
execは「文」を引数に指定することもできますが、evalは「文」を指定するとエラーになります。
evalは文を指定するとエラーになる
eval("a = 5*2")
#出力
SyntaxError: invalid syntax
execは文を指定してもエラーにならない
exec("a=5*2")
print(a)
#出力
10
exec自体は存在しない
execの処理には戻り値(return)がないため、exec自体は存在しません。一方、eval自身は存在することができます。
- exec自身は存在する
- eval自身は存在しない(None)
▼存在確認
exec("2+5") is None #True
eval("2+5") is None #False
▼printによる確認
#execでは指定した処理がそのまま返る
exec("print(2*5)")
#出力
10
#exec自身は存在しない
print(exec("2*5"))
#出力
None
eval関数とexec関数でできることやエラー事例の詳細は以下にまとめています。
eval関数
引数に文字列で入力した式を実行する。
実行結果が戻り値として返る。
eval("式")
└ 文だとエラー
└ evaluation(評価)の略
a = eval("5*2")
print(a)
#出力
10
▼print
eval内でprintを実行することも、evalをprintすることも可能。
eval("print(5*2)")
print(eval("5*2"))
#出力
10
10
文字列を代入した変数を引数に使う
l=[]
s=".extend('abc')"
#文字列はクオテーション不要
eval("l"+s)
print(l)
#出力
['a', 'b', 'c']
evalの引数に文字列の変数を入れる場合はクオテーション不要。
式の中で文字列を使う
文字列を使う場合は、全体を囲む記号とは別の記号を使う。
・「” の中:「’ ‘」
・「’ ‘」の中:「” “」
※同じ記号を使うと、文字列の終了と認識されエラーとなる。
a = eval("'aaa'")
b = eval('"bbb"')
print(a)
print(b)
#出力
aaa
bbb
eval(""aaa"")
#出力
SyntaxError: invalid syntax
エラーになるパターン
- 文を入力した場合
- 文字列以外の場合(数値など)
eval("a = 5*2")
#出力
SyntaxError: invalid syntax
eval(5*2)
#出力
TypeError: eval() arg 1 must be a string, bytes or code object
eval(a=5)
#出力
TypeError: eval() takes no keyword arguments
exec関数
引数に入力された文字列の式や文を実行する。
exec('文 or 式')
└ executeの略
└ exec自身の戻り値はない
exec("a=5*2")
print(a)
#出力
10
exec("a = 'hello'")
print(a)
#出力
hello
exec("a=2; b=5; c=a*b")
print(c)
#出力
10
・「;」は改行と同意
l=[1,2,3]
exec("l.extend([4,5,6])")
print(l)
#出力
[1, 2, 3, 4, 5, 6]