在Python中,exec()是一個十分有趣且使用的內(nèi)置函數(shù),不同于eval()函數(shù)只能執(zhí)行計算數(shù)學表達式的結果的功能,exec()能夠動態(tài)地執(zhí)行復雜的Python代碼,能夠十分強大。具體的介紹可以參考官方文檔: https://docs.python.org/3/library/functions.html#exec 。
??本次分享講簡單聊聊exec()函數(shù)的用法,希望能給讀者一點啟示和參考。
??首先是一個簡單的小例子,代碼如下:
i = 12
j = 13
exec("answer=i*j")
print("Answer is %s"%answer)
該代碼的輸出結果為:
Answer is 156
這表明第三句的exec()函數(shù)能夠正確地執(zhí)行Python代碼,并且能將計算結果賦予answer變量,就像真正的Python代碼一樣。
??那么,我們能不能讓exec()函數(shù)執(zhí)行一個復雜的Python代碼呢?Why not?請看一下例子:
func = "def fact(n):\n\treturn 1 if n==1 else n*fact(n-1)"
exec(func)
a = fact(5)
print(a)
func為字符串,它是一個遞歸地計算整數(shù)階乘的函數(shù)。因為exec()僅支持string和code object參數(shù),所以我們要將該遞歸函數(shù)轉(zhuǎn)化成一個字符串,當然,格式還是要Python代碼的格式來,注意換行和縮進。剛才例子的輸出結果為:
120
??可能有些讀者納了悶了,這些代碼不是直接能夠在Python中執(zhí)行嗎,為何還要多此一舉地把它寫成字符串,并用exec()執(zhí)行呢?筆者的答案是,剛才的例子只是為了演示exec()函數(shù)的基本用法,它的強大之處遠不止于此。
??在實際項目中,我們有些時候會將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代碼。那么,我們?nèi)绾握{(diào)用它呢?答案就是exec()函數(shù),代碼如下:
with open('E://eg.txt', 'r') as f:
s = f.read()
exec(s)
在上述代碼中,我們先讀取eg.txt文件的內(nèi)容,再轉(zhuǎn)交exec()函數(shù)執(zhí)行,輸出結果如下:
720
??是不是有點棒呢?除了能執(zhí)行string和code object外,還可以在exec()函數(shù)中加入?yún)?shù),參數(shù)的傳遞可以寫成字典(dict)形式。具體的使用方法可以參考下面的例子:
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
在expr語句中,有三個變量x,y,z,其中z值已給定,我們可以在exec()函數(shù)外指定x,y的值,也可以在exec()函數(shù)中以字典的形式指定x,y的值。在最后的語句中,我們給出了x,y,z的值,并且y值重復,exec()函數(shù)接收后面一個y值,且z值傳遞不起作用,因此輸出結果為34.
??
---------------------
作者:劍與星辰
來源:CSDN
原文:https://blog.csdn.net/jclian91/article/details/80076512
版權聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
聯(lián)系客服