以前在C语言中常用占位符,来实现字符串解析,当然Python中也有这种用法:
a = 10
print("%s + 1" % a)
运行结果:10 + 1
但是占位符只能做替换,其实跟字符串拼接没有什么区别,在替换变量少时比拼接更麻烦,所以现在用的比较少了,更多的时候是在数据库查询和需要替换变量个数较多时。
这里我们要介绍一个更加强大的函数,不仅可以完成替换,还可以还可以把字符串转变成一个表达式进行求值运算。
- eval:将字符串str当成有效的表达式来求值并返回计算结果。
- eval(source, globals=None, locals=None)
- The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.
- 一个必须提供的str参数source, 和两个可选参数globals, locals, 其中globals必须是字典类型。
- 当只提供source时
a = 10
print(eval("a + 1"))
运行结果:11
- 当提供source和globals时
a = 10
g = {'a': 23}
print(eval("a + 1", g))
运行结果:24
- 当三个参数都提供时
a = 10
g = {'a': 23}
t = {'a': 100}
print(eval("a + 1", g, t))
运行结果:101
这个三个例子说名,eval()函数如果只提供source参数,则会在整个代码文件中获取a的值,而如果提供了globals,则在globals中查找,屏蔽外部参数,如果globals中找不到,则报错;如果再提供了locals参数,则先从locals中查找,若找到则直接获取,若没有再去globals中查找,如果globals中还找不到,则报错,这叫做“县官不如现管”。
a = 10
g = {'a': 23}
t = {'b': 100}
print(eval("a + 1", g, t))
运行结果:24
a = 10
g = {'b': 23}
t = {'b': 100}
print(eval("a + 1", g, t))
运行结果: