最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

  • eval()執(zhí)行字符串類型的代碼,并返回最終結(jié)果。
  • exec()執(zhí)行字符串類型的代碼。
  • compile()將字符串類型的代碼編碼。代碼對(duì)象能夠通過(guò)exec語(yǔ)句來(lái)執(zhí)行或者eval()進(jìn)行求值。

下面來(lái)一一介紹這三個(gè)函數(shù)。

eval()

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

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

參數(shù)

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

例子一:因?yàn)榇颂帥](méi)有指定globals和locals,所以直接執(zhí)行expression部分的內(nèi)容。

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

例子二:globals參數(shù)示例。

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

因?yàn)楝F(xiàn)在指定了globals,所以在expression部分的作用域就是globals指定的字典范圍內(nèi)。所以此時(shí)外面的a=10被屏蔽,取用字典中的值。

例子三:locals參數(shù)示例

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

上面提到了,當(dāng)有g(shù)lobals和locals時(shí)作用的范圍域是在globals和locals中,所以a=1,b=20,c=30不會(huì)被應(yīng)用。a和c的值分別去字典g和字典t中的值,當(dāng)globals和locals中都有參數(shù)b時(shí)取locals中的值。所以a=6,b=100,c=10。

exec()

在Python中,exec()是一個(gè)十分有趣且實(shí)用的內(nèi)置函數(shù),不同于eval()函數(shù)只能執(zhí)行計(jì)算數(shù)學(xué)表達(dá)式的結(jié)果的功能,exec()能夠動(dòng)態(tài)地執(zhí)行復(fù)雜的Python代碼,能夠十分強(qiáng)大。參數(shù)如下:

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

下面來(lái)看一些例子。

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

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

例子二:func為字符串,它是一個(gè)遞歸地計(jì)算整數(shù)階乘的函數(shù)。因?yàn)閑xec()僅支持string和code object參數(shù),所以我們要將該遞歸函數(shù)轉(zhuǎn)化成一個(gè)字符串,當(dāng)然,格式還是要Python代碼的格式來(lái),注意換行和縮進(jìn)。剛才例子的輸出結(jié)果為:

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

例子三:exec()的參數(shù)和上面的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

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

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

請(qǐng)?jiān)俅巫⒁?,這是一個(gè)txt格式的Python代碼。那么,我們?nèi)绾握{(diào)用它呢?答案就是exec()函數(shù),代碼如下:

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

compile()

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

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

參數(shù)如下:

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

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

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

例子:

>>> 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

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

相關(guān)文章

  • Python+OpenCV實(shí)現(xiàn)角度測(cè)量的示例代碼

    Python+OpenCV實(shí)現(xiàn)角度測(cè)量的示例代碼

    本文介紹如何使用python語(yǔ)言實(shí)現(xiàn)角度測(cè)量,程序包括鼠標(biāo)選點(diǎn)、直線斜率計(jì)算、角度計(jì)算三個(gè)子程序和一個(gè)主程序,感興趣的可以了解一下
    2022-03-03
  • Python實(shí)現(xiàn)從訂閱源下載圖片的方法

    Python實(shí)現(xiàn)從訂閱源下載圖片的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)從訂閱源下載圖片的方法,涉及Python采集的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法

    Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法

    這篇文章主要介紹了Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法,Bottle框架在Python開(kāi)發(fā)者中具有很高的人氣,需要的朋友可以參考下
    2015-04-04
  • Pytorch配置GPU環(huán)境方式

    Pytorch配置GPU環(huán)境方式

    這篇文章主要介紹了Pytorch配置GPU環(huán)境方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python3里的super()和__class__使用介紹

    Python3里的super()和__class__使用介紹

    這篇文章主要介紹了Python3里的super()和__class__使用介紹,本文用實(shí)例講解了這兩個(gè)方法之間的關(guān)系,需要的朋友可以參考下
    2015-04-04
  • Numpy ndarray 多維數(shù)組對(duì)象的使用

    Numpy ndarray 多維數(shù)組對(duì)象的使用

    這篇文章主要介紹了Numpy ndarray 多維數(shù)組對(duì)象的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python處理列表的部分元素的實(shí)例詳解

    python處理列表的部分元素的實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python處理列表的部分元素的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-09-09
  • python3翻轉(zhuǎn)字符串里的單詞點(diǎn)的實(shí)現(xiàn)方法

    python3翻轉(zhuǎn)字符串里的單詞點(diǎn)的實(shí)現(xiàn)方法

    這篇文章主要介紹了python3翻轉(zhuǎn)字符串里的單詞點(diǎn)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用Python實(shí)現(xiàn)二分法查找的示例

    使用Python實(shí)現(xiàn)二分法查找的示例

    這篇文章主要介紹了使用Python實(shí)現(xiàn)二分法查找的示例,二分法通常又叫二分查找,一般用于查找一個(gè)有序數(shù)組中的某個(gè)值的位置或者給定的特定值的插入位置,需要的朋友可以參考下
    2023-04-04
  • 使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式

    使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式

    這篇文章主要介紹了使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06

最新評(píng)論

云和县| 济南市| 漳州市| 大英县| 湘阴县| 江华| 聂拉木县| 图片| 司法| 印江| 聂荣县| 扎兰屯市| 乌拉特中旗| 同仁县| 九寨沟县| 高要市| 钟山县| 陕西省| 二手房| 自治县| 宾阳县| 莲花县| 都匀市| 宝山区| 罗定市| 衡南县| 八宿县| 磴口县| 龙南县| 龙泉市| 莆田市| 小金县| 全州县| 洞头县| 晋江市| 兴国县| 富裕县| 临沧市| 大荔县| 怀化市| 内乡县|