1描述
eval()是Python的一個(gè)內(nèi)置函數(shù)辅辩,用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值瘪板。即:將字符串作為有效表達(dá)式進(jìn)行求值并返回計(jì)算結(jié)果
eval()函數(shù)還能實(shí)現(xiàn)將字符串str轉(zhuǎn)化為列表List裙椭、元組tuple、字典ditc的功能奏候,這與str()函數(shù)功能剛好互補(bǔ)(str()函數(shù)能夠?qū)ist\tuple\ditc轉(zhuǎn)化為字符串str)
2語(yǔ)法
eval(expression[, globals[, locals]])
3參數(shù)
- expression -- 表達(dá)式
- globals -- 變量作用域,全局命名空間唇敞,如果被提供蔗草,則必須是一個(gè)字典對(duì)象。
- locals -- 變量作用域厚棵,局部命名空間蕉世,如果被提供,可以是任何映射(map)對(duì)象
3返回值
表達(dá)式的計(jì)算結(jié)果.
4使用
示例代碼:
#1.eval無參實(shí)現(xiàn)字符串轉(zhuǎn)化
s = '1+2+3*5-2'
print(eval(s)) #16
#2.字符串中有變量也可以
x = 1
print(eval('x+2')) #3
#3.字符串轉(zhuǎn)字典
print(eval("{'name':'linux','age':18}"))
#輸出結(jié)果:{'name':'linux','age':18}
#4.eval傳遞全局變量參數(shù),注意字典里的:age中的age沒有帶引號(hào)婆硬,說明它是個(gè)變量狠轻,而不是字符串。
#這里兩個(gè)參數(shù)都是全局的
print(eval("{'name':'linux','age':age}",{"age":1822}))
#輸出結(jié)果:{'name': 'linux', 'age': 1822}
print(eval("{'name':'linux','age':age}",{"age":1822},{"age":1823}))
#輸出結(jié)果:{'name': 'linux', 'age': 1823}
#eval傳遞本地變量彬犯,既有g(shù)lobal和local時(shí)向楼,變量值先從local中查找查吊。
age=18
print(eval("{'name':'linux','age':age}",{"age":1822},locals()))
#輸出結(jié)果:{'name': 'linux', 'age': 18}
print("-----------------")
print(eval("{'name':'linux','age':age}"))
eval()通常還與input()函數(shù)聯(lián)合使用,來將用戶輸入的字符串轉(zhuǎn)化為標(biāo)準(zhǔn)形式湖蜕。
#使用eval直接完成了表達(dá)式的還原與計(jì)算:
s = input("輸入一個(gè)表達(dá)式")
輸入一個(gè)表達(dá)式:1+3+4+4*3
>>> print(eval(s))
20
#使用eval可以直接將用戶輸入的字符串轉(zhuǎn)化為字典
s = input("輸入一個(gè)字典形式的字符串")
輸入一個(gè)字典形式的字符串:{'name':'linux','age':18}
>>> print(eval(s))
#輸出結(jié)果:{'name':'linux','age':18}
4使用風(fēng)險(xiǎn)
eval雖然方便逻卖,但是要注意安全性,昭抒。eval(input())可以將用戶輸入的字符串轉(zhuǎn)成表達(dá)式并執(zhí)行评也,用戶就可以利用此函數(shù)執(zhí)行系統(tǒng)命令,刪除文件等操作灭返。比如用戶惡意輸入就會(huì)獲得當(dāng)前目錄文件
>>>eval("__import__('os').system('dir')")
驅(qū)動(dòng)器 C 中的卷是 OS
卷的序列號(hào)是 B234-8A38
...