內建函式— — eval、exec、compile
阿新 • • 發佈:2018-12-12
字串型別程式碼:eval、exec、compile
eval() 執⾏字元串型別的程式碼,並返回最終結果
print(eval("2+2")) # 4 n=8 print(eval("2+n")) # 10 def func(): print(666) eval("func()") # 666 # 簡易計算器 code = input("請輸入你要執行的程式碼:") ret = eval(code) print(ret) >>>請輸入你要執行的程式碼:1+2 + 3 >>>6 #把字串型別的程式碼還原回字典, 列表, 元組 s = "{'name':'alex', 'age':18, 'isMan':False}" # 字串 ret = eval(s) # 側重的有返回值 print(ret) # {'name': 'alex', 'age': 18, 'isMan': False} print(type(ret)) # <class 'dict'>
exec() 執⾏字元串型別的程式碼,返回值永遠為 None. (execute執行的縮寫)
#相比於 eval,exec可以執行更復雜的 Python 程式碼,但是也不能太長,不能太亂(那種要使用compile) # 流程控制語句 exec(""" for i in range(10): print(i) """) # 自定義函式 exec(""" def func(): print("我是周杰倫") func() """) print(exec("1+2+3+4")) # None 沒有返回值. 想要返回值用eval exec("print('hello,world')") # hello,world code = input("請輸入你要執行的程式碼") a = exec(code) # 沒有返回值. 想要返回值用eval print(a) >>>請輸入你要執行的程式碼1+2 + 3 >>>None code = input("請輸入你要執行的程式碼") exec(code) # 沒有返回值. 想要返回值用eval print(a) # pycharm報錯不一定準 # 這裡的程式碼a在pycharm中是出紅線了,因為它不知道這裡的a是什麼,上面的程式碼沒有定義過.但是程式碼執行
之後在控制檯輸出了正確的結果並沒有報錯,因為你在input函式執行時候的控制檯中輸入了a = 'alex'(反正就是以程式碼(字串)的形式建立並賦值了變數a) >>>請輸入你要執行的程式碼a = 'alex' >>>alex
compile 將字串型別的程式碼編譯成位元組程式碼物件。程式碼物件能夠通過exec語句來執行或者eval()進行求值。
語法:
compile(source, filename, mode[, flags[, dont_inherit]])
引數說明:
1. 引數source:要執⾏的程式碼, 動態程式碼⽚段
2. 引數 filename :檔名, 程式碼存放的檔名, 當傳入了第一個引數的時候, 這個引數給空字串就可以了 。 程式碼要麼直接以字串程式碼的形式給出,要麼存 放 在檔案中給出,所以這兩個引數必須有一個為空字串. 3. 引數model:模式,指定編譯程式碼的種類,可以指定為 ‘exec’,’eval’,’single’。 exec: 當source中包含流程語句時,model應指定為‘exec’; eval: 當source中只包含一個簡單的求值表示式,model應指定為‘eval’; single: 當source中包含了互動式命令語句,model應指定為'single'。
#流程語句使用exec code1 = "for i in range(10): print(i)" #程式碼 c1 = compile(code1, "", mode="exec") # 預載入程式碼 exec(c1) # 執行程式碼 # 字串程式碼內部存在print就不需要再print了 >>> 0 1 2 3 4 5 6 7 8 9 #簡單求值表示式用eval code2 = "1+2+3" c2 = compile(code2, "", mode="eval") a = eval(c2) print(a) >>> 6 #互動語句(比如input)用single code3 = "name = input('請輸⼊入你的名字:')" c3 = compile(code3, "", mode="single") exec(c3) print(name) # 字串程式碼內部不存在print就需要再print >>> print(name)#執行前name變數不存在,直譯器紅線報錯 Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> name NameError: name 'name' is not defined >>> #執行時顯示互動命令,提示輸入 請輸⼊入你的名字:Mary >>> print(name) #執行後name變數有值,輸出 Mary
小結:
有返回值的字串形式的程式碼⽤eval().
沒有返回值的字串形式的程式碼用exec().
一般很少⽤到compile()