有没有办法简化这个 python 代码?

IS there a way to simplify this python code?

我还处于学习编程的 "any technology sufficiently advanced..." 阶段。这段代码看起来很笨重,而且很难在需要时进行更新。有没有更好的方法来解决这个问题?对我来说,它看起来完全是疯子,但它确实有效……是吗?

它从 TKinter 径向 1-16 获取一个变量,并使用它 select grade1 等变量。然后 grade1 变量 link 到 sheet 在 gspread 上命名。

def go():
    subject = v.get()
    if  subject == 1:
        subject = grade1
    elif  subject == 2:
        subject = grade2    
    elif  subject == 3:
        subject = grade3
    elif  subject == 4:
        subject = grade4  
    elif  subject == 5:
        subject = grade5
    elif  subject == 6:
        subject = grade6
    elif  subject == 7:
        subject = grade7
    elif  subject == 8:
        subject = grade8
    elif  subject == 9:
        subject = grade9
    elif  subject == 10:
        subject = grade10    
    elif  subject == 11:
        subject = grade11
    elif  subject == 12:
        subject = grade12 
    elif  subject == 13:
        subject = grade13
    elif  subject == 14:
        subject = grade14
    elif  subject == 15:
        subject = grade15
    elif  subject == 16:
        subject = grade16

不要为 grade** 保留 16 个不同的变量!使用一个列表:

grades = [1, 2, 3, ...]  # or whatever your values are

那么您需要做的就是:

subject = grades[v.get() - 1]

您可以将它们存储在 grades=[grade1,...,grade16] 之类的列表中,然后将主题设置为 subject = grades[v.get()-1]

,而不是定义 16 个单独的 grade1...grade16 变量

绕过它的方法很少。

# 1. Using the `list` data type
def go():
    grade_list = [grade1, grade2, ... grade16]
    subject = [grade_list[v.get() - 1]]


# 2. Using the `eval` 
def go():
       subject = v.get()
       if subject in range(1, 17):
           subject = eval("grade" + str(subject))

第一种方法被认为是更好的代码。但是,还有另一种使用方法 eval 关键字。它把里面的代码当作一个表达式。由于只有变量的数字部分发生变化。但是,eval 并不是我推荐的最佳方式。更多信息,请参阅此页面 Why is using 'eval' a bad practice?

或使用字典:

d={1:grade1,2:grade2 ... 16:grade16}
print(d[v.get()])

你会得到想要的分数。

你必须有一个字典,其中包含所有可能的 v.get() 值的键,以及每个键所需的成绩值,这样你就可以在字典中得到 v.get() 键,然后通过使用 d[v.get()] 得到它的价值,现在你已经得到了想要的成绩。