compile函數python
compile()函數容許程序員在運行時刻迅速生成代碼對象,而後就能夠用exec 語句或者內建函數eval()來執行這些對象或者對它們進行求值。一個很重要的觀點是:exec 和eval()均可以執行字符串格式的Python 代碼。當執行字符串形式的代碼時,每次都必須對這些代碼進行字節編譯處理。compile()函數提供了一次性字節代碼預編譯,之後每次調用的時候,都不用編譯了。程序員
compile(source, filename, mode[, flags[, dont_inherit]]) ide
第一參數表明了要編譯的python 代碼。第二個字符串,雖然是必需的,但一般被置爲空串。mode參數是個字符串,它用來代表代碼對象的類型。有三個可能值:函數
'eval' 可求值的表達式[和eval()一塊兒使用]code
'single' 單一可執行語句[和exec或eval()一塊兒使用]對象
'exec' 可執行語句組[和exec一塊兒使用]ci
可求值表達式rem
>>> eval_code = compile('100 + 200', '', 'eval') >>> eval(eval_code) 300
單一可執行語句字符串
>>> single_code = compile('print "Hello world!"', '', 'single') >>> single_code <code object <module> at 0xb76ebd10, file "", line 1> >>> exec single_code Hello world! >>> eval(eval_code) Hello world!
可執行語句組get
>>> exec_code = compile(""" ... req = input('Count how many numbers? ') ... for eachNum in range(req): ... print eachNum ... """, '', 'exec') >>> exec exec_code Count how many numbers? 6 0 1 2 3 4 5
2.eval函數
eval()對錶達式求值,後者能夠爲字符串或內建函數complie()建立的預編譯代碼對象。
eval(source[, globals[, locals]])
第二個和第三個參數,都爲可選的,分別表明了全局和局部名字空間中的對象。若是給出這兩個參數,globals 必須是個字典,locals能夠是任意的映射對象,好比,一個實現了__getitem__()方法的對象。(在2.4 以前,local 必須是一個字典)若是都沒給出這兩個參數,分別默認爲globals()和locals()返回的對象,若是隻傳入了一個全局字典,那麼該字典也做爲locals 傳入。
>>> eval('100 + 200') 300
3.exec語句
exec 語句執行代碼對象或字符串形式的python 代碼。
exec obj
被執行的對象(obj)能夠只是原始的字符串,好比單一語句或是語句組,它們也能夠預編譯成
一個代碼對象(分別用'single'和'exec"參數)。
>>> exec """ ... x = 0 ... print 'x is currently:', x ... while x < 5: ... x += 1 ... print 'incrementing x to:', x ... """ x is currently: 0 incrementing x to: 1 incrementing x to: 2 incrementing x to: 3 incrementing x to: 4 incrementing x to: 5
最後, exec 還能夠接受有效的python 文件對象。若是咱們用上面的多行代碼建立一個叫xcount.py 的文件,那麼也能夠用下面的方法執行相同的代碼
>>> f = open('xcount.py') # open the file >>> exec f # execute the file x is currently: 0 incrementing x to: 1 incrementing x to: 2 incrementing x to: 3 incrementing x to: 4 incrementing x to: 5