<p>这里有很多问题。在</p>
<ul>
<li>你需要弄清楚你的变量。
<ul>
<li>您试图使用<code>index</code>来表示值列表和输入字符串。它不可能同时意味着两件事。在</li>
<li>您试图使用<code>x</code>而不在任何地方定义它。假设它应该是输入字符串的浮点值?如果是的话,你必须这么说。在</li>
<li>您试图在<code>p</code>存在之前使用<code>p</code>来定义<code>entry</code>。但还不清楚<code>entry</code>对什么有用,因为你从来不使用它。在</li>
</ul></li>
<li>你还需要把你的控制流程理顺。
<ul>
<li>在<code>else</code>的情况下,应该运行什么代码?要么它必须包含<code>return</code>,要么您需要其他方法来打破这个循环。在</li>
</ul></li>
<li>你还需要把你的类型弄清楚。<code>[input(…)]</code>将给您一个包含一个元素的列表,即输入字符串。很难想象那会有什么用处。您不能将该列表与<code>'done'</code>进行比较,也不能将其转换为float。你想要的只是输入字符串本身。在</li>
<li>你不能仅仅猜测可能存在什么函数。没有名为<code>ln</code>的函数。查看<a href="https://docs.python.org/3/library/functions.html" rel="nofollow noreferrer">Built-in Functions</a>、<a href="https://docs.python.org/3/library/math.html" rel="nofollow noreferrer">^{<cd12>}</a>模块的文档,以及其他与查找所需函数相关的内容。在</li>
<li><code>1,000,000</code>不是一个数,而是三个数的元组。
<ul>
<li>你可以写<code>1_000_000</code>,也可以只写<code>1000000</code>。在</li>
<li>但不清楚为什么你需要一个限制。为什么不永远循环直到回车<code>done</code>?在</li>
</ul></li>
<li>你已经定义了一个函数,但是你从来没有调用它,所以它没有任何好处。在</li>
</ul>
<p>所以,我们来解决这些问题:</p>
<pre><code>import math
def Shannonindex():
index = []
endKey = 'done'
while True:
value = input("Enter a value: ")
if value != endKey:
x = float(value)
p = -1 * (x * math.log(x))
index.append(p)
else:
Sindex = sum(index)
return Sindex
Sindex = Shannonindex()
print('Your Shannon Diversity Value is: ", Sindex)
</code></pre>
<hr/>
<p>仍有许多方法可以改善这一点:</p>
<ul>
<li>添加一些错误处理,因此如果用户键入<code>13.2.4</code>或{<cd18>},它会告诉他们再试一次,而不是放弃整个过程。在</li>
<li>实际上,你不需要建立一个列表,只需保持一个连续的总数。在</li>
<li>如果颠倒<code>if</code>/<code>else</code>的意思,它可能会更可读。在</li>
<li>你不是在计算香农多样性指数。这不是<code>-x ln x</code>的和,而是<code>-p ln p</code>的和,其中每个<code>p</code>是<code>x / sum(all x)</code>的<em>比例</em>。要处理这个问题,需要将所有的原始<code>x</code>值保存在一个列表中,这样就可以将其转换为<code>p</code>值的列表,这样就可以对这些值求和了。在</li>
</ul>