Python3 エンジニア認定基礎試験 練習問題 Day38:組み込み関数(eval, exec, compile)

【本日のミッション】

Day37では「組み込み関数(getattr, setattr, hasattr, delattr)」を学びました。

今日は eval() / exec() / compile() を使って、Pythonコードを動的に実行する方法を学びましょう。

これらの関数は柔軟ですが、誤用すると危険なため、使い方と注意点をセットで覚えることが大切です。


eval の基本

code = "10 + 20"
result = eval(code)
print(result)

出力結果

30

eval(expression) は、文字列として与えられた式を評価(計算)する関数です。

式(expression)には 単一の式(計算・関数呼び出しなど)を指定します。

x = 5
print(eval("x * 2"))

出力結果

10

eval() は返り値があります(実行結果を返す)。

⚠️ 注意:ユーザー入力を eval() に直接渡すのは危険です。

任意コード実行のリスクがあります。


exec の基本

code = """
for i in range(3):
    print(i)
"""
exec(code)

出力結果

0
1
2

exec(code) は、文字列のPythonコードをそのまま実行します。

eval() と違い、複数行の文(statement)を含むコードでも動作します。

exec()返り値を返さず、コードをそのまま実行します。


compile の基本

code = "x + y"
compiled_code = compile(code, "<string>", "eval")
x, y = 2, 3
print(eval(compiled_code))

出力結果

5

compile(source, filename, mode) は、文字列をコードオブジェクトに変換します。

その後 eval()exec() に渡して実行できます。

mode値 説明
"eval" 式(expression)を評価
"exec" 文(statement)を実行
"single" 対話入力(1行実行)

3つの関数まとめ

関数名 主な用途 戻り値 使いどころ
eval() 式を評価 あり 簡単な計算など
exec() コードを実行 なし 複数行コード実行
compile() コードオブジェクト生成 コードオブジェクト パフォーマンスや安全性管理

練習問題

次のコードを実行するとどうなりますか?

code = "a * b"
compiled = compile(code, "<string>", "eval")
a, b = 3, 4
print(eval(compiled))

選択肢

A)

7

B)

12

C)

a * b

D)

Error

解答

B)

12

■■■スポンサーリンク■■■

解説

  • compile() により "a * b" がコードオブジェクト化

  • eval() により実行 → 3 * 4 = 12

👉 正解は

B)

12

✅ポイント

  • eval() は戻り値がある

  • exec() は戻り値がない(結果は直接出力)

  • compile() で事前に解析して安全に実行できる


豆知識:

Webアプリやテンプレートエンジンでは、compile() + eval() を使い、

事前コンパイル済みの式を効率よく評価する仕組みが使われています。


次回予告

Day39では zip 関数の応用と辞書との組み合わせ を学びます。

リストやタプルから辞書を効率よく作る方法をマスターしましょう!


参考

Python 3 エンジニア認定基礎試験 – Odyssey CBT
Python3 エンジニア認定基礎試験 出題範囲と学習プラン
Python3 エンジニア認定基礎試験 練習問題 Day1:変数の基本
Python3 エンジニア認定基礎試験 練習問題 Day2:変数の型(int型とstr型)
Python3 エンジニア認定基礎試験 練習問題 Day3:算術演算子と代入演算子
Python3 エンジニア認定基礎試験 練習問題 Day4:文字列の操作
Python3 エンジニア認定基礎試験 練習問題 Day5:比較演算子と論理演算子
Python3 エンジニア認定基礎試験 練習問題 Day6:if文(条件分岐)
Python3 エンジニア認定基礎試験 練習問題 Day7:ループ処理(for文・while文)
Python3 エンジニア認定基礎試験 練習問題 Day8:break文とcontinue文
Python3 エンジニア認定基礎試験 練習問題 Day9:リスト(list)の基本
Python3 エンジニア認定基礎試験 練習問題 Day10:リストの操作(append,remove,len など)
Python3 エンジニア認定基礎試験 練習問題 Day11:リストのスライス(部分取り出し)
Python3 エンジニア認定基礎試験 練習問題 Day12:タプル(tuple)の基本
Python3 エンジニア認定基礎試験 練習問題 Day13:辞書(dict)の基本
Python3 エンジニア認定基礎試験 練習問題 Day14:集合(set)の基本
Python3 エンジニア認定基礎試験 練習問題 Day15:関数の定義と呼び出し
Python3 エンジニア認定基礎試験 練習問題 Day16:関数のデフォルト引数とキーワード引数
Python3 エンジニア認定基礎試験 練習問題 Day17:可変長引数(*args, **kwargs)
Python3 エンジニア認定基礎試験 練習問題 Day18:関数のスコープ(ローカル変数とグローバル変数)
Python3 エンジニア認定基礎試験 練習問題 Day19:ネスト関数(関数の中の関数)
Python3 エンジニア認定基礎試験 練習問題 Day20:ラムダ式(無名関数)
Python3 エンジニア認定基礎試験 練習問題 Day21:組み込み関数(len, type, range など)
Python3 エンジニア認定基礎試験 練習問題 Day22:組み込み関数(sum,max,min,sorted)
Python3 エンジニア認定基礎試験 練習問題 Day23:文字列と組み込み関数(len,str,int,float)
Python3 エンジニア認定基礎試験 練習問題 Day24:組み込み関数(abs, round, pow)
Python3 エンジニア認定基礎試験 練習問題 Day25:組み込み関数(sorted の応用と key 引数)
Python3 エンジニア認定基礎試験 練習問題 Day26:組み込み関数(enumerate, zip)
Python3 エンジニア認定基礎試験 練習問題 Day27:組み込み関数(map, filter, reduce)
Python3 エンジニア認定基礎試験 練習問題 Day28:組み込み関数(any, all)
Python3 エンジニア認定基礎試験 練習問題 Day29:組み込み関数(isinstance,issubclass)
Python3 エンジニア認定基礎試験 練習問題 Day30:組み込み関数(callable, eval)
Python3 エンジニア認定基礎試験 練習問題 Day31:組み込み関数(dir, help)
Python3 エンジニア認定基礎試験 練習問題 Day32:組み込み関数(id, hash)
Python3 エンジニア認定基礎試験 練習問題 Day33:組み込み関数(repr, format)
Python3 エンジニア認定基礎試験 練習問題 Day34:組み込み関数(globals, locals)
Python3 エンジニア認定基礎試験 練習問題 Day35:組み込み関数(vars, callable)
Python3 エンジニア認定基礎試験 練習問題 Day36:組み込み関数(reversed, slice)
Python3 エンジニア認定基礎試験 練習問題 Day37:組み込み関数(getattr, setattr, hasattr, delattr)
Python3 エンジニア認定基礎試験 練習問題 Day38:組み込み関数(eval, exec, compile)
Python3 エンジニア認定基礎試験 練習問題 Day39:組み込み関数(zip の応用・辞書との組み合わせ)
Python3 エンジニア認定基礎試験 練習問題 Day40:モジュールの基本(import と from の違い)
Python3 エンジニア認定基礎試験 練習問題 Day41:as(別名インポート)と import の仕組み
Python3 エンジニア認定基礎試験 練習問題 Day42:標準ライブラリ(math モジュールの基本)
Python3 エンジニア認定基礎試験 練習問題 Day43:標準ライブラリ(random モジュールの活用)
Python3 エンジニア認定基礎試験 練習問題 Day44:標準ライブラリ(datetime モジュールの使い方)
Python3 エンジニア認定基礎試験 練習問題 Day45:標準ライブラリ(os と sys)

■■■スポンサーリンク■■■