iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Software Development

跟著 OXXO 一起學 Python系列 第 25

( Day 12.2 ) Python 內建函式 ( eval 和 exec )

  • 分享至 

  • xImage
  •  

本篇教學會介紹 Python 兩個特別的內建函式: eval() 和 exec(),透過這兩個函式,能夠將字串轉換成可以運作的程式碼,近一步搭配其他的程式碼做運用。

原文參考:內建函式 ( eval 和 exec )

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

eval()

eval() 可以放入「一行字串」,並把輸入的字串,轉換成可執行的程式碼後並執行,eval() 不能進行復雜的邏輯運算,例如賦值操作、迴圈...等。eval() 有三個參數:

參數 說明
expression 輸入的字串
globals 輸入字串裡使用的全域變數,使用字典型態,預設 None
locals 輸入字串裡使用的區域變數,使用字典型態,預設 None

下方的例子執行後,效果等同於 print("hello")

eval('print("hello")')    # hello ( 等同 print("hello") )

下方的例子額外設定了 globals 和 locals 參數,會依序覆蓋掉 a、b、c 的內容,globals 和 locals 參數不代表真正的變數,只有在 eval() 運算時才有作用,運算之後就會失效

a, b, c = 1, 2, 3
eval('print(a, b, c)')                            # 1, 2, 3
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6})     # 4, 5, 6
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6}, {'a':7, 'b':8, 'c':9})   # 7, 8, 9
eval('print(a, b, c)')   # 1, 2, 3

此外,使用 eval() 可以回傳計算的結果 ( 有點類似 lambda 匿名函式 ),下方的例子,會以 x 等於 1、y 等於 2 做計算,回傳 x+y 的結果。

a = eval('x+y',{'x':1,'y':2})
print(a)       # 3

雖然 eval() 很方便好用,但相對有使用上的風險,因為 eval() 會將字串轉換成程式碼執行,如果套用在 input,就可以輸入類似「系統指令」的方法,操控系統的檔案,例如下方的程式碼執行後,會執行使用者輸入的程式碼,這時如果輸入了類似「__import__('os').system('rm 123.txt')」的程式碼,就會刪除電腦中某個檔案。

eval(input())

exec()

exec() 可以放入「多行字串」,並把輸入的字串,轉換成可執行的程式碼後並執行,exec() 可以進行較為復雜的邏輯運算,例如賦值操作、迴圈...等。exec() 有三個參數:

參數 說明
object 輸入的字串
globals 輸入字串裡使用的全域變數,使用字典型態,預設 None
locals 輸入字串裡使用的區域變數,使用字典型態,預設 None

下方的例子執行後,效果等同於執行一個 for 迴圈,印出 0~9。

exec('''
for i in range(10):
    print(i)
''')

exec() 無法像 eval() 會回傳結果,如果使用回傳的方式,只會回傳 None。

a = exec('x+y',{'x':1,'y':2})
print(a)     # None

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 12.1 ) Python 例外處理 ( try、except )
下一篇
( Day 13.1 ) Python 類別 class
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言