加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 更高效的代码(看似太多if语句)

发布时间:2020-12-20 12:11:54 所属栏目:Python 来源:网络整理
导读:我已经调查了这个,但我找不到任何帮助我的东西(道歉,如果类似的东西的答案可以帮助我).我正在编写一个货币转换器,它遭受了大量的if,它看起来效率不高,我也无法想象它的可读性非常好,所以我想知道如何在这种情况下编写更有效的代码: prompt = input("Input")
我已经调查了这个,但我找不到任何帮助我的东西(道歉,如果类似的东西的答案可以帮助我).我正在编写一个货币转换器,它遭受了大量的if,它看起来效率不高,我也无法想象它的可读性非常好,所以我想知道如何在这种情况下编写更有效的代码:

prompt = input("Input") #For currency,inputs should be written like "C(NUMBER)(CURRENCY TO CONVERT FROM)(CURRENCY TO CONVERT TO)" example "C1CPSP"

if prompt[0] == "C": #Looks at first letter and sees if it's "C". C = Currency Conversion
    #CP = Copper Piece,SP = Silver Piece,EP = Electrum Piece,GP = Gold Piece,PP = Platinum Piece
    ccint = int(''.join(list(filter(str.isdigit,prompt)))) # Converts Prompt to integer(Return string joined by str.(Filters out parameter(Gets digits (?),from prompt))))
    ccalpha = str(''.join(list(filter(str.isalpha,prompt)))) #Does the same thing as above expect with letters

    if ccalpha[1] == "C": #C as in start of CP
        acp = [ccint,ccint/10,ccint/50,ccint/100,ccint/1000] #Array of conversions. CP,SP,EP,GP,PP
        if ccalpha[3] == "C": #C as in start of CP
            print(acp[0]) #Prints out corresponding array conversion
        if ccalpha[3] == "S": #S as in start of SP,ETC. ETC.
            print(acp[1])
        if ccalpha[3] == "E":
            print(acp[2])
        if ccalpha[3] == "G":
            print(acp[3])
        if ccalpha[3] == "P":
            print(acp[4])
    if ccalpha[1] == "S":
        asp = [ccint*10,ccint,ccint/100]
        if ccalpha[3] == "C":
            print(asp[0])
        if ccalpha[3] == "S":
            print(asp[1])
        if ccalpha[3] == "E":
            print(asp[2])
        if ccalpha[3] == "G":
            print(asp[3])
        if ccalpha[3] == "P":
            print(asp[4])
    if ccalpha[1] == "E":
        aep = [ccint*50,ccint*5,ccint/2,ccint/20]
        if ccalpha[3] == "C":
            print(aep[0])
        if ccalpha[3] == "S":
            print(aep[1])
        if ccalpha[3] == "E":
            print(aep[2])
        if ccalpha[3] == "G":
            print(aep[3])
        if ccalpha[3] == "P":
            print(aep[4])
    if ccalpha[1] == "G":
        agp = [ccint*100,ccint*10,ccint*2,ccint/10]
        if ccalpha[3] == "C":
            print(agp[0])
        if ccalpha[3] == "S":
            print(agp[1])
        if ccalpha[3] == "E":
            print(agp[2])
        if ccalpha[3] == "G":
            print(agp[3])
        if ccalpha[3] == "P":
            print(agp[4])
    if ccalpha[1] == "P":
        app = [ccint*1000,ccint*100,ccint*20,ccint]
        if ccalpha[3] == "C":
            print(app[0])
        if ccalpha[3] == "S":
            print(app[1])
        if ccalpha[3] == "E":
            print(app[2])
        if ccalpha[3] == "G":
            print(app[3])
        if ccalpha[3] == "P":
            print(app[4])

解决方法

您始终可以使用词典进行查找:

lookup = {'C': {'C': ccint,'S': ccint/10,'E': ccint/50,'G': ccint/100,'P': ccint/1000},'S': {'C': ccint*10,'S': ccint,'E': ccint/10,'G': ccint/10,'P': ccint/100},'E': {'C': ccint*50,'S': ccint*5,'E': ccint,'G': ccint/2,'P': ccint/20},'G': {'C': ccint*100,'S': ccint*10,'E': ccint*2,'G': ccint,'P': ccint/10},'P': {'C': ccint*1000,'S': ccint*100,'E': ccint*20,'G': ccint*10,'P': ccint}
         }

那么你所有的ifs大部分都包含在:

print(lookup[ccalpha[1]][ccalpha[3]])

但是可能包含其他字符吗?然后你需要引入一个后备:

try:
    print(lookup[ccalpha[1]][ccalpha[3]])
except KeyError:
    # Failed to find an entry for the characters:
    print(ccalpha[1],ccalpha[3],"combination wasn't found")

如上所述,它不是最有效的方式,因为它每次都计算每次转换(即使是不必要的转换).拥有基线可能更有效,例如P并保存因子:

lookup = {'C': 1000,'S': 100,'E': 50,'G': 10,'P': 1,}

# I hope I have them the right way around... :-)
print(ccint * lookup[ccalpha[3]] / lookup[ccalpha[1]])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读