1. 程式人生 > >內建函式— — eval、exec、compile

內建函式— — eval、exec、compile

字串型別程式碼: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()