1. 程式人生 > >python eval()內建函式

python eval()內建函式

python有一個內建函式eval(),可以將字串進行執行。

通過help(eval)檢視幫助文件

Help on built-in function eval in module builtins:

eval(source, globals=None, locals=None, /)
    Evaluate the given source in the context of globals and locals.
    
    The source may be a string representing a Python expression
    or a code object as returned by compile().
    The globals must be a dictionary 
and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it.

eval(source,globals=None,locals= None)

eval()函式預設是沒有globals,locals,

如果提供則globals屬性必須是一個字典dict型別,而locals 可以是任意對映

一般使用input函式,是str型別,如果進行數值運算,需要進行型別轉化

a = input("Enter a number:\n")

從鍵盤輸入一個數值

a = 2

type(a)

為str型別

而 使用eval()內建函式

 a = eval(input("enter a number:\n"))

type(a)
<class 'int'>

則為int。

eval()函式可以將字串str當成有效的表示式來求值並返回計算結果

昨天學習碰見一個題目,給做錯了,現在記錄一下。

number = eval('5'+'1*2')  # 7是錯誤,正確答案是102

想當然的選擇了答案是7,這個是錯誤的。

正確答案是:102.

因為這個eval()函式內有兩個字串"5"和"1*2",所以括號內首先做字串連線,變成一個新的字串"51*2",eval去掉雙引號後,才能進行算數運算,得到數字102

再舉個例子

number2 = eval('1'+'2*3'+'4*5')
# number2的值
print(number2)
2040

先拼接字串,"12 *34*5"然後再去掉雙引號進行算數運算,得到12*34*5=2040

 

eval()有一個壞處就是不太安全,如果使用者輸入一些字串是惡意程式碼,則對系統不好,則需要使用

使用ast.literal_eval,

這個目前還沒有用到,後續研究後進行總結。