精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

Python中eval與exec的區別有哪些

這篇文章主要介紹Python中eval與exec的區別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創新互聯專注于企業網絡營銷推廣、網站重做改版、玉泉街道網站定制設計、自適應品牌網站建設、H5高端網站建設購物商城網站建設、集團公司官網建設、成都外貿網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為玉泉街道等各大城市提供網站開發制作服務。

最近開發中用到了eval()與exec()這兩個函數,不知道在哪種場景下用哪個函數,所以就翻了下Python的文檔。這里就來簡單說一下這兩個函數的區別

1. eval函數

函數的作用:

計算指定表達式的值。也就是說它要執行的Python代碼只能是單個運算表達式(注意eval不支持任意形式的賦值操作),而不能是復雜的代碼邏輯,這一點和lambda表達式比較相似。

函數定義:

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

參數說明:

expression:必選參數,可以是字符串,也可以是一個任意的code對象實例(可以通過compile函數創建)。如果它是一個字符串,它會被當作一個(使用globals和locals參數作為全局和本地命名空間的)Python表達式進行分析和解釋。

globals:可選參數,表示全局命名空間(存放全局變量),如果被提供,則必須是一個字典對象。

locals:可選參數,表示當前局部命名空間(存放局部變量),如果被提供,可以是任何映射對象。如果該參數被忽略,那么它將會取與globals相同的值。

如果globals與locals都被忽略,那么它們將取eval()函數被調用環境下的全局命名空間和局部命名空間。

返回值:

如果expression是一個code對象,且創建該code對象時,compile函數的mode參數是'exec',那么eval()函數的返回值是None;

否則,如果expression是一個輸出語句,如print(),則eval()返回結果為None;

否則,expression表達式的結果就是eval()函數的返回值;

實例:

x = 10
def func():
  y = 20
  a = eval('x + y')
  print('a: ', a)
  b = eval('x + y', {'x': 1, 'y': 2})
  print('b: ', b)
  c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
  print('c: ', c)
  d = eval('print(x, y)')
  print('d: ', d)
func()

輸出結果

a:  30
b:  3
c:  4
10 20
d:  None

對輸出結果的解釋:

對于變量a,eval函數的globals和locals參數都被忽略了,因此變量x和變量y都取得的是eval函數被調用環境下的作用域中的變量值,即:x = 10, y = 20,a = x + y = 30

對于變量b,eval函數只提供了globals參數而忽略了locals參數,因此locals會取globals參數的值,即:x = 1, y = 2,b = x + y = 3

對于變量c,eval函數的globals參數和locals都被提供了,那么eval函數會先從全部作用域globals中找到變量x, 從局部作用域locals中找到變量y,即:x = 1, y = 3, c = x + y = 4

對于變量d,因為print()函數不是一個計算表達式,沒有計算結果,因此返回值為None

2. exec函數

函數的作用:

動態執行Python代碼。也就是說exec可以執行復雜的Python代碼,而不像eval函數那么樣只能計算一個表達式的值。

函數定義:

exec(object[, globals[, locals]])

參數說明:

object:必選參數,表示需要被指定的Python代碼。它必須是字符串或code對象。如果object是一個字符串,該字符串會先被解析為一組Python語句,然后在執行(除非發生語法錯誤)。如果object是一個code對象,那么它只是被簡單的執行。

globals:可選參數,同eval函數

locals:可選參數,同eval函數

返回值:

exec函數的返回值永遠為None.

需要說明的是在Python 2中exec不是函數,而是一個內置語句(statement),但是Python 2中有一個execfile()函數。可以理解為Python 3把exec這個statement和execfile()函數的功能夠整合到一個新的exec()函數中去了。

eval()函數與exec()函數的區別

eval()函數只能計算單個表達式的值,而exec()函數可以動態運行代碼段。

eval()函數可以有返回值,而exec()函數返回值永遠為None。

實例1:

我們把實例1中的eval函數換成exec函數試試:

x = 10
def func():
  y = 20
  a = exec('x + y')
  print('a: ', a)
  b = exec('x + y', {'x': 1, 'y': 2})
  print('b: ', b)
  c = exec('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
  print('c: ', c)
  d = exec('print(x, y)')
  print('d: ', d)
func()

輸出結果

a:  None
b:  None
c:  None
10 20
d:  None

因為我們說過了,exec函數的返回值永遠為None。

實例2

x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
  y = 20
  exec(expr)
  exec(expr, {'x': 1, 'y': 2})
  exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
func()

輸出結果

123    
603334

對輸出結果的解釋:

前兩個輸出跟上面解釋的eval函數執行過程一樣,不做過多解釋。關于最后一個數字34,我們可以看出是:x = 1, y = 3是沒有疑問的。關于z為什么還是30而不是4,這其實也很簡單,我們只需要在理一下代碼執行過程就可以了,其執行過程相當于:

x = 1
y = 2
def func():
  y = 3
  z = 4
  z = 30
  sum = x + y + z
  print(sum)
func()

以上是Python中eval與exec的區別有哪些的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創新互聯行業資訊頻道!


網站名稱:Python中eval與exec的區別有哪些
本文地址:http://m.jcarcd.cn/article/jhhgjo.html
主站蜘蛛池模板: 国产高清天天 | 日本高清动作 | 国产老熟女高 | 国产不卡在线观看 | 日韩欧美国产师 | 91福利吧 | 午夜福利免费院 | 国产性夜夜春夜夜 | 91欧美视频| 日韩欧美理论在线观 | 国产精品九九视频 | 成人影院一区二区 | 国产精品自第 | 日本免费三片在 | 成人dvd碟片| 强奷到高湖喷水91 | 中文字幕精品二区 | 尤物视频官网 | 国产精品亚洲专区 | 日本哺乳期xxxx | 日韩视频在线免费 | 91青青草| 欧美日韩国产第1 | 区三区夜色 | 国产精品三区四区 | 日韩午夜影院 | 绿帽视频网站 | 精品国自产拍视频 | 日本福利 | 日韩网友自拍区 | 午夜秋霞 | 国产性爱专区在线 | 欧美在线观 | 国产日韩欧美一线 | 国产一区自拍视频 | 欧日韩在线不卡视频 | 国产疯狂露脸对白 | 国产午夜三级 | 国产乱老熟视频 | 国产精品合集一三 | 岛国大片网站 |