官方文档:
https://docs.python.org/3/library/functions.html#exec
在使用exec的时候,只能通过globals和locals调用全局和局部变量,也可以修改全局变量,但如果在souce中要增加变量,则会保存在exec自己的执行环境中,在下次执行exec的时候无法在调用该变量。要调用这个变量,方法如下:
- 在全局变量中增加一个字典变量,如scope
2.在调用exec时,将scope作为locals传入,这样exec的代码中增加的变量就会保存在scope字典中
3.下次调用exec时,scope仍然作为locals传入,这样exec中的代码就可以使用前一次定义的变量了。
# exec 将字符串作为代码执行
print(exec("print(\"helloworld\")"))
# 输出:
# helloworld
# None #多出的None是因为print函数返回了None值,如果不用print函数也可以返回值
# 定义函数 可以用于读取文本的函数并调用
func="def fab(n):\n\treturn 1 if n==1 or n==2 else fab(n-2)+fab(n-1)"
exec(func)
a=fab(3)
print(a)
# 传递命名空间--用于存放变量的地方 exec()提供2个命名空间:一个全局(必须是字典),一个局部(任何映射)
from math import sqrt
s={}
exec("sqrt=1",s) # exec("sqrt=1") 没有命名空间下一句会报错:TypeError: 'int' object is not callable
print(sqrt(4))
# 输出:2.0
print(s.keys()) # dict_keys(['__builtins__', 'sqrt'])
# 自动创建变量和对象
for i in range(100):
exec("variable"+str(i)+"="+str(i)+"**2")
print(variable3) # 9
在exec()函数中加入参数,参数的传递可以写成字典(dict)形式。具体的使用方法可以参考下面的例子:
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()
实例:exec()函数可以用于读取文本的函数并调用
# 定义函数 可以用于读取文本的函数并调用
with open(r"C:\Users\Lenovo\Desktop\1.txt", "r") as inFile:
func = inFile.read()
print()
s = {}
exec(func, s)
lst = list((s.keys()))
Fun = lst[1] if lst[1] != '__builtins__' else lst[0]
number = eval(input("Enter number:"))
(exec("print(" + Fun + "(" + str(number) + "))",s))
拓展:
pass、del、exec和eval:pass语句什么都不做,但适合用作占位符。del语句用于删除变
量或数据结构的成员,但不能用于删除值。函数exec用于将字符串作为Python程序执行。
函数eval计算用字符串表示的表达式并返回结果。
参考资料: