Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复这些错误?低音吉他标签发生器_Python - Fatal编程技术网

Python 如何修复这些错误?低音吉他标签发生器

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

我正在开发一种可以生成低音吉他标签的软件(只使用4根弦和0-12个焦距) 我试着在任何地方定义这些全局变量,但都不起作用。 另外,调整函数的错误是什么

错误:

回溯(最近一次呼叫最后一次): 文件
“/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 = ""
…但是!

这是一种非常糟糕的做法。此外,您的代码还存在其他几个严重问题,这些问题不会导致错误,但会使您的代码非常不清晰,难以维护。因此,让我们修复它们,让您的代码变得漂亮:)

  • 全局变量和全局语句是非常糟糕的做法。您永远无法确定某个全局变量是否正确,是否具有您希望看到的值。在99.9%的情况下,全局变量使用不是一个选项,可以用局部变量代替如果确实需要全局语句,可以使用某种配置文件。您的
    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行

  • 本部分代码:
  • 迭代0..notes,但是!索引名称等于范围界限,并在内部更改。这是非常非常糟糕的做法!在这种情况下,它会起作用(这很奇怪),但在大多数情况下,它会产生许多意想不到的结果,迫使您一小时一小时地调试它们。因此,我们将其改写为:

    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)