網站首頁 編程語言 正文
字符串類型代碼的執行
字符串類型代碼的執行函數有三個,都是Python的內置函數。
- eval()執行字符串類型的代碼,并返回最終結果。
- exec()執行字符串類型的代碼。
- compile()將字符串類型的代碼編碼。代碼對象能夠通過exec語句來執行或者eval()進行求值。
下面來一一介紹這三個函數。
eval()
執行一個字符串表達式,并返回表達式的值
eval(expression[, globals[, locals]])
參數
- expression:Python 表達式。
- globals:必須是一個字典對象,否則程序會出錯。當定義了globals參數之后eval函數的作用域會被限定在globals中。
- locals:該參數掌控局部的命名空間,功能和globals類型,不過當參數沖突時,會執行locals處的參數。
例子一:因為此處沒有指定globals和locals,所以直接執行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()函數只能執行計算數學表達式的結果的功能,exec()能夠動態地執行復雜的Python代碼,能夠十分強大。參數如下:
- object:必選參數,必須是字符串或 code 對象。如果 object 是一個字符串,該字符串會先被解析為一組 Python 語句,然后在執行(除非發生語法錯誤)。如果 object 是一個 code 對象,那么它只是被簡單的執行。
- globals:可選參數,表示全局命名空間(存放全局變量)必須是一個字典對象。
- locals:可選參數,表示當前局部命名空間(存放局部變量)可以是任何映射對象。如果該參數被忽略,那么它將會取與 globals 相同的值。
下面來看一些例子。
例子一:執行簡單的代碼
>>> 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中執行嗎,為何還要多此一舉?在實際項目中,我們有些時候會將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()函數將一個字符串編譯為字節代碼或 AST 對象。代碼對象可以被 exec()或 eval() 執行。以下是compile()方法的語法:
compile(source, filename, mode[, flags[, dont_inherit]])
參數如下:
- source :可以是常規的字符串、字節字符串,或者 AST 對象
- filename:代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值。
- mode:指定編譯代碼的種類??梢灾付?exec, eval, single。
- 如果是exec類型,表示這是一個序列語句,可以進行運行;
- 如果是eval類型,表示這是一個單一的表達式語句,可以用來計算相應的值出來;編譯代碼時,如果語法出錯會返回SyntaxError;如果代碼包含一些空字節,則返回類型錯誤TypeError。
- 如果是single類型,表示這是一個單一語句,采用交互模式執行,在這種情況下,如果是一個表達式,一般會輸出結果,而不是打印為None輸出。
- flags:變量作用域,局部命名空間,如果被提供,可以是任何映射對象。
- flags和dont_inherit是用來控制編譯源碼時的標志。
編譯代碼時,如果語法出錯會返回SyntaxError;如果代碼包含一些空字節,則返回類型錯誤TypeError。
注意事項:當采用single或eval類型編譯時,如果有多行代碼,每行代碼后面至少有一個換行符,否則在code模塊編譯時就會提示編譯的源碼不完整錯誤。在Python 3.2版本之后,允許輸入Windows或Mac的換行符;當采用exec模式時,不需要在每個行后面輸入換行符;在這個版本之后增加了優化參數。
例子:
>>> 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
原文鏈接:https://blog.csdn.net/weixin_41951954/article/details/128834532
相關推薦
- 2022-05-29 python3中的類繼承你真的了解嗎_python
- 2022-07-08 C#中的Dialog對話框_C#教程
- 2022-05-14 在Pandas?DataFrame中插入一列的方法實例_python
- 2022-07-26 Golang異常處理之defer,panic,recover的使用詳解_Golang
- 2022-06-16 golang?gorm錯誤處理事務以及日志用法示例_Golang
- 2022-06-16 使用golang如何優雅的關機或重啟操作示例_Golang
- 2023-01-07 anaconda?navigator打不開問題的解決方法_python
- 2022-05-28 python爬蟲框架scrapy下載中間件的編寫方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支