【问题标题】:IS there a way to simplify this python code?有没有办法简化这个 python 代码?
【发布时间】:2019-04-03 00:34:46
【问题描述】:

我仍处于学习编程的“任何足够先进的技术......”阶段。这段代码看起来很笨重,如果需要的话很难更新。有没有更好的方法来解决这个问题?它对我来说看起来完全疯狂,但它有效......所以是吗?

它从 TKinter 径向 1-16 中获取一个变量,并使用它选择grade1 ect 变量。 Grade1 变量然后链接到 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

【问题讨论】:

    标签: python python-3.x variables if-statement variable-assignment


    【解决方案1】:

    或者使用字典:

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

    你会得到想要的成绩。

    您必须有一个字典,其中包含所有可能的 v.get() 值的键,以及每个键所需的等级值,因此您可以在字典中获取 v.get() 键,然后通过使用获取它的值d[v.get()],现在你得到了想要的成绩。

    【讨论】:

    【解决方案2】:

    有几种方法可以绕过它。

    # 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?

    【讨论】:

    • 请不要推荐eval 来修复错误的程序/数据结构。
    • 我已经编辑过 eval 不是最好的解决方法 :)
    【解决方案3】:

    您可以将它们存储在grades=[grade1,...,grade16] 之类的列表中,然后将主题设置为subject = grades[v.get()-1],而不是定义16 个单独的grade1...grade16 变量

    【讨论】:

      【解决方案4】:

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

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

      那么你需要做的就是:

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

      【讨论】:

      • 谢谢你,这有效。我对其他事情做了类似的事情,但这对我来说并没有线索。非常感谢。
      • 根据经验:每当您将…2 附加到任何变量名称时,您都应该停下来思考一下您实际在做什么。
      • 所以对于我的 TK 径向按钮,我可以做类似的事情吗? but1= Radiobutton(root,text=grade[0],padx=5, variable=v, value =1,command= go) but2= Radiobutton(root,text=grade[1],padx=5, variable=v, value =2,command= go) but3= Radiobutton(root,text=grade[2],padx=5, variable=v, value =3,command= go)
      • 当然……buttons = [Radiobutton(...), Radiobutton(...), ...].
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多