zoukankan      html  css  js  c++  java
  • python中eval和exec用法比较

    区别:
    1、exec与eval语句的主要区别是,exec把字符串转化成一个python代码执行,而eval从一个表达式里返回值。
    2、exec没有返回值,eval有返回值
    代码示例:

    >>> eval("2+3")
    5
    >>> exec("a=2+3")
    >>> a
    5
    >>> eval("2+3")
    5
    
    >>> exec("print(1)")
    1

    eval

    eval() 函数用来执行一个字符串表达式,并返回表达式的值。

    即实现list,tuple,dict与str之间的转化。

    语法

    以下是 eval() 方法的语法:

    eval(expression[, globals[, locals]])

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

    参数

    • expression -- 表达式。
    • globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    • locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

    globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

    python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。

    返回值

    返回表达式计算结果。


    实例

    #返回表达式的值

    >>>x = 7
    >>> eval( '3 * x' )
    21
    >>> eval('pow(2,2)')
    4
    >>> eval('2 + 2')
    4
    >>> n=81
    >>> eval("n + 4")
    85
    >>> eval('n') #也可以把字符串对应的值取出来
    81
     
     应用实例:
    >>> ip="39.106.41.11"
    >>> port="8080"
    >>>
    >>> register="http://"+ip+":"+port+"/register/"
    >>> print("register")
    register
    >>> print(eval("register"))
    http://39.106.41.11:8080/register/
     
     
     
    #字符串转换成list
    >>> a='[[1,2],[3,4]]'
    >>> print(type(a))
    <class 'str'>
    >>> b=eval(a)
    >>> b
    [[1, 2], [3, 4]]
    >>> type(b)
    <class 'list'>

    #字符串转换成元祖

    >>> t='(1,2,3)'
    >>> type(t)
    <class 'str'>
    >>> n=eval(t)
    >>> n
    (1, 2, 3)
    >>> type(n)
    <class 'tuple'>

    #字符串转换成字典

    >>> s="{'a':1}"
    >>> type(s)
    <class 'str'>
    >>> s1=eval(s)
    >>> s1
    {'a': 1}
    >>> type(s1)
    <class 'dict'>
    
    >>> eval('{2:1}')
    {2: 1}

    #加globals的用法

    >>> a=1
    >>> g={'a':20}
    >>> eval("a+1",g)
    21
    >>> x=1
    >>> y=1
    >>> num1 = eval('x+y')
    >>> num1
    2
    >>>
    >>>
    >>> def func():
    ... x=2
    ... y=2
    ... num3 = eval('x+y')
    ... print(num3)
    ... num2 = eval('x+y',globals())
    ... print(num2)
    ... num4 = eval('x+y',globals(),locals())
    ... print(num4)
    ...
    >>> func()
    4
    2
    4

    num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4

    exec

    描述

    exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。

    需要说明的是在 Python2 中exec不是函数,而是一个内置语句(statement),但是Python 2中有一个 execfile() 函数。可以理解为 Python 3 把 exec 这个 statement 和 execfile() 函数的功能够整合到一个新的 exec() 函数中去了。

    语法

    以下是 exec 的语法:

    exec obj
    

    参数

    • obj -- 要执行的表达式。

    返回值

    exec 返回值永远为 None。

    实例

    以下展示了使用 exec 的实例:

    实例 1

    #单行语句字符串

    >>> exec ("print ('hello world')")
    hello world

    #多行语句字符串

    >>> exec ("""for i in range(5):
    ... print ("iter time:%d" %i)
    ... """)
    iter time:0
    iter time:1
    iter time:2
    iter time:3
    iter time:4

    实例 2

    >>> x = 10
    >>> expr = """
    ... z = 30
    ... sum = x + y + z
    ... print(sum)
    ... """
    >>> def func():
    ... y = 20
    ... exec(expr)
    ... exec(expr, {'x': 1, 'y': 2})
    ... exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    ...
    >>> func()
    60
    33
    34
  • 相关阅读:
    Linux下安装SVN服务端小白教程
    在 Linux 下搭建 Git 服务器
    Linux系统中安装软件的几种方式
    springboot系列(十)springboot整合shiro实现登录认证
    shiro系列五、shiro密码MD5加密
    springboot系列(九)springboot使用druid数据源
    springboot系列(七) 项目热加载
    访问网页出现DNS错误
    SpringBoot入门
    MyBatisCodeHelper-Pro插件破解版[2.8.2] 【拒绝度盘】
  • 原文地址:https://www.cnblogs.com/wenm1128/p/11780965.html
Copyright © 2011-2022 走看看