亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中字符串類型代碼的執(zhí)行函數——eval()、exec()和compile()詳解

 更新時間:2023年02月07日 10:42:24   作者:程序猿-張益達  
這篇文章主要介紹了Python中字符串類型代碼的執(zhí)行函數——eval()、exec()和compile(),字符串類型代碼的執(zhí)行函數有三個,都是Python的內置函數,下面逐一對這三個函數詳細講解,需要的朋友可以參考下

字符串類型代碼的執(zhí)行

字符串類型代碼的執(zhí)行函數有三個,都是Python的內置函數。

  • eval()執(zhí)行字符串類型的代碼,并返回最終結果。
  • exec()執(zhí)行字符串類型的代碼。
  • compile()將字符串類型的代碼編碼。代碼對象能夠通過exec語句來執(zhí)行或者eval()進行求值。

下面來一一介紹這三個函數。

eval()

執(zhí)行一個字符串表達式,并返回表達式的值

eval(expression[, globals[, locals]])

參數

  • expression:Python 表達式。
  • globals:必須是一個字典對象,否則程序會出錯。當定義了globals參數之后eval函數的作用域會被限定在globals中。
  • locals:該參數掌控局部的命名空間,功能和globals類型,不過當參數沖突時,會執(zhí)行l(wèi)ocals處的參數。

例子一:因為此處沒有指定globals和locals,所以直接執(zhí)行expression部分的內容。

>>> a = 10
>>> eval("a ** 3")
1000

例子二:globals參數示例。

>>> a = 10
>>> g = {'a': 5}
>>> eval("a + 1", g)
6

因為現在指定了globals,所以在expression部分的作用域就是globals指定的字典范圍內。所以此時外面的a=10被屏蔽,取用字典中的值。

例子三:locals參數示例

>>> a = 10
>>> b = 15
>>> c = 20
>>> g = {"a": 6, "b": 8}
>>> t = {"b": 1000, "c": 10}
>>> eval("a + b + c", g, t)
1016

上面提到了,當有globals和locals時作用的范圍域是在globals和locals中,所以a=1,b=20,c=30不會被應用。a和c的值分別去字典g和字典t中的值,當globals和locals中都有參數b時取locals中的值。所以a=6,b=100,c=10。

exec()

在Python中,exec()是一個十分有趣且實用的內置函數,不同于eval()函數只能執(zhí)行計算數學表達式的結果的功能,exec()能夠動態(tài)地執(zhí)行復雜的Python代碼,能夠十分強大。參數如下:

  • object:必選參數,必須是字符串或 code 對象。如果 object 是一個字符串,該字符串會先被解析為一組 Python 語句,然后在執(zhí)行(除非發(fā)生語法錯誤)。如果 object 是一個 code 對象,那么它只是被簡單的執(zhí)行。
  • globals:可選參數,表示全局命名空間(存放全局變量)必須是一個字典對象。
  • locals:可選參數,表示當前局部命名空間(存放局部變量)可以是任何映射對象。如果該參數被忽略,那么它將會取與 globals 相同的值。

下面來看一些例子。

例子一:執(zhí)行簡單的代碼

>>> a = 12
>>> b = 30
>>> exec("ans = a * b")
>>> ans
360

例子二:func為字符串,它是一個遞歸地計算整數階乘的函數。因為exec()僅支持string和code object參數,所以我們要將該遞歸函數轉化成一個字符串,當然,格式還是要Python代碼的格式來,注意換行和縮進。剛才例子的輸出結果為:

>>> func = "def fact(n):\n\treturn 1 if n == 1 else n * fact(n - 1)
>>> exec(func)
>>> a = fact(5)
>>> a
120

例子三:exec()的參數和上面的eval()一模一樣。

>>> x = 15
>>> expr = "z = 30\nsum = x + y + z\nprint(sum)"
>>> y = 20
>>> exec(expr)
65
>>> exec(expr, {'x': 1, 'y': 2})
33
>>> exec(expr, {'x': 1, 'y': 2}, {'y': 100, 'z': 4})
131

例子四:說到這里,可能有些疑問了?事實上,這些代碼不是直接能夠在Python中執(zhí)行嗎,為何還要多此一舉?在實際項目中,我們有些時候會將Python代碼寫入一些文件中,舉個例子,如以下的eg.txt,它儲存了我們想要的Python代碼,如下:

def fact(n):
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)
        
t = fact(6)
print(t)

請再次注意,這是一個txt格式的Python代碼。那么,我們如何調用它呢?答案就是exec()函數,代碼如下:

with open('E://eg.txt', 'r') as f:
    s = f.read()
 
exec(s)

compile()

compile()函數將一個字符串編譯為字節(jié)代碼或 AST 對象。代碼對象可以被 exec()或 eval() 執(zhí)行。以下是compile()方法的語法:

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

參數如下:

  • source :可以是常規(guī)的字符串、字節(jié)字符串,或者 AST 對象
  • filename:代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值。
  • mode:指定編譯代碼的種類??梢灾付?exec, eval, single。
  • 如果是exec類型,表示這是一個序列語句,可以進行運行;
  • 如果是eval類型,表示這是一個單一的表達式語句,可以用來計算相應的值出來;編譯代碼時,如果語法出錯會返回SyntaxError;如果代碼包含一些空字節(jié),則返回類型錯誤TypeError。
  • 如果是single類型,表示這是一個單一語句,采用交互模式執(zhí)行,在這種情況下,如果是一個表達式,一般會輸出結果,而不是打印為None輸出。
  • flags:變量作用域,局部命名空間,如果被提供,可以是任何映射對象。
  • flags和dont_inherit是用來控制編譯源碼時的標志。

編譯代碼時,如果語法出錯會返回SyntaxError;如果代碼包含一些空字節(jié),則返回類型錯誤TypeError。

注意事項:當采用single或eval類型編譯時,如果有多行代碼,每行代碼后面至少有一個換行符,否則在code模塊編譯時就會提示編譯的源碼不完整錯誤。在Python 3.2版本之后,允許輸入Windows或Mac的換行符;當采用exec模式時,不需要在每個行后面輸入換行符;在這個版本之后增加了優(yōu)化參數。

例子:

>>> str = "for i in range(0,10): print(i)"
>>> c = compile(str, '', 'exec')
>>> exec(c)  # eval 也可以
0
1
2
3
4
5
6
7
8
9
>>> str = "3 * 4 + 5"
>>> a = compile(str, '', 'eval')
>>> eval(a)
17

到此這篇關于Python中字符串類型代碼的執(zhí)行函數——eval()、exec()和compile()的文章就介紹到這了,更多相關Python中字符串類型代碼的執(zhí)行函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解python 爬取12306驗證碼

    詳解python 爬取12306驗證碼

    這篇文章主要介紹了python爬取12306驗證碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 淺談pycharm出現卡頓的解決方法

    淺談pycharm出現卡頓的解決方法

    今天小編就為大家分享一篇淺談pycharm出現卡頓的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python自動化運維和部署項目工具Fabric使用實例

    Python自動化運維和部署項目工具Fabric使用實例

    Fabric是一個Python庫,只要目標機器支持ssh訪問,就可以借助fabric來進行遠程操作(如在host1上對host2遠程運行shell命令),顯然,由于fabric是個Python package,故其它Python package都可以被import到fabric特有的fabfile.py腳本中
    2016-09-09
  • python新手練習實例之萬年歷

    python新手練習實例之萬年歷

    最近進行python基礎培訓,課下作業(yè)制作萬年歷,之前沒做過,感覺里面還是有很多需要學的,下面這篇文章主要給大家介紹了關于python新手練習實例之萬年歷的相關資料,需要的朋友可以參考下
    2022-05-05
  • python中mpi4py的所有基礎使用案例詳解

    python中mpi4py的所有基礎使用案例詳解

    這篇文章主要介紹了python中mpi4py的所有基礎使用,本文通過10個案例給大家詳細講解,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • python實現從字符串中找出字符1的位置以及個數的方法

    python實現從字符串中找出字符1的位置以及個數的方法

    這篇文章主要介紹了python實現從字符串中找出字符1的位置以及個數的方法,對于Python字符串操作的學習有一定的幫助與借鑒作用,需要的朋友可以參考下
    2014-08-08
  • K-means聚類算法介紹與利用python實現的代碼示例

    K-means聚類算法介紹與利用python實現的代碼示例

    K-means聚類算法(事先數據并沒有類別之分!所有的數據都是一樣的)是我們大家應該都聽過的一種算法,下面這篇文章主要給大家介紹了關于K-means聚類算法的基礎知識與利用python如何實現該算法的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Python如何調用JS文件中的函數

    Python如何調用JS文件中的函數

    這篇文章主要介紹了Python如何調用JS文件中的函數的相關知識點總結,有興趣的朋友們跟著學習下。
    2019-08-08
  • python:列表詳解

    python:列表詳解

    這篇文章主要介紹了Python中列表(List)的詳解操作方法,包含創(chuàng)建、訪問、更新、刪除、其它操作等,需要的朋友可以參考下
    2021-10-10
  • Python的Django框架中設置日期和字段可選的方法

    Python的Django框架中設置日期和字段可選的方法

    這篇文章主要介紹了Python的Django框架中設置日期和字段可選的方法,是Django設置當中的基本操作,需要的朋友可以參考下
    2015-07-07

最新評論