內建函式 ( eval 和 exec )
本篇教學會介紹 Python 兩個特別的內建函式: 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
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~