zoukankan      html  css  js  c++  java
  • python的eval、exec函数使用总结

     

    eval函数

    一、函数的作用

    将字符串str当成有效的表达式来求值并返回计算结果。它要执行的python代码只能是单个运算表达式(不支持任意形式的赋值操作),而不能是复杂的代码逻辑。

     

    二、函数的定义

    eval(expression, globals=None, locals=None)

    参数说明:

    expression:必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个python表达式进行分析和解释。

    globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

    locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

    如果globalslocals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

    返回值:

    如果expression是一个code对象,且创建该code对象时,compile函数的mode参数是’exec’,那么eval()函数的返回值是None

    否则,如果expression是一个输出语句,如print(),则eval()返回结果为None

    否则,expression表达式的结果就是eval()函数的返回值

     

    三、举几个栗子

    (1)计算字符串中有效的表达式,并返回结果

    1. >>> eval('pow(2,2)')  
    2. 4  
    3. >>> eval('2 + 2')  
    4. 4  

    (2)将字符串转成相应的对象(如listtupledictstring之间的转换)

    [python] view plain copy
    1. >>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"  
    2. >>> b = eval(a)  
    3. >>> b  
    4. [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]  
    5. >>> a = "{1:'xx',2:'yy'}"  
    6. >>> c = eval(a)  
    7. >>> c  
    8. {1: 'xx', 2: 'yy'}  
    9. >>> a = "(1,2,3,4)"  
    10. >>> d = eval(a)  
    11. >>> d  
    12. (1, 2, 3, 4)  

    (3)更改变量值

    1. x = 10  
    2. def func():  
    3.     y = 20  
    4.     a = eval('x+y')  
    5.     print "a=", a  
    6.     b = eval('x+y', {'x': 1, 'y': 2})  
    7.     print "b=", b  
    8.     c = eval('x+y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})  
    9.     print "c=", c  
    10. func()  



    输出:

    a= 30

    b= 3

    c= 4

     

    exec函数

    一、函数的作用

    动态执行python代码,可以执行复杂的python代码

    二、函数定义

    exec(object[, globals[, locals]]]

    参数说明:

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

    globals:可选参数,同eval函数

    locals:可选参数,同eval函数

    返回值:

    exec函数的返回值永远为None

     

    三、栗子

    (1)实例1

    因为exec返回值是None

    所以 a = exec(‘x+y’),这条代码会报错。

    改为exec(‘x+y’),可以正常执行

    而d = eval(‘print(x,y)’),这条代码会报错

    改为d = exec(‘print(x,y)’),可以正常执行

     

    (2)实例2

    [python] view plain copy
    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.     exec (expr, {'x': 1, 'y': 2})  
    11.     exec (expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})  
    12. func()  



    输出:

    60

    33

    34

     

    针对最后一条结果的输出,为什么z30不是4,梳理一下执行过程如下:

    [python] view plain copy
    1. x=1  
    2. y=2  
    3. def func():  
    4.     y=3  
    5.     z=4  
    6.    
    7.     z=30  
    8.     sum=x+y+z  
    9.     print(sum)  
    10. func()  



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

    eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段

    eval()函数可以有返回值,而exec()函数返回值永远为None

     

    原文:https://blog.csdn.net/xiaoquantouer/article/details/75049938

  • 相关阅读:
    Progressbar
    winform c# 打包
    WinForm中给DataGridView添加 自动编号
    ASP.NET页面的CheckBoxList组件
    C#截取DOS命令输出流取得网卡MAC地址
    get; set ; 害的我搞了一天
    WinForm(C#) 引用app.config文件中的数据库
    WinForm编程中 Enter自动登录设置
    vs新建解决方案,添加新项目,为什么不在解决方案中显示
    使用delegate实现两窗体传参代码
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9060702.html
Copyright © 2011-2022 走看看