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

python3中eval函數(shù)用法使用簡(jiǎn)介

 更新時(shí)間:2019年08月02日 09:40:30   作者:陌上行走  
這篇文章主要介紹了python3中eval函數(shù)用法使用簡(jiǎn)介,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

python中eval函數(shù)的用法十分的靈活,這里主要介紹一下它的原理和一些使用的場(chǎng)合。

下面是從python的官方文檔中的解釋:

  The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.

   The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__', the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard builtins module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:

>>> x = 1
>>> eval('x+1')

 This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the mode argument, eval()‘s return value will be None.

   Hints: dynamic execution of statements is supported by the exec() function. The globals() and locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or exec().

   See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals.

下面我做一下簡(jiǎn)單的翻譯,有可能有一些翻譯不好的地方,見(jiàn)諒。

函數(shù)原型:

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

參數(shù):

expression:這個(gè)參數(shù)是一個(gè)字符串,python會(huì)使用globals字典和locals字典作為全局和局部的命名空間,將expression當(dāng)做一個(gè)python表達(dá)式(從技術(shù)上講,是一個(gè)條件列表)進(jìn)行解析和計(jì)算。

globals:這個(gè)參數(shù)管控的是一個(gè)全局的命名空間,也就是我們?cè)谟?jì)算表達(dá)式的時(shí)候可以使用全局的命名空間中的函數(shù),如果這個(gè)參數(shù)被提供了,并且沒(méi)有提供自定義的__builtins__,那么會(huì)將當(dāng)前環(huán)境中的__builtins__拷貝到自己提供的globals里,然后才會(huì)進(jìn)行計(jì)算。關(guān)于__builtins__,它是python的內(nèi)建模塊,也就是python自帶的模塊,不需要我們import就可以使用的,例如我們平時(shí)使用的int、str、abs等都在這個(gè)模塊中。如果globals沒(méi)有被提供,則使用python的全局命名空間。

locals:這個(gè)參數(shù)管控的是一個(gè)局部的命名空間,和globals類似,不過(guò)當(dāng)它和globals中有重復(fù)的部分時(shí),locals里的定義會(huì)覆蓋掉globals中的,也就是當(dāng)globals和locals中有沖突的部分時(shí),locals說(shuō)了算,它有決定權(quán),以它的為準(zhǔn)。如果locals沒(méi)有被 提供的話,則默認(rèn)為globals。

eval函數(shù)也可以被用來(lái)執(zhí)行任意的代碼對(duì)象(如那些由compile()創(chuàng)建的對(duì)象)。在這種情況下,expression參數(shù)是一個(gè)代碼對(duì)象而不是一個(gè)字符串。如果代碼對(duì)象已經(jīng)被‘exec‘編譯為模式參數(shù),eavl()的返回值是None。

下面舉一些例子進(jìn)行講解:

三個(gè)參數(shù)的使用:

1、在前兩個(gè)參數(shù)省略的情況下,eval在當(dāng)前的作用域執(zhí)行:

a=10;
print(eval("a+1"))

執(zhí)行結(jié)果為:11

在這種情況下,后兩個(gè)參數(shù)省略了,所以eval中的a是前面的10。對(duì)于eval,它會(huì)將第一個(gè)expression字符串參數(shù)的引號(hào)去掉,然后對(duì)引號(hào)中的式子進(jìn)行解析和計(jì)算。

2、在globals指定的情況下:

a=10;
g={'a':4}
print(eval("a+1",g))

執(zhí)行結(jié)果為:5

這里面可能有點(diǎn)繞啊,初學(xué)者得理理清楚。在這次的代碼中,我們?cè)?eval中提供了globals參數(shù),這時(shí)候eval的作用域就是g指定的這個(gè)字典了,也就是外面的a=10被屏蔽掉了,eval是看不見(jiàn)的,所以使用了a為4的值。

3、在 locals指定的情況下 :

a=10
b=20
c=30
g={'a':6,'b':8}
t={'b':100,'c':10}
print(eval('a+b+c',g,t))

執(zhí)行的結(jié)果為:116

這里面就更有點(diǎn)繞人了,此次執(zhí)行的結(jié)果中,a是6,b是100,c是10。我們首先來(lái)看一下,對(duì)于a為6我們是沒(méi)有疑問(wèn)的,因?yàn)樵谏蟼€(gè)例子中已經(jīng)說(shuō)了,g會(huì)屏蔽程序中的全局變量的,而這里最主要的是為什么b是100呢?還記得我們?cè)趨?shù)介紹的時(shí)候說(shuō)過(guò),當(dāng)locals和globals起沖突時(shí),locals是起決定作用的,這在很多編程語(yǔ)言里都是一樣的,是作用域的覆蓋問(wèn)題,當(dāng)前指定的小的作用域會(huì)覆蓋以前大的作用域,這可以理解為一張小的紙蓋在了一張大的紙上,紙是透明的,上面寫(xiě)的東西是不透明的,而它們重合的地方就可以理解成兩個(gè)作用域沖突的地方,自然是小的顯現(xiàn)出來(lái)了。

使用的場(chǎng)合

對(duì)于eval的使用,我們一定要確保第一個(gè)參數(shù)expression滿足表達(dá)式的要求,它是可以被解析然后計(jì)算的。

s="abck"
print(eval(s))

執(zhí)行的結(jié)果為:NameError: name 'abck' is not defined

對(duì)于當(dāng)面的代碼,我們可以看到,字符串s并不滿足表達(dá)式的要求。當(dāng)eval剝?nèi)チ?abck"的外面的引號(hào)的時(shí)候,它會(huì)對(duì)它進(jìn)行解析,然后滿足要求后進(jìn)行計(jì)算,然后它解析到的是abcd,請(qǐng)注意,程序報(bào)出的錯(cuò)誤是NameError,也就是說(shuō),當(dāng)它解析到這個(gè)表達(dá)式是不可以計(jì)算后,它就會(huì)查找它是不是一個(gè)變量的名字,如果是一個(gè)變量的名字,那么它會(huì)輸出這個(gè)變量的內(nèi)容,否則就會(huì)產(chǎn)生這種報(bào)錯(cuò)。

s="abck"
print(eval('s')) 

執(zhí)行的結(jié)果為:abck

對(duì)于這個(gè)代碼,我們就可以看出來(lái)了,eval首先將‘s'的引號(hào)剝?nèi)ィ缓蟮玫降氖莝,顯然這個(gè)是不可以進(jìn)行計(jì)算的,那么它就開(kāi)始查找s是否是一個(gè)變量的名字,然后它一查找,果然s是一個(gè)字符串,所以程序輸出了s中的內(nèi)容。

在上面一直說(shuō)到expression的要求,那么它到底是什么具體要求呢?下面仍然通過(guò)例子進(jìn)行說(shuō)明。

s='"sas"'
print(eval(s))

執(zhí)行的結(jié)果為:sas

對(duì)于這個(gè)代碼,我們繼續(xù)分析,eval首先去除單引號(hào),eval在執(zhí)行的時(shí)候是只會(huì)去除同種類型的引號(hào)的,對(duì)于單引號(hào)和雙引號(hào)它是加以區(qū)分的。eval去除單引號(hào)后得到了“sas”,這個(gè)時(shí)候程序解析到它是一個(gè)字符串,不可以計(jì)算,就輸出了它。那么不禁想問(wèn),為什么上個(gè)例子中s="abck"會(huì)不行呢,這里面我們就可以看出區(qū)別了,一個(gè)是有引號(hào)括起來(lái)的,一個(gè)是沒(méi)有的,引號(hào)括起來(lái)代表字符串,雖然不可以求值,但是是有意義的,可以進(jìn)行輸出,而沒(méi)引號(hào)的便無(wú)法判斷“身份”了,只能當(dāng)做變量名進(jìn)行解析,而abck并不是一個(gè)變量名,所以就報(bào)錯(cuò)了。

s='["a","b","c"]'
print(eval(s))

執(zhí)行的結(jié)果為:['a', 'b', 'c']

對(duì)于這個(gè)程序就不多做解釋了,eval去除引號(hào)后會(huì)檢查到它是不可計(jì)算的,但它是一個(gè)列表,便輸出了里面的內(nèi)容。

a=10
b=20
c=30
s='[a,b,c]'
print(eval(s))

執(zhí)行的結(jié)果為:[10, 20, 30]

對(duì)于這個(gè)程序的結(jié)果,是不是有點(diǎn)意外,這里需要說(shuō)明的是,eval檢查到列表的‘['‘]'符號(hào)時(shí),是會(huì)對(duì)里面的元素進(jìn)行解析的,這里a、b、c顯然不是具體的數(shù)據(jù),便去查找它們是否是變量名,然后確認(rèn)是變量名后,用它們的內(nèi)容替換掉它。

s='abs(10)'
print(eval(s))

執(zhí)行的結(jié)果為:10

對(duì)于這個(gè)程序,我們舉的是一個(gè)滿足計(jì)算的一個(gè)表達(dá)式,當(dāng)eval剝?nèi)的引號(hào)后,得到abs(10),然后它會(huì)對(duì)進(jìn)行解析,這個(gè)解析我們前面介紹eval的時(shí)候說(shuō)過(guò),它會(huì)使用globals的內(nèi)建模塊__builtins__進(jìn)行解析的,在這個(gè)內(nèi)建模塊中是有abs這個(gè)函數(shù)的,所以對(duì)abs(10)進(jìn)行了計(jì)算。

