python创建动态变量并赋值
创建动态变量:for i in range(0, 3):m = f'name{i}'print(m)输出结果:name0name1name2创建动态变量,并给动态变量赋值:创建动态变量name0,name1,name2,并给3个变量分别赋值(按照数组位置取值,并分别赋值给变量)j = [10, 20, 30]for i in range(0, 3):m = f'name{i}'exec(m + '
创建动态变量:
for i in range(0, 3):
m = f'name{i}'
print(m)
输出结果:
name0
name1
name2
创建动态变量,并给动态变量赋值:
创建动态变量name0,name1,name2,并给3个变量分别赋值(按照数组位置取值,并分别赋值给变量)
j = [10, 20, 30]
for i in range(0, 3):
m = f'name{i}'
exec(m + '= %s' % (j[i]))
print(name0)
print(name1)
print(name2)
输出结果:
10
20
30
value = [10, 20]
var = 'my_var'
expr = var + "= %s" % (value[1])
exec(expr)
print(my_var)
输出结果:
20
exec()函数
- 执行储存在字符串或文件中的 Python 语句;
- 语法:exec(object[, globals[, locals]])
- 参数说明:
- object:表示需要被指定的Python代码;字符串或代码对象。
- globals:表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。可选。包含全局参数的字典。
- locals:表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。可选。包含局部参数的字典。
- 返回值:None
- exce()函数的用途:
- 执行保存在文中的方法或函数,如:函数定义在一个文件中,程序读取出函数的内容(字符串),再使用exec(字符串)执行,就可以运行文件中定义的方法;
- 生成动态变量,并给动态变量赋值;
1、单行语句
exec('print("Hello world!")')
输出结果:
Hello world!
2、多行语句
- 用三引号括起来;
- 注意语句的换行空格;
exec("""
for i in range(3):
print(i)
""")
输出结果:
0
1
2
3、exec()函数
1)exec()的3个入参
1.1>> 在exec()函数外定义变量的值
# 在exec()函数外定义变量的值
x = 10
expr = '''
y = 20
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr)
输出结果:
x的取值: 10
y的取值: 20
sum的取值: 30
1.2>> 使用第二个参数全局变量,字典的形式指定变量的值
# 使用第二个参数全局变量,字典的形式指定变量的值
x = 10
y = 20
expr = '''
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr, {"x": 1, "y": 2})
输出结果:
x的取值: 1
y的取值: 2
sum的取值: 3
1.3>> 使用第三个参数局部变量,字典的形式指定变量的值
# 按照执行顺序给变量依次赋值
x = 10
y = 20
expr = '''
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
def fun():
x = 1000
y = 2000
exec(expr, {'x': 1, 'y': 2}, {'x': 10000, 'y': 20000})
fun()
输出结果:x先赋值为10,再赋值为1000,再赋值为10000,所以最终x取值为10000;
x的取值: 10000
y的取值: 20000
sum的取值: 30000
1.4>> 变量赋值优先级
待执行字符串外-->全局变量字典-->局部变量字典-->待执行字符串内
# 变量赋值优先级
x = 1
y = 2
expr = '''
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr, {'x': 10, 'y': 20})
输出结果:x先赋值为1,再赋值为10,最终x取值为10
x的取值: 10
y的取值: 20
sum的取值: 30
# 变量赋值优先级
x = 1
y = 2
expr = '''
x = 100
y = 200
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr, {'x': 10, 'y': 20})
输出结果:x先赋值为1,再赋值为10,再赋值为100,最终x取值为100
x的取值: 100
y的取值: 200
sum的取值: 300
# 变量赋值优先级
x = 1
y = 2
expr = '''
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr, {'x': 10, 'y': 20}, {'x': 1000, 'y': 2000})
输出结果:x先赋值为1,再赋值为10,再赋值为1000,最终x取值为1000
x的取值: 1000
y的取值: 2000
sum的取值: 3000
# 变量赋值优先级
x = 1
y = 2
expr = '''
x = 100
y = 200
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
exec(expr, {'x': 10, 'y': 20}, {'x': 1000, 'y': 2000})
输出结果:x先赋值为1,再赋值为10,再赋值为1000,再赋值为100,最终x取值为100
x的取值: 100
y的取值: 200
sum的取值: 300
# 变量赋值优先级
x = 1
y = 2
expr = '''
print("x的取值:", x)
print("y的取值:", y)
sum = x + y
print("sum的取值:",sum)
'''
def fun():
x = 10000
y = 20000
exec(expr, {'x': 10, 'y': 20})
print('************************')
exec(expr, {'x': 10, 'y': 20}, {'x': 1000, 'y': 2000})
fun()
输出结果:
x的取值: 10
y的取值: 20
sum的取值: 30
************************
x的取值: 1000
y的取值: 2000
sum的取值: 3000
2)执行保存在文中的函数
文件中定义待运行的函数:function.txt
def fun(param1, param2):
print("自动化测试执行结果,测试通过{var1}个,测试失败{var2}个".format(var1=param1, var2=param2))
fun(param1, param2)
编写运行脚本:从文件中读取到待执行的函数的字符串,使用exec() 运行函数
with open('function.txt', 'r', encoding='utf-8') as fp:
fun_str = fp.read()
run_str = '''
param1 = 5
param2 = 3
''' + fun_str
exec(run_str)
print("********华丽的分割线**********")
print(run_str)
输出结果:
自动化测试执行结果,测试通过5个,测试失败3个
********华丽的分割线**********
param1 = 5
param2 = 3
def fun(param1, param2):
print("自动化测试执行结果,测试通过{var1}个,测试失败{var2}个".format(var1=param1, var2=param2))
fun(param1, param2)
3)获取exec()函数中运行的字符串中定义的变量值
- 在expr字符串中定义的全局变量x和y,在exec()函数运行外部,不能被调用,如在exec()外部执行print(x),会报错,NameError: name 'x' is not defined;
- 运行exec()函数后,expr字符串中定义的全局变量,会以字典的形式,保存在global_dict中;
- 运行exec()函数后,expr字符串中定义的局部变量,会以字典的形式,保存在locals_dict中;
- 所以,要想获取expr字符串中定义的全局变量或局部变量的值,可以通过global_dict.get("x"),locals_dict.get("z")来进行获取;
global_dict = {}
locals_dict = {}
expr = '''
global x,y
x = 1
y = 2
z = 3
print("x的取值:", x)
print("y的取值:", y)
print("z的取值:", z)
'''
exec(expr, global_dict, locals_dict)
print(global_dict.get("x"))
print(global_dict.get("y"))
print(locals_dict.get("z"))
print(locals_dict)
# print(x) # 会报错,NameError: name 'x' is not defined
输出结果:
x的取值: 1
y的取值: 2
z的取值: 3
1
2
3
{'z': 3}
4)修改global和locals字典的取值
- x,y ,z的取值的最终结果,以expr字符串中的赋值作为最终的结果;
- 全局变量x 和 y,会保存到global_dict字典中,因为global_dict字典中已经存在了x,y的key,所以global_dict中的x,y的值被更新为{'x': 1, 'y': 2}
- 局部变量z,会保存到locals_dict字典中,因为locals_dict字典中没有z的key,所以在locals_dict字典中添加键z,所以locals_dict的取值为{'x': 100, 'y': 200, 'z': 3};
- 因为x,y是expr字符串中定义的全局变量,所以不会更新locals_dict中的x和y的值;
global_dict = {'x': 10, 'y': 20}
locals_dict = {'x': 100, 'y': 200}
expr = '''
global x,y
x = 1
y = 2
z = 3
print("x的取值:", x)
print("y的取值:", y)
print("z的取值:", z)
'''
exec(expr, global_dict, locals_dict)
print(global_dict.get("x"))
print(global_dict.get("y"))
print(locals_dict.get("z"))
print(locals_dict)
输出结果:
x的取值: 1
y的取值: 2
z的取值: 3
1
2
3
{'x': 100, 'y': 200, 'z': 3}
更多推荐
所有评论(0)