【问题标题】:Shortening the code缩短代码
【发布时间】:2016-01-01 01:59:02
【问题描述】:

有没有办法缩短这段代码?它运作良好,但必须有一种方法让它看起来更好。

#d=69+12*log(2)*(f/440)
#d is midi, f is frequency
import math
f=raw_input("Type the frequency to be converted to midi: ")
d=69+(12*math.log(float(f)/440))/(math.log(2))
d=round(d)

上半部分是转换器,下半部分是需要缩短的...

if d==127:
    print("G")
elif d==126:
    print("F#")
elif d==125:
    print("F")
elif d==124:
    print("E")
elif d==123:
    print("D#")
elif d==122:
    print("D")
elif d==121:
    print("C#")
elif d==120:
    print("C")
elif d==119:
    print("B")
elif d==118:
    print("A#")
elif d==117:
    print("A")
elif d==116:
    print("G#")
elif d==115:
    print("G")
elif d==114:
    print("F#")
elif d==113:
    print("F")
elif d==112:
    print("E")
elif d==111:
    print("D#")
elif d==110:
    print("D")
elif d==109:
    print("C#")
elif d==108:
    print("C")
elif d==107:
    print("B")
elif d==106:
    print("A#")
elif d==105:
    print("A")
elif d==104:
    print("G#")
elif d==103:
    print("G")
elif d==102:
    print("F#")
elif d==101:
    print("F")
elif d==100:
    print("E")
elif d==99:
    print("D#")
elif d==98:
    print("D")
elif d==97:
    print("C#")
elif d==96:
    print("C")
elif d==95:
    print("B")
elif d==94:
    print("A#")
elif d==93:
    print("A")
elif d==92:
    print("G#")
elif d==91:
    print("G")
elif d==90:
    print("F#")
elif d==89:
    print("F")
elif d==88:
    print("E")
elif d==87:
    print("D#")
elif d==86:
    print("D")
elif d==85:
    print("C#")
elif d==84:
    print("C")
elif d==83:
    print("B")
elif d==82:
    print("A#")
elif d==81:
    print("A")
elif d==80:
    print("G#")
elif d==79:
    print("G")
elif d==78:
    print("F#")
elif d==77:
    print("F")
elif d==76:
    print("E")
elif d==75:
    print("D#")
elif d==74:
    print("D")
elif d==73:
    print("C#")
elif d==72:
    print("C")
elif d==71:
    print("B")
elif d==70:
    print("A#")
elif d==69:
    print("A")
elif d==68:
    print("G#")
elif d==67:
    print("G")
elif d==66:
    print("F#")
elif d==65:
    print("F")
elif d==64:
    print("E")
elif d==63:
    print("D#")
elif d==62:
    print("D")
elif d==61:
    print("C#")
elif d==60:
    print("C")
elif d==59:
    print("B")
elif d==58:
    print("A#")
elif d==57:
    print("A")
elif d==56:
    print("G#")
elif d==55:
    print("G")
elif d==54:
    print("F#")
elif d==53:
    print("F")
elif d==52:
    print("E")
elif d==51:
    print("D#")
elif d==50:
    print("D")
elif d==49:
    print("C#")
elif d==48:
    print("C")
elif d==47:
    print("B")
elif d==46:
    print("A#")
elif d==45:
    print("A")
elif d==44:
    print("G#")
elif d==43:
    print("G")
elif d==42:
    print("F#")
elif d==41:
    print("F")
elif d==40:
    print("E")
elif d==39:
    print("D#")
elif d==38:
    print("D")
elif d==37:
    print("C#")
elif d==36:
    print("C")
elif d==35:
    print("B")
elif d==34:
    print("A#")
elif d==33:
    print("A")
elif d==32:
    print("G#")
elif d==31:
    print("G")
elif d==30:
    print("F#")
elif d==29:
    print("F")
elif d==28:
    print("E")
elif d==27:
    print("D#")
elif d==26:
    print("D")
elif d==25:
    print("C#")
elif d==24:
    print("C")
elif d==23:
    print("B")
elif d==22:
    print("A#")
elif d==21:
    print("A")
elif d==20:
    print("G#")
elif d==19:
    print("G")
elif d==18:
    print("F#")
elif d==17:
    print("F")
elif d==16:
    print("E")
elif d==15:
    print("D#")
elif d==14:
    print("D")
elif d==13:
    print("C#")
elif d==12:
    print("C")
elif d==11:
    print("B")
elif d==10:
    print("A#")
elif d==9:
    print("A")
elif d==8:
    print("G#")
elif d==7:
    print("G")
elif d==6:
    print("F#")
elif d==5:
    print("F")
elif d==4:
    print("E")
elif d==3:
    print("D#")
elif d==2:
    print("D")
elif d==1:
    print("C#")
elif d==0:
    print("C")

【问题讨论】:

  • 使用映射,例如数组或哈希表
  • 如果代码可以正常工作,您应该在堆栈交换网站的另一个站点上询问这个问题,名为 codereview
  • 对@davejal 感到抱歉,我没有意识到我不允许提交有关代码格式的问题。感谢您的参考:D

标签: python performance if-statement optimization


【解决方案1】:

由于您检查的是 0 到 127 之间的整数,listtuple 将是完美的,因为您可以通过索引轻松访问它:

>>> l = ['C', 'C#', 'D', 'C', 'C#', 'D']
>>> d = 1
>>> print(l[d])
C#

最重要的是,由于模式重复,您可以使用% 运算符来除以得到余数,这将允许您使用listtuple 的单个循环:

>>> l = ['C', 'C#', 'D']
>>> d = 5
>>> print(l[d%3])
D

根据您的情况使用d%12 而不是d%3,因为这就是您拥有的物品数量。

由于您使用的是 Python 2,根据 raw_input() 的使用和 round() 的行为判断,您需要将 d 转换为带有 d = int(round(d)) 的整数,然后再将其用作索引。

小心那些print 语句,因为添加括号不会把它变成类似于Python 3 的print() 函数的东西。如果您执行print('hello', 'world') 之类的操作,您会得到('hello', 'world') 而不是'hello world',您会在Python 3 中看到(或在Python 2 中导入print() 函数)。

【讨论】:

  • 感谢您的反馈,但每当我尝试使用列表时,我都会得到“TypeError: list indices must be integers, not float”的输出
  • @SpencerChurchill: 1) 使用int(index)index 转换为整数,2) 使用d % len(lst) 而不是对长度进行硬编码(即d % 3),因为如果您在其中添加/删除条目,它会回来咬你(作为一个错误)。
  • @SpencerChurchill - 对不起;我看到了 print 语句的括号,并认为您使用的是 Python 3,但没有注意到表示 Python 2 的 raw_input()。在 Python 2 中,round() 返回一个 float,而它返回一个 @ 987654348@ 在 Python 3 中四舍五入到零小数位。
  • 现在可以了!万分感谢!程序从 262 行变成了 8 行! XD
【解决方案2】:

首先要注意的是这些值是循环的,它们每 12 步重复一次(八度音阶中的半色调数)。您可以使用模运算符% 找到循环内的位置。那么你只需要执行 12 个测试。

但这可以通过使用数组来简化,其中每个数组索引对应一个音符。

notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
d_in_octave = d % 12;
print notes[d_in_octave]

【讨论】:

    【解决方案3】:

    使用列表

    notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G"]
    
    print notes[d]
    

    使用列表和模运算:

    notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
    print notes[d % len(notes)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多