通过字符串自动化python脚本?
假设下面的python对象被锁定我们无法更改代码,我们所能做的就是在代码之后立即编写。我知道这很可怕。但让我们说,我们被迫这样做通过字符串自动化python脚本?,python,Python,假设下面的python对象被锁定我们无法更改代码,我们所能做的就是在代码之后立即编写。我知道这很可怕。但让我们说,我们被迫这样做 Name01 = "Dorian" Name02 = "Tom" Name04 = "Jerry" Name03 = "Jessica" #let say that there's 99 of them 如何在不重复的情况下打印每一个(99个)的名称? 从我的角度来看。解决这种情况而不重复的理想方法是使用与字符串相同的逻辑 因为名称=>名称+索引 因此,使用它们进行
Name01 = "Dorian"
Name02 = "Tom"
Name04 = "Jerry"
Name03 = "Jessica"
#let say that there's 99 of them
如何在不重复的情况下打印每一个(99个)的名称?
从我的角度来看。解决这种情况而不重复的理想方法是使用与字符串相同的逻辑
因为名称=>名称+索引
因此,使用它们进行迭代非常容易
因此,这段代码的工作逻辑与下面完全虚构的代码相同:
for i in range (1,100):
print(Name+f"{i:02d}")
也许这样的事情是可能的
for python_object in script_objects:
if Name in python_object:
print(python_object)
您可以通过
globals()
访问全局变量,或者如果希望使用locals()
访问局部变量。它们存储在目录中。所以
for i in range (1,100):
print(locals()[f"Name{i:02d}"])
应该做你想做的事。这可以做到:
Name01 = "Dorian"
Name02 = "Tom"
Name04 = "Jerry"
Name03 = "Jessica"
vars = locals().copy()
for i in vars:
if 'Name' in i:
print((i, eval(i)))
一行中的备选方案:
Name01 = "Dorian"
Name02 = "Tom"
Name04 = "Jerry"
Name03 = "Jessica"
print([(i, eval(i)) for i in locals().copy() if "Name" in i])
您可以使用exec:
Name01 = "Dorian"
Name02 = "Tom"
Name04 = "Jerry"
Name03 = "Jessica"
for i in range(1,5):
num = f"{i:02d}" # python3.6+
num = "{0:02d}".format(i) # python 3.x
num = "%02d"%i # python 2
exec('print(Name'+num+')')
使用此代码,根据要求,您只需打印名称,而不打印副本:
Name01 = "Dorian"
Name02 = "Tom"
Name03 = "Tom"
Name04 = "Jerry"
Name05 = "Jessica"
Name06 = "Jessica"
vars = locals().copy()
names = []
for variable in vars:
# This will make sure that we are only
# using variables having 'Name' in their names
if 'Name' in variable:
# Getting the variable's value
value = eval(variable)
# If the value is not duplicate
if value not in names:
# Append it to our final names list
names.append(value)
for name in names:
print (name)
输出
Dorian
Tom
Jessica
Jerry
解释
函数的作用是:返回包含变量的字典
在本地命名空间中定义。在全局函数中调用locals()
命名空间与调用globals()相同,并返回字典
表示模块的全局命名空间
使用eval()
如果您使用的是3.7+,则可以使用f string
f"Name{i:02d}"
如果范围或名称不完全正确,则很容易中断,最好检查公共部分。locals()
是正确的想法,但当它是动态对象时,您需要获得它的copy()
,并且您在使用对象本身时会遇到问题。不,您不会。您正在打印额外的数据(OP刚刚要求打印姓名)你没有考虑到根据requirement@Pitto我认为他有批判性思维,只获取他需要的值,我只是添加了它来帮助他。另外,变量怎么会有重复的?请向我解释一下。请检查下面的解决方案。我确实看到了你的代码,我明白你为什么说我没有考虑acc关于重复,但我不认为“无重复”的运算意味着排除具有相同值的变量,而是使用循环,而不是一次又一次地使用相同的代码。哦,我明白了……是的,它也可以用这种方式读取。也许更清楚一些会有帮助@DB3D@KlausD.how这有助于行动吗?你看过他的描述吗?他说他无法更改这部分代码,那么你的解决方案是什么?手动重写列表中的所有变量?谢谢!我不知道这个eval()函数,谢谢你的回答!
>>> Name01 = "Dorian"
>>> Name02 = "Tom"
>>> Name04 = "Jerry"
>>> Name03 = "Jessica"
>>> for i in range(1, 100):
... print(eval('Name%02d'%i))
...
Dorian
Tom
Jessica
Jerry
f"Name{i:02d}"