Python 如何修复这些错误?低音吉他标签发生器
我正在开发一种可以生成低音吉他标签的软件(只使用4根弦和0-12个焦距) 我试着在任何地方定义这些全局变量,但都不起作用。 另外,调整函数的错误是什么 错误: 回溯(最近一次呼叫最后一次): 文件Python 如何修复这些错误?低音吉他标签发生器,python,Python,我正在开发一种可以生成低音吉他标签的软件(只使用4根弦和0-12个焦距) 我试着在任何地方定义这些全局变量,但都不起作用。 另外,调整函数的错误是什么 错误: 回溯(最近一次呼叫最后一次): 文件“/home/olaf/Documents/Projects/BassComposer/main.py”,第69行,在 生成器(fret、字符串) 文件“/home/olaf/Documents/Projects/BassComposer/main.py”,第62行,在生成器中 tab3+=str(fr
“/home/olaf/Documents/Projects/BassComposer/main.py”
,第69行,在
生成器(fret、字符串)
文件“/home/olaf/Documents/Projects/BassComposer/main.py”,第62行,在生成器中
tab3+=str(fret)
名称错误:未定义名称'tab3'
如果有人告诉我这些问题是由什么引起的,以及如何解决这些问题,我将不胜感激。
global
是一个语句,而不是创建它。如果您希望代码正常工作,您应该在生成器
函数之前编写以下内容:
tab0 = ""
tab1 = ""
tab2 = ""
tab3 = ""
…但是!
这是一种非常糟糕的做法。此外,您的代码还存在其他几个严重问题,这些问题不会导致错误,但会使您的代码非常不清晰,难以维护。因此,让我们修复它们,让您的代码变得漂亮:)
generator
函数更改四个全局变量的状态,并且不存储结果,我们可以使用以下命令重写它:tab0、tab1、tab2、tab3
。如果有人想为6-tabs低音吉他运行此代码,该怎么办?实际上,我们的选项卡是“一个实体”选项卡的一部分。。。犯错误桌子(对不起,我不是音乐家)。因此,我们可以将它们合并到一个实体选项卡列表中李>
tab_list=[]
有了它,我们的代码:
tab0 += str(fret)
tab1 += " "
tab2 += " "
tab3 += " "
转换为:
tab\u list.append((str(fret),None,None,None))
(不用担心Nones,我们可以稍后转换)
现在我们有了这个代码:
if string == 0:
tab_list.append(str(fret), None, None, None)
if string == 1:
tab_list.append(None, str(fret), None, None)
if string == 2:
tab_list.append(None, None, str(fret), None)
if string == 3:
tab_list.append(None, None, None, str(fret))
1. if fret in range(0,11):
2. if x in range(4, 7):
3. fret += 1
4. if x in range(4, 5):
5. fret += 1
看到模式了吗?:)str(fret)
索引等于string
值!因此,我们将其压缩得更多:
tabs_to_append = [None, None, None, None]
tabs_to_append[string] = str(fret)
tab_list.append(tabs_to_append)
我们把20行代码压缩成3行
for _ in range(0, notes): # We don't really need this index
1. if x in range(4, 9):
2. if x in range(4, 7) and fret in range(0,11):
3. fret += 1
4. if x in range(4, 5) and fret in range(0, 11):
5. fret += 1
第一个if语句检查x
为4..9。但内部只有一个if语句检查x
为4..7。这意味着第一个if语句是无用的,所以我们可以删除它(或者里面有逻辑错误)。此外,第2行和第4行的if语句都在范围(0,11)内具有fret。我们可以将其移动到第一行并获取以下代码:
if string == 0:
tab_list.append(str(fret), None, None, None)
if string == 1:
tab_list.append(None, str(fret), None, None)
if string == 2:
tab_list.append(None, None, str(fret), None)
if string == 3:
tab_list.append(None, None, None, str(fret))
1. if fret in range(0,11):
2. if x in range(4, 7):
3. fret += 1
4. if x in range(4, 5):
5. fret += 1
现在看第4行的if语句<代码>范围(4,5)返回一个项目列表[4]
。因此,如果x==4,此行将转换为:。现在我们终于可以更改代码块了:
1. if fret in range(0,11):
2. if x in range(5, 7):
3. fret += 1
4. elif x == 4:
5. fret += 2
您可以转换其他逻辑代码块。我相信它将被简化很多(甚至可能与我们现在重写的块合并)
最后,我们有了新的计划:
from random import randint
try:
times = int(input("How many notes do you want to be created?\n\n"))
except:
print("\nInvalid input!\n")
print("\n\nGenerating " + str(times) + " note(s) long bassline\n...\n\n")
startString = randint(0, 3)
startFret = randint(0, 9)
def generator(startFret, startString, times):
string = startString
fret = startFret
tab_list = []
for _ in range(times):
x = randint(0, 11)
y = randint(0, 16)
# Transformed
if fret in range(0,11):
if x in range(5, 7):
fret += 1
elif x == 4:
fret += 2
# Old, removed unnesessary if-statements
if x in range(8,11) and fret in range(1,12):
fret -= 1
if x in range(10,11):
fret -= 1
if y in range(11, 13) and string in range(0,2):
string += 1
if (y == 13):
string += 1
if y in range(14, 16) and string in range(1, 3):
fret -= 1
if (y==16):
fret -= 1
tabs_to_append = ["_", "_", "_", "_"]
tabs_to_append[string] = str(fret)
tab_list.append(tabs_to_append)
return tab_list
tabs = generator(startFret, startString, times)
# Converts list of time-tabs to strings of tabs-timeline
tabs_str = [
" ".join([
tabs[i][j]
for i in range(len(tabs))
])
for j in range(4)
]
for s in tabs_str:
print(s)
它可以进一步增强(当然,几乎每个程序都可以:),但我非常累,对不起。我想我在我的长数字纸草上帮了你一点忙
另外,生成器只返回一个选项卡的选项卡。我认为您的生成器代码中有一个逻辑错误。我不知道您想要生成什么,所以我不会给您任何建议。global
不会创建变量。它所做的只是改变变量的作用域,因为在函数中指定一个名称会使变量成为局部变量,而不会使用global
语句来表示其他情况。您在任何地方都没有给tab1
等任何值,因此您也不能向它们添加更多值。必须先设置一个变量,然后才能读取它。附加一些字符串也需要先读取。
from random import randint
try:
times = int(input("How many notes do you want to be created?\n\n"))
except:
print("\nInvalid input!\n")
print("\n\nGenerating " + str(times) + " note(s) long bassline\n...\n\n")
startString = randint(0, 3)
startFret = randint(0, 9)
def generator(startFret, startString, times):
string = startString
fret = startFret
tab_list = []
for _ in range(times):
x = randint(0, 11)
y = randint(0, 16)
# Transformed
if fret in range(0,11):
if x in range(5, 7):
fret += 1
elif x == 4:
fret += 2
# Old, removed unnesessary if-statements
if x in range(8,11) and fret in range(1,12):
fret -= 1
if x in range(10,11):
fret -= 1
if y in range(11, 13) and string in range(0,2):
string += 1
if (y == 13):
string += 1
if y in range(14, 16) and string in range(1, 3):
fret -= 1
if (y==16):
fret -= 1
tabs_to_append = ["_", "_", "_", "_"]
tabs_to_append[string] = str(fret)
tab_list.append(tabs_to_append)
return tab_list
tabs = generator(startFret, startString, times)
# Converts list of time-tabs to strings of tabs-timeline
tabs_str = [
" ".join([
tabs[i][j]
for i in range(len(tabs))
])
for j in range(4)
]
for s in tabs_str:
print(s)