最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 一文了解Python eval函数

    正文概述    2020-01-19   301

    一文了解Python eval函数

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

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

    ·expression:表达式。

    ·globals:变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。

    ·locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

    >>>x = 7
    >>> eval( '3 * x' )
    21
    >>> eval('pow(2,2)')
    4
    >>> n=81
    >>> eval("n + 4")
    85

    默认作用域

    在 globals 和 locals 两个参数省略的情况下,eval() 函数在当前的作用域执行:

    x = 100
    y = 200
    def compute():
        x = 10
        y = 20
        print(eval("x + y"))
    compute()

    输出结果:

    30

    globals 作用域

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

    x = 100
    y = 200
    def compute():
        x = 10
        y = 20
        print(globals())
        print(locals())
    compute()

    输出结果:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.
    SourceFileLoader object at 0x0000024AC58C7710>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 
    'builtins' (built-in)>, '__file__': 'D:/Code/draw.py', '__cached__': None, 'x': 100, 'y': 200, 'compute': 
    <function compute at 0x0000024AC587C268>}
    {'x': 10, 'y': 20}

    从结果可以看到,globals() 的结果包含了全局变量 'x': 100, 'y': 200 ,而 locals() 则包含的是局部变量 'x': 10, 'y': 20。eval 函数包含 globals 参数则会使用全局作用域下的变量。

    x = 100
    y = 200
    def compute():
        x = 10
        y = 20
        print(eval("x + y", globals()))
        
    compute()

    输出结果:

    300

    locals 作用域

    如果同时包含 globals 和 locals 参数,则会优先在本地作用域查找,如果本地作用域没有,才会查找全局作用域。

    x = 100
    def compute():
        y = 20
        print(eval("x + y", globals(), locals()))
    compute()

    输出结果:

    120

    字符串转换

    字符串转换成列表

    s = "[[1,2], [3,4], [5,6]]"
    print(type(s))
    lst = eval(s)
    print(type(lst))
    print(lst)

    输出结果:

    <class 'str'>
    <class 'list'>
    [[1, 2], [3, 4], [5, 6]]

    字符串转换成字典

    s = "{'math': 90, 'chinese': 100}"
    print(type(s))
    dic = eval(s)
    print(type(dic))
    print(dic)

    输出结果:

    <class 'str'>
    <class 'dict'>
    {'math': 90, 'chinese': 100}

    字符串转换成元组

    s = "([1,2], [3,4], [5,6])"
    print(type(s))
    tup = eval(s)
    print(type(tup))
    print(tup)

    输出结果:

    <class 'str'>
    <class 'tuple'>
    ([1, 2], [3, 4], [5, 6])

    需要注意的地方

    eval() 函数有安全性问题,比如用户恶意输入就会获得当前目录文件。

    eval("__import__('os').system('dir')")

    甚至查看目录下的所有文件的内容:

    eval(open(‘filename’).read())

    怎么避免安全问题?

    ·自行写检查函数;

    ·使用 ast.literal_eval。

    众多python培训视频,尽在python学习网,欢迎在线学习!

    本文转自:https://www.jianshu.com/p/f37e14fe8cdd


    下载网 » 一文了解Python eval函数

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元