代码是正确的,老师批准了,但它不工作。如何做到 运行? (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
内容放在最前面。
此代码绝对 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
内容放在最前面。