Список имен переменных в Python 3.8 - PullRequest
0 голосов
/ 17 июня 2020

В моей программе мне приходится обрабатывать большое количество переменных, и мне приходится выполнять один и тот же фрагмент кода для каждой из них.

try:
    a1 = int(a1_txt.get())
except ValueError:
    try:
        a1 = int(str(a1_txt.get()) + "0")
    except ValueError:
        a1 = 1
        invalid += 1
if 0 < a1 < 10:
    pass
else:
    rang += 1

try:
    a2 = int(a2_txt.get())
except ValueError:
    try:
        a2 = int(str(a2_txt.get()) + "0")
    except ValueError:
        a2 = 1
        invalid += 1
if 0 < a2 < 10:
    pass
else:
    rang += 1

Как видите, оба фрагмента кода одинаковы, с той лишь разницей, что на месте a1 во второй фигуре стоит a2. Проблема здесь в том, что у меня есть эти переменные вплоть до i9, поэтому мне пришлось бы переписывать этот кусок кода 64 раза каждый раз, меняя только одну цифру или букву. Очевидно, это было бы глупо, должен быть другой способ. Заранее спасибо за помощь. С уважением

Ответы [ 5 ]

0 голосов
/ 17 июня 2020

Я не совсем уверен в структуре и c логики вашего кода, поэтому было бы полезно, если бы вы предоставили входной образец или что-то вроде того, откуда вы получите текст. Но если я правильно понял, возможно, это поможет:

Если вы уже знаете количество переменных, которые у вас есть (n), и у вас есть список, содержащий текст, который вы будете использовать каждый раз

def reusable_finction(n,text_list):
    dict = {}
    i = 1
    invalid = 0
    rang = 0
    while i <n+1:
        try:
            x = int(text_list[i-1].get())
        except ValueError:
            try:
                x = int(str(text_list[i-1].get()) + "0")
            except ValueError:
                x = 1
                invalid += 1
        if 0 < x < 10:
            pass
        else:
            rang += 1

        dict["a"+str(i)] = x
0 голосов
/ 17 июня 2020

Вы можете составить список своих переменных, а затем использовать a для l oop, чтобы перебирать их.

Предполагая, что я правильно понял вашу ситуацию, следующее должно быть началом:

def use_text(txt):
    try:
        a = int(txt.get())
    except ValueError:
        try:
            a = int(str(txt.get()) + "0")
        except ValueError:
            a = 1
        invalid += 1
    if 0 < a < 10:
        pass
    else:
        rang += 1

txts = [a1, a2, a3] #and so on
for i in txts:
    use_text(i)

Почти наверняка будет лучшее решение, чем a = [a1, a2, a3] #and so on, но это будет зависеть от структуры вашего кода и данных, с которыми вы имеете дело.

Надеюсь, это поможет!

0 голосов
/ 17 июня 2020

Вы можете использовать eval(), чтобы найти значение переменной, учитывая ее str представление,
или exec() для более сложных целей:

a1,a2 = 8,4
for var_name in ("a1","a2"): # If there is some pattern to var_names, a double-loop here might help.
    if 0 < eval(var_name) < 10:
        pass
0 голосов
/ 17 июня 2020

Попробуйте вместо этого использовать словарь:

d = {1:int(a1_txt.get()),
     2:int(a2_txt.get())}

for k in d.keys():

    try:
        d[k] = int(a2_txt.get())
    except ValueError:
        try:
            d[k] = int(str(a2_txt.get()) + "0")
        except ValueError:
            d[k] = 1
            invalid += 1
    if 0 < d[k] < 10:
        pass
    else:
        rang += 1
0 голосов
/ 17 июня 2020

Это ответ на ваш вопрос:

def reusable_code(text):
    try:
        a = int(text.get())
    except ValueError:
        try:
            a = int(str(text.get()) + "0")
        except ValueError:
            a = 1
            invalid += 1
    if 0 < a < 10:
        pass
    else:
        rang += 1

Это можно использовать повторно 64 раза, если вы перебираете текстовые файлы и вызываете эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...