日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python中的eval(),exec()以及其相关函数

發布時間:2025/3/20 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的eval(),exec()以及其相关函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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()函數的返回值;

實例:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' x = 10def func():y = 20a = 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()函數??梢岳斫鉃镻ython 3把exec這個statement和execfile()函數的功能夠整合到一個新的exec()函數中去了:

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

  • eval()函數只能計算單個表達式的值,而exec()函數可以動態運行代碼段。
  • eval()函數可以有返回值,而exec()函數返回值永遠為None。

實例1:

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

x = 10def func():y = 20a = 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:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' x = 10 expr = """ z = 30 sum = x + y + z print(sum) """ def func():y = 20exec(expr)exec(expr, {'x': 1, 'y': 2})exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})func()

輸出結果:

60 33 34

對輸出結果的解釋:

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

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

3. globals()與locals()函數

函數定義及功能說明:

先來看下這兩個函數的定義和文檔描述

globals()

描述: Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).

翻譯: 返回一個表示當前全局標識符表的字典。這永遠是當前模塊的字典(在一個函數或方法內部,這是指定義該函數或方法的模塊,而不是調用該函數或方法的模塊)

locals()

描述: Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

翻譯: 更新并返回一個表示當前局部標識符表的字典。自由變量在函數內部被調用時,會被locals()函數返回;自由變量在類累不被調用時,不會被locals()函數返回。

注意: locals()返回的字典的內容不應該被改變;如果一定要改變,不應該影響被解釋器使用的局部變量和自由變量。

總結:

  • globals()函數以字典的形式返回的定義該函數的模塊內的全局作用域下的所有標識符(變量、常量等)
  • locals()函數以字典的形式返回當前函數內的局域作用域下的所有標識符
  • 如果直接在模塊中調用globals()和locals()函數,它們的返回值是相同的

實例1:

name = 'Tom' age = 18def func(x, y):sum = x + y_G = globals()_L = locals()print(id(_G), type(_G), _G)print(id(_L), type(_L), _L)func(10, 20)

輸出結果:

2131520814344 <class 'dict'> {'__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x000001F048C5E048>, '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001F048BF4C50>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None} 2131524302408 <class 'dict'> {'y': 20, 'x': 10, '_G': {'__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x000001F048C5E048>, '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001F048BF4C50>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}, 'sum': 30}

實例2:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' name = 'Tom' age = 18G = globals() L = locals() print(id(G), type(G), G) print(id(L), type(L), L)

輸出結果:

2494347312392 <class 'dict'> {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000244C2E44C50>, 'name': 'Tom', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18} 2494347312392 <class 'dict'> {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000244C2E44C50>, 'name': 'Tom', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}

上面打印出的G和L的內存地址是一樣的,說明在模塊級別locals()的返回值和globals()的返回值是相同的。

4. compile函數

函數的作用:

將source編譯為code對象或AST對象。code對象能夠通過exec()函數來執行或者通過eval()函數進行計算求值。

函數定義:

compile(source, filename, mode[, flags[, dont_inherit]])

參數說明:

  • source:字符串或AST(Abstract Syntax Trees)對象,表示需要進行編譯的Python代碼
  • filename:指定需要編譯的代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值(通常是用<string>)
  • mode:用于標識必須當做那類代碼來編譯;如果source是由一個代碼語句序列組成,則指定mode=‘exec’;如果source是由單個表達式組成,則指定mode=‘eval’;如果source是由一個單獨的交互式語句組成,則指定mode=‘single’。
  • 另外兩個可選參數暫不做介紹

實例:

s = """ for x in range(10):print(x, end='') print() """ code_exec = compile(s, '<string>', 'exec') code_eval = compile('10 + 20', '<string>', 'eval') code_single = compile('name = input("Input Your Name: ")', '<string>', 'single')a = exec(code_exec) b = eval(code_eval)c = exec(code_single) d = eval(code_single)print('a: ', a) print('b: ', b) print('c: ', c) print('name: ', name) print('d: ', d) print('name; ', name)

輸出結果:

0123456789 Input Your Name: Tom Input Your Name: Jerry a: None b: 30 c: None name: Jerry d: None name; Jerry

5. 這幾個函數的關系

comiple()函數、globals()函數、locals()函數的返回結果可以當作eval()函數與exec()函數的參數使用。

另外,我們可以通過判斷globals()函數的返回值中是否包含某個key來判斷,某個全局變量是否已經存在(被定義)。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Python中的eval(),exec()以及其相关函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性奶老妇 视频 | 一级黄色免费毛片 | 国产三区精品 | 青青青免费在线视频 | 日韩污视频在线观看 | 欧美性生交大片免费看 | 冲田杏梨一区二区三区 | 日韩成人精品一区二区 | 懂色av一区二区三区在线播放 | 亚洲小视频在线播放 | 久久久久三级 | 24小时日本在线www免费的 | 国产搞逼视频 | japanese强行粗暴 | 欧美性jizz18性欧美 | 久久久久久久一区 | 亚洲一二三区视频 | 午夜视频福利 | www.久久久久久久久久 | 拔插拔插华人 | 美女激情网| 国产成人久久77777精品 | 老熟妇午夜毛片一区二区三区 | 亚洲人成电影网站 | 亚洲精品色午夜无码专区日韩 | 黄色片hd| 精品国产999久久久免费 | 成人aⅴ视频 | 亚洲GV成人无码久久精品 | 97视频网站 | 黄色成年网站 | 国产午夜啪啪 | 欧美成人精品激情在线观看 | 亚洲操片| 亚洲国产精品国自产拍av | 日韩永久免费视频 | 天天视频入口 | 午夜伦情 | 五月婷婷一区二区三区 | 亚洲欧美自偷自拍 | 麻豆视频免费版 | 亚洲欧美在线视频观看 | 日日爱影视 | 老妇荒淫牲艳史 | 奇米色婷婷 | 免费看h网站 | 亚洲av成人精品午夜一区二区 | 成人午夜视频免费在线观看 | 我要看一级片 | 久久99免费视频 | 日本一级大毛片a一 | 在线观看成年人网站 | 亚洲精品少妇久久久久久 | jizz性欧美23 | 亚洲精品粉嫩小泬20p | 久久午夜国产精品 | 欧美一区二区三区成人片在线 | 男操女视频在线观看 | 91免费网址 | 中文字幕一区二区三区不卡 | 欧美三级 欧美一级 | 熟女熟妇伦久久影院毛片一区二区 | 国产伦精品一区二区三区免.费 | 精品妇女一区二区三区 | 亚洲av综合色区无码二区爱av | 男人的天堂色 | wwwwww在线观看 | 成人黄色片在线观看 | 91精品国产一区二区三竹菊影视 | 国产不雅视频 | 成人123区| 91精品国产成人www | 抽插丰满内射高潮视频 | 青青青在线免费观看 | 色欲久久久天天天精品综合网 | 欧美最猛性xxxx | 成人小视频在线观看 | 亚洲一区二区精品视频 | 99精品在线视频观看 | 日本不卡一区在线 | 任你躁av一区二区三区 | 黄色免费在线视频 | 人人草在线 | 亚洲av无码乱码在线观看性色 | 黄色三级免费网站 | 99re6热在线精品视频播放 | 99干99| 久久艹综合 | 亚洲综合视频在线观看 | 女人天堂网站 | 国产真实乱在线更新 | 6080电视影片在线观看 | 欧美精品啪啪 | 乱精品一区字幕二区 | 欧美大片免费 | 成年人视频免费 | 污视频网站免费看 | 国产精品无码av在线播放 | 日韩福利在线播放 |