码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【python】python内置函数——eval()/exec()执行一个字符串形式的python表达式


    目录

    1.eval()和exec()简单介绍

    2.eval()和exec()语法介绍

    3. eval()和exec()使用场景


    1.eval()和exec()简单介绍

    eval()和exec()两个函数功能相似,可以执行一个字符串形式的python表达式,相当于一个python的解释器。

    eval()和exec()的不同在于:eval()执行完要返回结果,而exec()执行完不返回结果。

    2.eval()和exec()语法介绍

    eval()语法格式:

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

    exec()语法格式:

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

    二者参数一样,参数说明:

    •         - expression:是一个字符串,是要计算的表达式,
    •         - globals:变量作用域,全局命名空间,如果被提供,必须是一个字典对象,如果不提供该参数,使用python的全局命名空间
    •         - locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象,如果不提供该参数,默认为globals提供的全局命名空间

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

    ⚪ 不使用globals和locals参数:

    1. print('2*3=',eval('2*3'))
    2. print('2**3=',eval('2**3'))
    3. print('pow(3,2)=',eval('pow(3,2)'))
    4. n=3
    5. print('n+9=',eval('n+9'))
    6. n='3'
    7. print('n*9=',eval('n*9'))

    显示结果:

    1. 2*3= 6
    2. 2**3= 8
    3. pow(3,2)= 9
    4. n+9= 12
    5. n*9= 333333333

    ⚪ 使用globals参数:

    1. dic={}
    2. dic['b'] = 3
    3. print(dic.keys())
    4. exec('a=4',dic)
    5. print(dic.keys())

    显示结果:

    1. dict_keys(['b'])
    2. dict_keys(['b', '__builtins__', 'a'])

    可以看到,exec(0函数中在作用域dic下执行了a=4的代码。执行完exec()后dic中新生成了两个新的key,分别是a和__builtins__,a是执行语句生成的,__builtins__是系统加入的内置key。

    ⚪ 使用locals参数:

    1. a=10
    2. b=20
    3. c=30
    4. g={'a':6,'b':8}
    5. t={'b':100,'c':10}
    6. print(eval('a+b+c',g,t))

    显示结果:

    1. 116
    2. None

    g是global全局命名变量,t是local局部命名变量,如果设置了local参数,则使用local,否则使用globals。表达式是a+b+c,t中包含b和c,g中包含a和b,那么a=6,b=100,c=10。b=100是因为要使用t中的变量,不能使用g中的变量。所以最终结果返回116。

    从上面的返回结果可以看出,exec()执行完不返回结果,eval()执行完会返回结果。所以exec()中适合放置运行后没有结果的语句,eval()中适合放置有结果返回的语句。

    如果eval()中表达式是没有返回值的参数,会报错:SyntaxError: invalid syntax。如:

    print(eval('a=2'))

    会有以下错误:

    1. print(eval('a=2'))
    2. File "", line 1
    3. a=2
    4. ^
    5. SyntaxError: invalid syntax

    3. eval()和exec()使用场景

    使用python开发服务端程序时,这两个函数使用的比较多。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过exec()和eval()来执行,这样设计可以使服务端与客户端的耦合度更低,系统更易扩展。

    但是需要注意的是,使用eval()或是exec()处理请求代码时,这两个啊哈桑农户常常会被黑客利用,称为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,限制eval()和exec()的执行范围。

    全文参考:

    Python eval() 函数 | 菜鸟教程 (runoob.com)

    Python eval()和exec()函数详解 (biancheng.net)

  • 相关阅读:
    工厂应该怎样规划生产品质管理?
    spfa求解图中是否含有负环 C++实现
    WebAssembly与Rust:高性能计算的前端应用
    爱上开源之golang入门至实战第四章-映射(Map)
    DBeaver安装与使用教程(超详细安装与使用教程),好用免费的数据库管理工具
    【面试普通人VS高手系列】Redis和Mysql如何保证数据一致性
    产品经理薪资水涨船高的根本原因是什么?
    最炫表白网站html5源码_七夕程序员的十款表白源码_html+css+js
    操作系统中的进程是什么?(详细讲解进程调度相关PCB信息)
    【算法笔记自学】第 10 章 提高篇(4)——图算法专题
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126477651
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号