簡體   English   中英

通過字符串自動化 python 腳本?

[英]Automate a python script through strings?

假設下面的那些 python 對象被鎖定,我們無法更改代碼,我們只能在它之后編寫。 我知道這太可怕了。 但是可以說我們被迫處理這個問題。

Name01 = "Dorian"
Name02 = "Tom"
Name04 = "Jerry"
Name03 = "Jessica"
#let say that there's 99 of them

如何在不重復的情況下打印每個和單個(99)的名稱?

從我的菜鳥的角度來看。 在不重復的情況下解決這種情況的理想方法是使用與字符串相同的邏輯。

因為 name => Name+index所以很容易用它們進行迭代。

所以有點像下面完全虛構的代碼一樣的代碼:

for i in range (1,100):
    print(Name+f"{i:02d}")
for i in range (1,100):
     string_v_of_obj = "Name" + str(f"{i:02d}")
     print(func_transform_string_to_code(string_v_of_obj))

也許這樣的事情是可能的。

for python_object in script_objects:
    if Name in python_object:
       print(python_object)

這可以解決問題:

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])

您可以通過globals()訪問全局變量,或者如果您想要使用locals()訪問局部變量。 它們存儲在dict中。 所以

for i in range (1,100):
    print(locals()[f"Name{i:02d}"])

應該做你想做的。

您可以使用執行:

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)

Output

Dorian
Tom
Jessica
Jerry

解釋

locals() function 返回一個字典,其中包含在本地命名空間中定義的變量。 在全局命名空間中調用 locals() 與調用 globals() 相同,並返回一個表示模塊全局命名空間的字典。

使用eval()

>>> Name01 = "Dorian"
>>> Name02 = "Tom"
>>> Name04 = "Jerry"
>>> Name03 = "Jessica"
>>> for i in range(1, 100):
...   print(eval('Name%02d'%i))
... 
Dorian
Tom
Jessica
Jerry

如果您使用的是 3.7+,則可以使用f string go

f"Name{i:02d}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM