Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 我如何在没有“a”的情况下绘制对数;“虽然是真的”;环_Python_Python 3.x - Fatal编程技术网

Python 我如何在没有“a”的情况下绘制对数;“虽然是真的”;环

Python 我如何在没有“a”的情况下绘制对数;“虽然是真的”;环,python,python-3.x,Python,Python 3.x,我一直在尝试绘制十二音阶,从最低到最高的可听音调,以赫兹为单位 我找到了一种方法,使用一个始终正确的while循环,然后在音调低于或高于人类可听到的范围时使用break退出循环 我知道这种循环是一种不好的做法,但是作为一个新手程序员,我想不出如何用正确的方法来实现。如果不使用“while True”,如何实现相同的结果 我尝试将条件“note>highest或note最高或注释最高或注释

我一直在尝试绘制十二音阶,从最低到最高的可听音调,以赫兹为单位

我找到了一种方法,使用一个始终正确的while循环,然后在音调低于或高于人类可听到的范围时使用break退出循环

我知道这种循环是一种不好的做法,但是作为一个新手程序员,我想不出如何用正确的方法来实现。如果不使用“while True”,如何实现相同的结果

我尝试将条件“note>highest或note
最高值=20000
最低=20
密钥=440
TET=12
相等的状态=[键]
i=1
尽管如此:
注=键*(2**(1/TET))**i
如果注释>最高或注释<最低:
打破
相等的状态。附加(注)
i+=1
i=1
尽管如此:
注=键*(2**(1/TET))**-i
如果注释>最高或注释<最低:
打破
相等的状态。附加(注)
i+=1
相等回火=已排序(相等回火)
对于范围内的i(len(等温)):
打印(等分[i])

终端的输出似乎是正确的。它的向下或向上取整可能与我见过的其他桌子不同。我只想知道如何不使用“while True”来实现这一点。

您可以简单地编写如下内容

while lowest <= note <= highest:
  ...

while lower我注意到你让你的编译器一遍又一遍地重复同样的计算,而它们只需要做一次!(这些都可以由您来完成)

您有一个用于注释值的设置方程:
note=key*(2**(1/TET))**i
。对于
i
i=TET*log_2(note/key)
的函数,可以很容易地将其倒置以求解
i
。有了这个,并且知道了注释的上限和下限,我们可以确定
i
的边界

插入上限,
20000
给出
i=66.07
。高于此值的任何值都将导致注释大于上限,因此我们希望取此值的下限<代码>i_upper=66

插入你的下限,
20
,给出
i=-53.51
。任何低于此值的值都将给出一个低于您的下限的注释,因此我们希望取此值的上限<代码>i_下限=-53

现在我们所要做的就是从
i_lower
循环到
i_upper
,并用注释值填充数组

这种方法避免了使用while循环,如果您更改任何参数,它很容易推广,并且只需通过构造,就可以返回一个已排序的数组,这样您就不必在以后对其进行排序

导入数学
最高=20000
最低=20
密钥=440
TET=12
def注释_值(键,TET,i):
“”“返回给定键、TET和i的注释值”“”
返回键*(2**(1/TET))**i
def i_值(键,测试,N):
“”“注释值的倒数。重新排列以求解i.”“”
返回TET*math.log(N/key)/math.log(2)
上面的注释=数学地板(i_值(键、TET、最高))
打印(f“上面的注释数={上面的注释数}”)
下面的注释=-math.ceil(i_值(key,TET,lower))
打印(f“下面的注释数={下面的注释}”)
打印(f“注释总数={notes_lower+notes_lower+1}”)
相等的脾气=[]
对于范围内的i(-下面的注释,上面的注释+1):
#我们必须在上述注释_中添加1,因为范围不包括期末。
相等状态追加(注意值(键,TET,i))
打印(*等速,sep=“\n”)
一些注意事项:
Log(x)/Log(B)
给出了x的对数基数B,无论原始对数基数是多少。这就是为什么我们在
i_值
函数中除以
math.log(2)
——它给出了
N/key
的log base 2

在字符串前面使用的字母
f
表示格式字符串,并将用其计算结果替换
{}
中的任何内容。例如,
x=5;打印(f“我的x是{x}”)
将打印
我的x是5
。这个速记功能是python 3.6的新特性。如果您使用的是Python3.6之前的版本,则需要用较长的版本替换format语句:
print(“上面的注释数={}”。format(上面的注释))


最后一个print语句使用
*
来“解包”
相等状态的注释列表,然后在每个元素之间用换行符(
\n
)打印它们

对!!成功了。我还必须在循环之外(之前)定义“note”,这样它就不会抛出“namererror”。不过,这个解决方案有一个小问题,它会添加一个小于指定范围的数字和一个大于指定范围的数字。有人知道如何纠正这个小错误吗?@JustinBrunkow你有没有试过替换“是的,我有!”!谢谢你的推荐,但结果还是一样的。
def get_equal_tempers(multiplier):
    tempers = list()
    note = 20
    i = 1
    while lowest <= note <= highest:
        note = key * (2 ** (1 / TET)) ** (i*multiplier)
        if note > highest or note < lowest:
            break
        tempers.append(note)
        i += 1
    return tempers



highest = 20000 
lowest = 20

key = 440 
TET = 12

equal_temper = [key] 
equal_temper += get_equal_tempers(1) 
equal_temper += get_equal_tempers(-1)

equal_tempered = sorted(equal_temper)
for i in range(len(equal_temper)):
  print(equal_tempered[i])