我在做一些软件,将产生低音吉他标签(只使用4弦和烦恼0-12种) 我试着在任何地方定义这些globals,但是没有用。 另外,校准函数的错误是什么?你知道吗
错误:
Traceback (most recent call last): File
"/home/olaf/Documents/Projects/BassComposer/main.py"
, line 69, ingenerator(fret, string)
File "/home/olaf/Documents/Projects/BassComposer/main.py", line 62, in generatortab3 += str(fret)
NameError: name'tab3'
is not defined
from random import randint
try:
times =str(int(input("How many notes do you want to be created?\n\n")))
except:
print("\nInvalid input!\n")
print("\n\nGenerating " + times + " note(s) long bassline\n...\n\n")
startString = randint(0, 3)
startFret = randint(0, 9)
string = startString
fret = startFret
notes = int(times)
def generator(fret, string):
global tab0
global tab1
global tab2
global tab3
x = randint(0,11)
y = randint(0,16)
if x in range(4, 9):
if x in range(4, 7) and fret in range(0,11):
fret += 1
if x in range(4, 5) and fret in range(0, 11):
fret += 1
if x in range(8,11) and fret in range(1,12):
fret -= 1
if x in range(10,11) and fret in range(1, 12):
fret -= 1
if y in range(11,16):
if y in range(11, 13) and string in range(0,2):
string += 1
if (y == 13) and string in range(0,2):
string += 1
if y in range(14, 16) and string in range(1, 3):
fret -= 1
if (y==16) and string in range(1, 3):
fret -= 1
if string == 0:
tab0 += str(fret)
tab1 += " "
tab2 += " "
tab3 += " "
if string == 1:
tab1 += str(fret)
tab0 += " "
tab2 += " "
tab3 += " "
if string == 2:
tab2 += str(fret)
tab0 += " "
tab1 += " "
tab3 += " "
if string == 3:
tab3 += str(fret)
tab0 += " "
tab1 += " "
tab2 += " "
for notes in range(0, notes):
generator(fret, string)
notes -= 1
如果有人告诉我这些问题是由什么引起的,以及如何解决它们,我会很感激的
global
是declares the scope of the variable而不是创建它的语句。如果希望代码正常工作,应该在generator
函数之前编写:…但是!
这是非常糟糕的做法。此外,您的代码还有几个严重的问题,这些问题不会导致错误,但会使代码非常不清楚,并且很难维护。因此,让我们修复它们并使您的代码更漂亮:)
generator
函数更改了四个全局变量的状态,并且不存储结果,我们可以使用以下命令重写它:tab0, tab1, tab2, tab3
。如果有人想为6-tabs低音吉他运行这个代码呢?实际上,我们的标签是一个实体标签的一部分。。。呃。。。桌子(对不起,我不是音乐家)。所以我们可以把它们合并成一个实体标签列表!你知道吗tab_list = []
有了它,我们的代码:
转换为:
tab_list.append((str(fret), None, None, None))
(不要担心无,我们可以稍后转换)现在我们有了这个代码:
看到图案了吗?:)索引
str(fret)
等于string
值!所以我们进一步压缩它:我们把20行代码压缩成3行!你知道吗
迭代0..notes,但是!索引名称等于范围界限,并在内部更改。这是非常非常糟糕的做法!在这种情况下,它会工作(这是奇怪的),但在大多数情况下,它会有许多意想不到的结果,将迫使你调试他们一小时一小时。所以我们重写为:
我将在这段代码中解释这一部分:
检查
x
的第一个if语句是4..9。但是里面只有一个if语句检查x
是4..7。这意味着第一个if语句是无用的,所以我们可以删除它(或者里面有逻辑错误)。另外,第2行和第4行的if语句都有fret in range(0, 11)
。我们可以把它移到第一行,得到以下代码:现在看第4行的if语句。
range(4, 5)
返回一个项目列表[4]
。所以这行转换成:if x == 4:
。现在我们终于可以更改代码块了:您可以转换其他逻辑代码块。我相信它会简化很多(甚至可能与我们现在重写的块合并)。你知道吗
最后我们有了新的计划:
它可以增强更多(当然,几乎每个程序都可以:),但我非常累,对不起。我想我帮了你一点忙我的长数码纸莎草纸。你知道吗
另外,生成器只返回一个选项卡的选项卡。我认为你的生成器代码中有一个逻辑错误。我不知道你想产生什么,所以我不会给你任何建议。你知道吗
相关问题 更多 >
编程相关推荐