關(guān)于__builtins__模塊中有哪些東西 ,我們可以這樣查看:

print(dir(__builtins__))

執(zhí)行結(jié)果為:

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

在這里我們可以看見(jiàn)這個(gè)模塊中所有的東西,eval在進(jìn)行計(jì)算的時(shí)候也是在這里進(jìn)行查找的

到這里,eval的解釋說(shuō)明就結(jié)束了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)批量新增數(shù)據(jù)的場(chǎng)景分析

    python實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)批量新增數(shù)據(jù)的場(chǎng)景分析

    這篇文章主要介紹了python實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)批量新增數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Python?dataframe如何設(shè)置index

    Python?dataframe如何設(shè)置index

    這篇文章主要介紹了Python?dataframe如何設(shè)置index,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python如何將大TXT文件分割成4KB小文件

    Python如何將大TXT文件分割成4KB小文件

    處理大文本文件是程序員經(jīng)常遇到的挑戰(zhàn),特別是當(dāng)我們需要把一個(gè)幾百M(fèi)B甚至幾個(gè)GB的TXT文件分割成小塊時(shí),下面我們來(lái)聊聊如何用Python自動(dòng)完成這個(gè)任務(wù)吧
    2025-04-04
  • PyQt5使用mimeData實(shí)現(xiàn)拖拽事件教程示例解析上

    PyQt5使用mimeData實(shí)現(xiàn)拖拽事件教程示例解析上

    這篇文章主要為大家介紹了PyQt中如何使用mimeData實(shí)現(xiàn)拖拽事件的示例解析過(guò)程,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • numpy矩陣乘法中的multiply,matmul和dot的使用

    numpy矩陣乘法中的multiply,matmul和dot的使用

    本文主要介紹了numpy矩陣乘法中的multiply,matmul和dot的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python?flask項(xiàng)目打包成docker鏡像發(fā)布的過(guò)程

    python?flask項(xiàng)目打包成docker鏡像發(fā)布的過(guò)程

    這篇文章主要介紹了python?flask項(xiàng)目打包成docker鏡像發(fā)布,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • python環(huán)境下安裝opencv庫(kù)的方法

    python環(huán)境下安裝opencv庫(kù)的方法

    這篇文章主要介紹了python環(huán)境下安裝opencv庫(kù)的方法 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 淺談Python數(shù)據(jù)類型之間的轉(zhuǎn)換

    淺談Python數(shù)據(jù)類型之間的轉(zhuǎn)換

    下面小編就為大家?guī)?lái)一篇淺談Python數(shù)據(jù)類型之間的轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 解決pycharm安裝scrapy DLL load failed:找不到指定的程序的問(wèn)題

    解決pycharm安裝scrapy DLL load failed:找不到指定的程序的問(wèn)題

    很多朋友向小編求助pycharm安裝scrapy DLL load failed:找不到指定的程序的問(wèn)題,就這一問(wèn)題小編在window10 + anaconda3 +pycharm2020.1.1 + scrapy安裝親測(cè)可用,下面把我的處理過(guò)程分享到腳本之家平臺(tái),供大家參考
    2021-06-06
  • python的tkinter、socket庫(kù)開(kāi)發(fā)tcp的客戶端和服務(wù)端詳解

    python的tkinter、socket庫(kù)開(kāi)發(fā)tcp的客戶端和服務(wù)端詳解

    本文介紹了TCP通訊流程和開(kāi)發(fā)步驟,包括客戶端和服務(wù)端的實(shí)現(xiàn),客戶端使用Python的tkinter庫(kù)實(shí)現(xiàn)圖形化界面,服務(wù)端使用socket庫(kù)監(jiān)聽(tīng)連接并處理消息,文章還提供了客戶端和服務(wù)端的代碼示例
    2025-01-01

最新評(píng)論

东海县| 丽水市| 清苑县| 莆田市| 金堂县| 犍为县| 会昌县| 巍山| 霸州市| 泰顺县| 吴旗县| 莱州市| 碌曲县| 寿光市| 平乡县| 克什克腾旗| 葫芦岛市| 龙门县| 五家渠市| 淮安市| 汾西县| 康马县| 九龙坡区| 江北区| 措美县| 泽普县| 长海县| 包头市| 玉溪市| 晋宁县| 长春市| 南川市| 门头沟区| 星座| 丰顺县| 鄂温| 渭源县| 西充县| 威宁| 宜宾市| 察哈|