zoukankan      html  css  js  c++  java
  • python eval()和exec()以及complie()

    1.eval() 函数

    eval() 函数用来执行一个字符串表达式,并返回表达式的值。 ------->>  eval(expression[, globals[, locals]])

    参数

    • expression -- 表达式。
    • globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    • locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。如果参数被忽略,那么它将会取与globals相同的值。
    • 如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。
    x = 10
    def func():
        y = 20   #局部变量y
        a = eval("x+y")
        print("a:",a)      #x没有就调用全局变量
        b = eval("x+y",{"x":1,"y":2})     #定义局部变量,优先调用
        print("b:",b)
        c = eval("x+y",{"x":1,"y":2},{"y":3,"z":4})  
        print("c:",c)  
        d = eval("print(x,y)")
        print("d:",d)   #对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
    func()

    输出结果:

    a: 30
    b: 3
    c: 4
    10,20 #运行的print(x,y)
    d: None

    返回值:返回表达式的计算结果

     1 >>>x = 7
     2 >>> eval( '3 * x' )
     3 21
     4 >>> eval('pow(2,2)')
     5 4
     6 >>> eval('2 + 2')
     7 4
     8 >>> n=81
     9 >>> eval("n + 4")
    10 85

    eval 方法能使字符串本身的引号去掉,保留字符的原本属性。

    1 >>> a = "123"
    2 >>> type(a)
    3 <class 'str'>
    4 >>> b = eval(a)
    5 >>> b
    6 123
    7 >>> type(b)
    8 <class 'int'>

    eval() 函数也可以直接用来提取用户输入的多个值。

    a,b=eval(input())
    输入:10,5,得到 a=10,b=5。
    

    2.exec函数

    函数的作用:动态执行python代码。也就是说exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值。

    source:必选参数,表示需要被指定的python代码。它必须是字符串或code对象。如果source是一个字符串,该字符串会先被解析为一组python语句,然后执行。如果source是一个code对象,那么它只是被简单的执行。

    返回值: exec函数的返回值永远为None。

    eval()函数和exec()函数的区别:

    • eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
    • eval()函数可以有返回值,而exec()函数返回值永远为None。
     1 x = 10
     2 def func():
     3     y = 20
     4     a = exec("x+y")
     5     print("a:",a)
     6     b = exec("x+y",{"x":1,"y":2})
     7     print("b:",b)
     8     c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
     9     print("c:",c)
    10     d = exec("print(x,y)")
    11     print("d:",d)
    12 func()

    输出结果:

    #exec不会有任何返回值
    a: None   
    b: None
    c: None
    10 20
    d: None

    例子2:

     1 x = 10
     2 expr = """
     3 z = 30
     4 sum = x + y + z   #一大包代码
     5 print(sum)
     6 """
     7 def func():
     8     y = 20
     9     exec(expr)   10+20+30
    10     exec(expr,{'x':1,'y':2}) 30+1+2
    11     exec(expr,{'x':1,'y':2},{'y':3,'z':4}) #30+1+3,x是定义全局变量1,y是局部变量
    12 
    13 func()

    执行结果:

    60
    33
    34

    3.complie函数

    函数的作用:

    compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
    

    参数说明

    source:字符串或AST对象,表示需要进行编译的python代码

    filename:指定需要编译的代码文件,如果不是文件读取代码则传递一些可辨认的值。

    mode:用于标识必须当做那类代表来编译;如果source是由一个代码语句序列组成,则指定mode=‘exec’,如果source由单个表达式组成,则指定mode=‘eval’;如果source是由一个单独的交互式语句组成,则指定modo=‘single’。必须要制定,不然肯定会报错。

    s = """              #一大段代码
    for x in range(10):
        print(x, end='')  
    print()
    """
    code_exec = compile(s, '<string>', 'exec')   #必须要指定mode,指定错了和不指定就会报错。
    code_eval = compile('10 + 20', '<string>', 'eval')   #单个表达式
    code_single = compile('name = input("Input Your Name: ")', '<string>', 'single')   #交互式
    
    a = exec(code_exec)   使用的exec,因此没有返回值
    b = eval(code_eval)  
    
    c = exec(code_single)  交互
    d = eval(code_single)
    
    print('a: ', a)
    print('b: ', b)
    print('c: ', c)
    print('name: ', name)
    print('d: ', d)
    print('name; ', name)

    执行结果:

    0123456789  #有print就会打印
    Input Your Name: kebi
    Input Your Name: kebi
    a:  None
    b:  30
    c:  None
    name:  kebi
    d:  None
    name;  kebi
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/joneylulu/p/10246878.html
Copyright © 2011-2022 走看看