Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过字符串自动化python脚本?_Python - Fatal编程技术网

通过字符串自动化python脚本?

通过字符串自动化python脚本?,python,Python,假设下面的python对象被锁定我们无法更改代码,我们所能做的就是在代码之后立即编写。我知道这很可怕。但让我们说,我们被迫这样做 Name01 = "Dorian" Name02 = "Tom" Name04 = "Jerry" Name03 = "Jessica" #let say that there's 99 of them 如何在不重复的情况下打印每一个(99个)的名称? 从我的角度来看。解决这种情况而不重复的理想方法是使用与字符串相同的逻辑 因为名称=>名称+索引 因此,使用它们进行

假设下面的python对象被锁定我们无法更改代码,我们所能做的就是在代码之后立即编写。我知道这很可怕。但让我们说,我们被迫这样做

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}"