Python學習總結17:exec和eval執行求值字符串


      有些時候可能會需要動態地創造Python代碼,然后將其作為語句執行或作為表達式計算。

1. exec

>>>exec "print 'Hello, world!'"
Hello, world!
>>>from math import sqrt
>>>exec "sqrt=i"
>>>sqrt(4)
Traceback (most recent call,ast):
  File "<pyshell#18>", line 1. in ?
    sqrt(4)
TypeError: object is not callable: 1

    上面第二個例子,存在干擾已有函數的情況,這時需要使用命名空間(或作用域),解決該種問題;(或命名與已有函數名不一致)

from math import sqrt
>>> scope = {}
>>> exec 'sqrt = 1' in scope
>>> sqrt(4)
2.0
>>> scope['sqrt']

2. eval

    eval(用於“求值”)是類似於exec的內建函數。exec語句會執行一系列Pthon語句,而eval會計算Python表達式(以字符串形式書寫),並且返回結果值,(exec語句並不返回任何對象,因為它本身就是語句)。例如,可以使用下面的代碼創建一個Python計算器:

>>> eval(raw_input("Enter an arithmetic expression: ”))
Enter an arithmetic expressipn: 6+18 * 2
42

     跟exec一樣,eval也可以使用命名空間。盡管表達式幾乎不像語句那樣為變量重新賦值(事實上,可以給eval語句提供兩個命名空間,一個全局的一個局部的。全局的必須是字典,局部的可以是任何形式的映射)。

>>> scope = {}
>>> scope['x'] = 2
>>> scope['y'] = 3
>>>eval('x * y', scope)
6

     事實上, exec語句和eval語句並不常用,但是它們可以作為“后兜里的得力工具”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM