如何修复这些错误?低音吉他标签gen

2024-05-29 01:56:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一些软件,将产生低音吉他标签(只使用4弦和烦恼0-12种) 我试着在任何地方定义这些globals,但是没有用。 另外,校准函数的错误是什么?你知道吗

错误:

Traceback (most recent call last): File "/home/olaf/Documents/Projects/BassComposer/main.py", line 69, in generator(fret, string) File "/home/olaf/Documents/Projects/BassComposer/main.py", line 62, in generator tab3 += 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

如果有人告诉我这些问题是由什么引起的,以及如何解决它们,我会很感激的


Tags: andinstringifrangegeneratorglobaltab1
1条回答
网友
1楼 · 发布于 2024-05-29 01:56:05

globaldeclares the scope of the variable而不是创建它的语句。如果希望代码正常工作,应该在generator函数之前编写:

tab0 = ""
tab1 = ""
tab2 = ""
tab3 = ""

…但是!

这是非常糟糕的做法。此外,您的代码还有几个严重的问题,这些问题不会导致错误,但会使代码非常不清楚,并且很难维护。因此,让我们修复它们并使您的代码更漂亮:)

  1. 全局变量和全局语句是非常糟糕的做法。您永远无法确定某个全局变量是否正确,是否具有您希望看到的值。在99.9%的情况下,全局变量的使用不是一个选项,可以用局部变量代替。如果确实需要全局语句,可以使用某种配置文件。您的generator函数更改了四个全局变量的状态,并且不存储结果,我们可以使用以下命令重写它:
def generator(fret, string):
    tab0 = ""
    tab1 = ""
    tab2 = ""
    tab3 = ""
    for notes in range(0, notes):
        # All your another code
    return tab0, tab1, tab2, tab3
...
tab0, tab1, tab2, tab3 = generator(...)
  1. 有四个逻辑上相等的变量:tab0, tab1, tab2, tab3。如果有人想为6-tabs低音吉他运行这个代码呢?实际上,我们的标签是一个实体标签的一部分。。。呃。。。桌子(对不起,我不是音乐家)。所以我们可以把它们合并成一个实体标签列表!你知道吗

tab_list = []

有了它,我们的代码:

tab0 += str(fret)
tab1 += " "
tab2 += " "
tab3 += " "

转换为:

tab_list.append((str(fret), None, None, None))(不要担心无,我们可以稍后转换)

现在我们有了这个代码:

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

看到图案了吗?:)索引str(fret)等于string值!所以我们进一步压缩它:

    tabs_to_append = [None, None, None, None]
    tabs_to_append[string] = str(fret)
    tab_list.append(tabs_to_append)

我们把20行代码压缩成3行!你知道吗

  1. 这部分代码:
for notes in range(0, notes):
    generator(fret, string)
    notes -= 1

迭代0..notes,但是!索引名称等于范围界限,并在内部更改。这是非常非常糟糕的做法!在这种情况下,它会工作(这是奇怪的),但在大多数情况下,它会有许多意想不到的结果,将迫使你调试他们一小时一小时。所以我们重写为:

for _ in range(0, notes):  # We don't really need this index
  1. 不必要的逻辑:

我将在这段代码中解释这一部分:

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

检查x的第一个if语句是4..9。但是里面只有一个if语句检查x是4..7。这意味着第一个if语句是无用的,所以我们可以删除它(或者里面有逻辑错误)。另外,第2行和第4行的if语句都有fret in range(0, 11)。我们可以把它移到第一行,得到以下代码:

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语句。range(4, 5)返回一个项目列表[4]。所以这行转换成:if 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)

它可以增强更多(当然,几乎每个程序都可以:),但我非常累,对不起。我想我帮了你一点忙我的长数码纸莎草纸。你知道吗

另外,生成器只返回一个选项卡的选项卡。我认为你的生成器代码中有一个逻辑错误。我不知道你想产生什么,所以我不会给你任何建议。你知道吗

相关问题 更多 >

    热门问题