代码是正确的,老师批准了,但它不工作。如何做到 运行? (Python 随机模块)

Code is correct, teacher approved, but it's not working. How do I make it run? (Python random module)

此代码绝对 100% 正确。它在老师的电脑和 运行s 上运行完美,但在我的电脑上却不行。我不知道为什么会这样。 Mac 和 Windows 上的问题相同(其他人也有同样的问题)。我有 Windows 8.1,如果相关的话,我将所有 python 文件保存在文档中。我有 Python 3.5,在 Shell 和命令 window 中也有同样的问题。

它在某种程度上确实有效 - 它打印了它应该打印的学生姓名,但随后它打印了两次结束消息并吓坏了。

我之前导入过 turtle 模块,但有 0 个问题。除了它和随机之外我没有导入任何东西,所以我不确定它是随机的还是其他模块。

这是代码。就是随机挑选学生进行活动:

def addlist():
    maxLengthList = int(input("How many students?"))
    turtle.title("Class Chooser")
    while len(kids) < maxLengthList:
        name = turtle.textinput("Students", "Enter a name")
        kids.append(name)
    nextturn()

def nextturn():
    turn = random.choice(kids)
    kids.remove(turn)
    print("Next " + turn)
    again=len(kids)
    while again>0:
        nextturn()
        again=again-1
    else:
        print("Have a nice day!")

import random
import turtle
kids = []
addlist()

这是错误信息。我输入了 lucy、alex、jake 和 bro 作为学生的名字:

How many students?4
Next lucy
Next alex
Next jake
Next bro
Have a nice day!
Have a nice day!
Traceback (most recent call last):
  File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 253, in choice
    i = self._randbelow(len(seq))
  File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 230, in _randbelow
    r = getrandbits(k)          # 0 <= r < 2**k
ValueError: number of bits must be greater than zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 24, in <module>
    addlist()
  File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 7, in addlist
    nextturn()
  File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 16, in nextturn
    nextturn()
  File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 16, in nextturn
    nextturn()
  File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 10, in nextturn
    turn = random.choice(kids)
  File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 255, in choice
    raise IndexError('Cannot choose from an empty sequence')
IndexError: Cannot choose from an empty sequence

你们有解决这个问题的方法吗?如果我不能正确导入随机数,我的作业将几乎无法完成。

编辑:我认为这是我的电脑、操作系统或我下载的 python 版本的问题。代码之外的任何会导致随机模块变得奇怪的东西。

更新:如果我将 quit() 放在 print("Have a nice day!") 之后,不会弹出任何错误消息,并且程序似乎 运行 符合预期。不过,我不确定这是否是创可贴的解决方案。

这种奇怪行为的原因是使用递归和 while 循环来调用相同的函数。

有很多方法可以解决这个问题;但是,我建议完全摆脱 while 循环,因为它令人困惑:

def addlist():
    maxLengthList = int(input("How many students?"))
    turtle.title("Class Chooser")
    while len(kids) < maxLengthList:
        name = turtle.textinput("Students", "Enter a name")
        kids.append(name)
    nextturn()

def nextturn():
    turn = random.choice(kids)
    kids.remove(turn)
    print("Next " + turn)
    again=len(kids)
    if again>0:
        nextturn()
        again=again-1
    else:
        print("Have a nice day!")

import random
import turtle
kids = []
addlist()

我也会稍微标准化代码,使其更具可读性:

import random
import turtle
kids = []
def addlist():
    maxLengthList = int(input("How many students?"))
    turtle.title("Class Chooser")
    while len(kids) < maxLengthList:
        name = turtle.textinput("Students", "Enter a name")
        kids.append(name)
    nextturn()

def nextturn():
    turn = random.choice(kids)
    kids.remove(turn)
    print("Next " + turn)
    if kids:
        nextturn()
    else:
        print("Have a nice day!")

addlist()

更新:

这是对您的代码所做的详细解释:

假设您有一个包含 [ann, bob, charlie] 的列表。

  • 在对 nextturn 的调用 #1 中:您删除了一个孩子,因此变量如下所示:(global kids=['ann', 'bob'], local again=2) 在进入循环之前。

  • On Call #2 to nextturn 你的变量在进入循环之前是这样的(global kids=[ann],local again=1)

  • 在调用 #3 时,它将在(不)进入循环之前(全局 kids=[empty],local again=0)。这将简单地打印 "Have a nice day" 并成功退出

呼叫 3 将结束,列表为空。但是呼叫 1 和 2 仍然有效。 在调用 #2 的 while 循环的第一次迭代之后,局部变量 again 为 0,因此它再次打印 "Have a nice day" 并退出。

但是在调用 1 中:局部变量 again 为 1,这意味着循环将在空列表上再次执行!!!。

这就是问题所在。

也许可以使用 random.randint(0,x) 来定义您想要的学生,例如

print(students[random.randint(0,3)]

不确定这是否有帮助,另一个建议可能是在另一个项目中尝试更简单的 print(random.randint(1,4) 看看它是否有效?

(此外,您可能应该将 import random 内容放在最前面。