缩短代码

时间:2016-01-01 01:59:02

标签: python performance if-statement optimization

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

#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")

3 个答案:

答案 0 :(得分:6)

由于您正在检查0到127之间的整数,listtuple将是完美的,因为您只需使用索引即可访问它:

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

最重要的是,由于模式重复,您可以使用%运算符来划分并获取余数,这将允许您使用list或{{1的单个循环}}:

tuple

在您的情况下使用>>> l = ['C', 'C#', 'D'] >>> d = 5 >>> print(l[d%3]) D 代替d%12,因为您拥有多少项目。

由于您使用的是Python 2,因使用d%3raw_input()的行为来判断,您需要将round()转换为整数在将其用作索引之前d

请注意那些d = int(round(d))语句,因为添加括号并不会将其转换为Python 3的print函数。如果您执行print()之类的操作,那么您将获得print('hello', 'world')而不是您在Python 3中看到的('hello', 'world')(或者在导入了'hello world'函数的Python 2中)

答案 1 :(得分:4)

首先要注意的是,这些值是周期性的,它们每12个步骤重复一次(八度音程中的半色调数)。您可以使用模数运算符print()在循环中找到位置。然后你只需要进行12次测试。

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

%

答案 2 :(得分:0)

使用列表

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)]