2016-01-01 137 views
-1

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

#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

使用映射,如数组或哈希表 –

+1

如果,如果你的工作应该在堆栈交换网络的其他网站,名为[代码审查]问这个代码(http://codereview.stackexchange.com/ )。 – davejal

+0

抱歉,@davejal我没有意识到我没有被允许提交关于代码格式的问题。感谢您的参考:D –

回答

6

Sin CE您正在检查从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')而不是你在Python 3中看到的'hello world'(或者在Python 2中导入了print()函数)。

+0

感谢您的反馈,但每当我尝试使用列表,我得到的输出“TypeError:列表索引必须是整数,而不是浮动” –

+0

@SpencerChurchill:** 1)**使用' int(index)'将'index'变成一个整数,** 2)**使用'd%len(lst)'而不是硬编码长度(即'd%3'),因为它会来如果您添加/删除条目,则返回咬你(作为一个错误)。 – ray

+0

@SpencerChurchill - 对不起;我在'print'语句中看到括号,并且认为您使用的是Python 3,但没有注意到表示Python 2的'raw_input()'。在Python 2中,'round()'返回一个'float',而它在Python 3中返回一个'int',当你四舍五入到小数点后的位数为零。 – TigerhawkT3

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

首先要注意的是,这些值是循环的,它们每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]