python compile、eval、exec內建函數

  1. 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
相關文章
相關標籤/搜索