eval函數linux,Python中的eval()、exec()及其相關函數

剛好前些天有人提到eval()與exec()這兩個函數,所以就翻了下Python的文檔。這里就來簡單說一下這兩個函數以及與它們相關的幾個函數,如globals()、locals()和compile():

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

輸出結果:

60

33

34

對輸出結果的解釋:

前兩個輸出跟上面解釋的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()

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

def 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 {'__builtins__': , 'func': , '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}

2131524302408 {'y': 20, 'x': 10, '_G': {'__builtins__': , 'func': , '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}, 'sum': 30}

實例2:

name = 'Tom'

age = 18

G = globals()

L = locals()

print(id(G), type(G), G)

print(id(L), type(L), L)

輸出結果:

2494347312392 {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, 'name': 'Tom', '__spec__': None, '__builtins__': , '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}

2494347312392 {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, 'name': 'Tom', '__spec__': None, '__builtins__': , '__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:指定需要編譯的代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值(通常是用'

mode:用于標識必須當做那類代碼來編譯;如果source是由一個代碼語句序列組成,則指定mode='exec';如果source是由單個表達式組成,則指定mode='eval';如果source是由一個單獨的交互式語句組成,則指定mode='single'。

另外兩個可選參數暫不做介紹

實例:

s = """

for x in range(10):

print(x, end='')

print()

"""

code_exec = compile(s, '', 'exec')

code_eval = compile('10 + 20', '', 'eval')

code_single = compile('name = input("Input Your Name: ")', '', '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來判斷,某個全局變量是否已經存在(被定義)。

0b1331709591d260c1c78e86d0c51c18.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux更改語言腳本,Linux shell腳本入門——shell語言腳本【CentOS】

認識腳本是使用一種特定的描述性語言&#xff0c;依據一定的格式編寫的可執行文件。腳本語言又被稱為擴建的語言, 或者動態語言, 是一種編程語言, 用來控制軟件應用程序, 腳本通常是以文本 (ASCⅡ) 保存, 只是在被調用時進行解釋或者編譯。學習shell腳本的用途對于一個合格的系…

linux可用的ftp,linuxunix下有很多可用的ftp服務器

一、ftp服務器簡介linux/unix下有很多可用的ftp服務器&#xff0c;根據這些ftp服務器的可配置性大概可以分為3類&#xff1a;弱、中等、高。功能比較簡單的ftp服務器軟件有“ftpd”和“oftpd”。前者與ftp客戶端工具“ftp”類似&#xff0c;只實現了標準的ftp功能&#xff0c;支…

linux視圖版怎么輸入命令,分享在Linux命令下操作MySQL視圖實例代碼

視圖VIEW命令簡介&#xff1a;VIEW視圖就是存儲下來的SELECT語句數據1。創建視圖命令格式&#xff1a;創建[或更換][ALGORITHM {UNDEFINED | MERGE | 不是Temptable}][DEFINER {user | 當前用戶 }][SQL SECURITY {DEFINER | INVOKER}]VIEW view_name [(column_list)]AS selec…

寶塔linux 做負載均衡,利用BT寶塔面板做網站多服務器負載均衡圖文教程

對于我們做網站的來說&#xff0c;如果流量大了&#xff0c;一臺服務器肯定是不夠的&#xff0c;接下來要考慮很多方面&#xff0c;比如動靜分離、比如數據庫異步&#xff0c;比如負載均衡等等。因為我們很多新手站長都用的是BT寶塔面板&#xff0c;下面蝦皮路就介紹一下利用BT…

c語言程序設計移動字母,C語言程序設計模擬試題二(含答案)

C語言程序設計模擬試題二(含答案)1、下列電子郵件地址中正確的是(其中□表示空格)A) Malin&http://www.doczj.com/doc/2969157fa26925c52cc5bfdc.html B) malinhttp://www.doczj.com/doc/2969157fa26925c52cc5bfdc.htmlC) Lin□Ma&http://www.doczj.com/doc/2969157fa2…

c語言字符串輸出瘕b,c語言課件10tt函數(1)幻燈片資料(51頁)-原創力文檔

第 5 講 ;第 8 章 函 數;引例 1;引例2b;m1cmpmax( a , b );cmpmax(int x , int y ){ int z; zx>y?x:y; return (z);};說 明;8.2 函數的調用;main( ){int i2,p; pf( i , i ); printf("%d\n",p);}int f(int a, int b){int c; if (a>b) c1; else if (a b) c0; el…

50行以上c語言程序代碼,C語言非常簡單的字符統計程序50行

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓該程序用于實現linux系統中wc命令的最簡單模式wc 命令用于統計文件中字符信息。[xxlocalhost 1.5]$ wc 01.c 02.c 03.c15 23 131 01.c13 18 127 02.c14 20 128 03.c42 61 386 總用量使用c語言寫出這種小程序。/** Name: count.c* T…

語音編碼 c語言,語音編解碼算法G.723.1在DSP - 嵌入式新聞 - 電子發燒友網

1 引言G.723.1是刪組織于1996年推出的一種低碼率的語音編碼算法標準&#xff0c;也是目前該組織頒布的語音壓縮標準中碼率最低的一種標準。G.723.1主要用于對語音及其它多媒體聲音信號的壓縮&#xff0c;目前在一些數字音視頻傳輸、高質量語音壓縮等系統中都得到廣泛應用。2 G.…

四川大學 設計專業 C語言必修,四川大學C語言2001年真題_跨考網

一、單項選擇題(在每小題的四個備選答案中&#xff0c;選出一個正確的答案&#xff0c;并將其號碼寫在答題紙上。請注意注明題號。每小題1分&#xff0c;共計6分)1、‘\t’表示什么?①字符串常數②標識符③變量④字符常量答案&#xff1a;④2、對宏定義不正確的描述是哪一個?…

大整數乘法c語言數組,很大的數相乘怎么辦?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include&nbsp #include&nbsp using&nbsp namespace&nbsp std;int&nbsp main(int&nbsp argc,&nbsp char&nbsp *argv[]){&nbsp &nbsp&nbsp &nbsp long&nbsp i,j, c,l…

血型遺傳關系c語言編程,根據血型遺傳關系,編程實現:○1.輸入

滿意答案df4dfw5e562017.05.28采納率&#xff1a;51% 等級&#xff1a;6已幫助&#xff1a;106人//僅作參考#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "string.h"int studentNum 0;#define MAXSTUDENT (1…

linux tcb,在Linux中從潛藏密碼遷移至tcb怎么做?

潛藏密碼作為Linux產品的既定事實標準已經有好多年了&#xff0c;md5密碼的運用亦是如此。但是&#xff0c;運用傳統的潛藏密碼要領也有不足之處&#xff0c;甚至md5也不像以前那么安全了。潛藏密碼文件的一個缺點就是&#xff0c;任意一個須要查詢個別潛藏密碼(如您的密碼)的使…

android 通話結束廣播,在Android中以編程方式結束通話

侃侃爾雅您無需成為系統應用程序。首先&#xff0c;com.android.internal.telephony在您的項目中創建包&#xff0c;并將其放入名為“ ITelephony.aidl” 的文件中&#xff1a;package com.android.internal.telephony; interface ITelephony { boolean endCall(); vo…

android url 快捷方式,Android向桌面添加快捷方式,使其指向特定的(URL)網頁

/** 在桌面添加快捷方式* param icon 快捷方式圖標* param name 快捷方式名稱* param uri 快捷方式的intent Uri*/public void addShortcut(Parcelable icon, String name, Uri uri){Intent intentAddShortcut new Intent(ACTION_ADD_S…

帶nfc 的 android 華為,華為手機NFC功能,原來這么好用,不會用真可惜幾千塊錢了...

華為手機NFC功能&#xff0c;原來這么好用&#xff0c;不會用真可惜幾千塊錢了2019-05-06 17:40:259點贊12收藏6評論華為手機在國內也是數一數二的了&#xff0c;那么用華為手機的小伙伴&#xff0c;怎么能錯過華為手機中NFC的功能呢&#xff1f;下面就隨小編一起來了解一下吧。…

android adb apk包名,ADB命令簡單使用--查看包名、activity等

1、連接設備adb connect ip2、查看連接的設備adb devices3、安裝/卸載Android 應用adb install packagesnameadb uninstall packagesname4、查看設備安裝包名adb shell pm list packages5、查看安裝包的路勁adb shell pm path packagename6、包pull到本地adb shell pull 包路徑…

小米3升級android 6.0,可升級Android 6.0機型一覽 小米手機亮了

前不久&#xff0c;Android M被谷歌正式確定為6.0系統&#xff0c;代號Marshmallow&#xff0c;預計年底前發布。而對于普通用戶來說&#xff0c;最關心的就是自己的手機能不能升級。不過別著急&#xff0c;在此之前&#xff0c;我們不妨看看Android 6.0有哪些新功能。一、Andr…

android 開發人員模式,Android

選取月份2021 年 5 月 (9)2021 年 4 月 (11)2021 年 3 月 (7)2021 年 2 月 (7)2021 年 1 月 (7)2020 年 12 月 (10)2020 年 11 月 (8)2020 年 10 月 (8)2020 年 9 月 (6)2020 年 8 月 (7)2020 年 7 月 (12)2020 年 6 月 (10)2020 年 5 月 (14)2020 年 4 月 (10)2…

安裝華為鴻蒙,魅族選擇與鴻蒙合作,華為這下要成了?

嚯&#xff0c;咱們的魅族可真爭氣&#xff01;眼看華為6月2日的大新聞箭在弦上蓄勢待發&#xff0c;一句“你好&#xff0c;鴻蒙”的問候&#xff0c;瞬間引爆了微博&#xff1a;具體有多熱鬧&#xff0c;你們瞧瞧這轉發和點贊&#xff1a;眾所周知&#xff0c;華為鴻蒙自從公…

瀏覽器兼容性怎么設置HTML,ie10瀏覽器中兼容性設置在哪里

之前ie瀏覽器一直被詬病的因素之一就是兼容性&#xff0c;不過ie10瀏覽器可以對兼容性進行設置&#xff0c;使得在兼容性視圖中顯示所有網站&#xff0c;具體怎么設置呢。下面由學習啦小編為你整理了ie10瀏覽器兼容性設置在哪里的解決方法&#xff0c;希望對你有幫助!ie10兼容性…