如何让和弦移调工具仅询问一次sign值而非每次迭代都询问?
解决移调方向重复询问的问题
我明白你的需求——现在每次处理和弦都要选正负移调,太麻烦了对吧?核心问题就是你把移调方向的询问逻辑放在了逐个处理和弦的循环内部,所以每次迭代都会重复触发。只需要把这个询问步骤移到处理和弦的循环外面,也就是收集完所有待移调和弦之后,就能实现只问一次的效果。
另外我还发现原代码里有个小bug:if sign == '1' or '+': 这行逻辑是错的,or '+' 永远为真,不管你输入什么都会走正移调分支,我也一起帮你修复了。
下面是修改后的完整代码:
import time import sys usr_list = ['A','BB','B','C','C#','D','EB','E','F','F#','G','AB'] u_list = [] t_list = [] def f(): usr = int(input('Enter how many chords need to be transposed: ')) while usr != 0: chord = input('\nEnter the chord that needs to be transposed: ').upper() if chord not in usr_list: print('Invalid Input') elif u_list.count(chord) >= 1: print('Already typed') else: usr -= 1 u_list.append(chord) print('Chords that need to be transposed are:', u_list) # 移调方向仅询问一次,移到处理和弦的循环外面 while True: sign = input('''1.Positive Transposition(+) 2.Negative Transpostion(-) Your choice: ''') if sign in ['1', '+', '2', '-']: break print('Invalid choice, please enter 1/+ or 2/-') # 根据选择统一设置移调方向 if sign == '1' or sign == '+': sign = '+' print('\nPositive shift initiating') else: sign = '-' print('\nNegative initiating') time.sleep(0.5) # 现在逐个处理和弦,不用再重复问方向了 while len(u_list) > 0: chord = u_list[0] t_key = int(input(f'Enter value of transposition for {chord}: ')) chord_value = usr_list.index(chord) if sign == '+': chord_transpose = chord_value + t_key # 处理超出范围的情况,取模更简洁 chord_transpose %= 12 else: chord_transpose = chord_value - t_key chord_transpose %= 12 transposed_chord = usr_list[chord_transpose] t_list.append(transposed_chord) print(f'Transposed chord: {transposed_chord}') del u_list[0] print('Remaining chords to transpose:', u_list) print('\nFinal transposed chords:', t_list) f()
关键改动说明:
- 移调方向仅询问一次:把
sign的输入逻辑移到了处理和弦的循环之前,并且加了输入校验,确保用户输入有效的选项。 - 修复逻辑错误:修正了原代码中
if sign == '1' or '+':的错误写法,改为判断sign是否在有效列表里。 - 简化移调计算:用取模运算
% 12替代原来的条件判断,不管加减多少都能直接得到正确的索引,代码更简洁。 - 优化用户体验:输入移调数值时提示当前处理的和弦,让用户更清楚操作对象。
内容的提问来源于stack exchange,提问作者devjyot kainda
相关产品推荐
相关产品推荐

