Python学习总结17:exec和eval执行求值字符串

有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算。

1. exec

>>>exec "print ‘Hello, world!‘"
Hello, world!
>>>from math import sqrt
>>>exec "sqrt=i"
>>>sqrt(4)
Traceback (most recent call,ast):
  File "<pyshell#18>", line 1. in ?
    sqrt(4)
TypeError: object is not callable: 1

上面第二个例子,存在干扰已有函数的情况,这时需要使用命名空间(或作用域),解决该种问题;(或命名与已有函数名不一致)

from math import sqrt
>>> scope = {}
>>> exec ‘sqrt = 1‘ in scope
>>> sqrt(4)
2.0
>>> scope[‘sqrt‘]

2. eval

eval(用于“求值”)是类似于exec的内建函数。exec语句会执行一系列Pthon语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因为它本身就是语句)。例如,可以使用下面的代码创建一个Python计算器:

>>> eval(raw_input("Enter an arithmetic expression: ”))
Enter an arithmetic expressipn: 6+18 * 2
42

跟exec一样,eval也可以使用命名空间。尽管表达式几乎不像语句那样为变量重新赋值(事实上,可以给eval语句提供两个命名空间,一个全局的一个局部的。全局的必须是字典,局部的可以是任何形式的映射)。

>>> scope = {}
>>> scope[‘x‘] = 2
>>> scope[‘y‘] = 3
>>>eval(‘x * y‘, scope)
6

事实上, exec语句和eval语句并不常用,但是它们可以作为“后兜里的得力工具”。

时间: 2024-11-11 13:09:28

Python学习总结17:exec和eval执行求值字符串的相关文章

Python学习(17)面向对象

目录 Python 面向对象 创建实例对象 Python内置类属性 Pyyhon对象销毁(垃圾回收) 类属性与方法 Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们先来简单的

Python学习(17)异常处理

目录 Python 异常处理 Python 标准异常 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-finally 语句 异常参数 异常的参数 用户自定义参数 Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言(Assertions):本站Python教程会具体介绍. python标准异常 异常名称 描述

Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property. 获取特性 class Foo: def __init__(self,name): self.name = name #

python学习笔记17(动态类型)

动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象. 对象是储存在内存中的实体.但我们并不能直接接触到该对象.我们在程序中写的对象名,只是指向这一对象的引用(reference). 引用和对象分离,是动态类型的核心.引用可以随时指向一个新的对象: a = 3 a = 'python' 第一个语句中,3是储存在内存中的一个整数对象,通过赋值,引用a指向对象3. 第二

Python学习笔记17:标准库之数学相关(math包,random包)

前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整.比方x=1.2,返回2 math.floor(x)      # 对x向下取整.比方x=1.2,返回1 math.pow(x,y)      # 指数运算.得到x的y次方 math.log(x)        # 对数.默认基底为e.能够使用base參

Python学习笔记17:标准库之数学相关(之math包,random包)

前面几节看得真心累,现在先来点简单容易理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math.ceil(x)       # 对x向上取整,比如x=1.2,返回2 math.floor(x)      # 对x向下取整,比如x=1.2,返回1 math.pow(x,y)      # 指数运算,得到x的y次方 math.log(x)        # 对数,默认基底为e.可以使用base参数,

从零开始的Python学习Episode 17——序列化

序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语 言中也被称之为serialization,marshalling,flattening等等,都是一个意思. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling. json 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好 的方法是序列

第67天python学习基于tcp实例化实现远程执行命令

使用管道实现2个程序之间通信:例如:QQ  和微信通信 服务端: from socket import *import subprocess #管道模块,不同程序之间通信ip_port="127.0.0.1",8080back_log=5buffer_size=1024 tcp_server=socket(AF_INET,SOCK_STREAM)tcp_server.bind(ip_port)tcp_server.listen(5)while True: conn,addr=tcp_s

python中执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)

前阵子一直在思考一个问题,就是如何让用户在图形界面上输入的代码(输入的代码为字符串),成为代码的一部分而运行起来,恰逢看python爬虫的视频教程的时候,看到了使用eval函数,之后查找到了该文章,解决了我思考的问题. @文章来源:https://my.oschina.net/duhaizhang/blog/66048 Python有时需要动态的创造Python代码,然后将其作为语句执行  或  作为表达式计算. exec用于执行存储在字符串中的Python代码.   1. 语句与表达式的区别: