PYTHON:random.py中的错误消息?以前工作过,后来就没了';t、 然后是,现在不是了';我再也不会了。什么';发生什么事了?

PYTHON:random.py中的错误消息?以前工作过,后来就没了';t、 然后是,现在不是了';我再也不会了。什么';发生什么事了?,python,random,Python,Random,我已经学习python几个月了,通常我能够克服我面临的所有问题,但现在我不知所措。我正在编写一个名为“Quizzer”的程序,该程序将用于根据Python给出的术语和答案列表生成随机问题。 我的主要问题是我一直在研究的gen_问题函数。我希望Python收到一个术语,并输出四个多选答案:一个是实际答案,三个是从所有可能答案中随机选择的答案。我必须包括一些检查,以确保所选的随机答案不是真实答案,并且彼此不相同 我今天终于让它工作了,然后过了一会儿我测试了它。我收到一条错误消息(我将在一秒钟内显示)

我已经学习python几个月了,通常我能够克服我面临的所有问题,但现在我不知所措。我正在编写一个名为“Quizzer”的程序,该程序将用于根据Python给出的术语和答案列表生成随机问题。 我的主要问题是我一直在研究的gen_问题函数。我希望Python收到一个术语,并输出四个多选答案:一个是实际答案,三个是从所有可能答案中随机选择的答案。我必须包括一些检查,以确保所选的随机答案不是真实答案,并且彼此不相同

我今天终于让它工作了,然后过了一会儿我测试了它。我收到一条错误消息(我将在一秒钟内显示)。我把所有东西都放回了我之前的位置,但仍然收到了相同的错误消息。几个小时后我回来了,我又得到了它。出于沮丧,我再试了一次,结果成功了。现在它不再工作了。求求你,任何人:发生了什么事

这是我的代码(我不知道需要什么,所以我包括了全部内容):

现在,它通常输出您期望的所有内容。我还没有自动生成问题的功能,因此我必须键入以下行:

gen_question('term1')
或者我用的任何术语

以下是我得到的结果:

How many questions on your test? (There are 20 questions in total.) 20
>>> gen_question('term1')

Question 1 of 20:

term1


Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    gen_question('term1')
  File "C:\Users\Owner\Desktop\LEARNING PYTHON\scripts\in progress\Quizzer.py", line 69, in gen_question
    int_rand_ans_1 = random.randint(1, len(term_list)) - 1
  File "C:\Users\Owner\Desktop\LEARNING PYTHON\python 2.7.5\lib\random.py", line 241, in randint
    return self.randrange(a, b+1)
  File "C:\Users\Owner\Desktop\LEARNING PYTHON\python 2.7.5\lib\random.py", line 217, in randrange
    raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
ValueError: empty range for randrange() (1,1, 0)
>>> gen_question('term8')
你的考试有多少题?(总共有20个问题)20
>>>一般问题(“第1项”)
第1/20号问题:
术语1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
一般问题(“第1项”)
gen_问题第69行的文件“C:\Users\Owner\Desktop\LEARNING PYTHON\scripts\in progress\Quizzer.py”
int_rand_ans_1=random.randint(1,len(术语列表))-1
文件“C:\Users\Owner\Desktop\LEARNING PYTHON\PYTHON 2.7.5\lib\random.py”,第241行,在randint中
返回自随机范围(a、b+1)
文件“C:\Users\Owner\Desktop\LEARNING PYTHON\PYTHON 2.7.5\lib\random.py”,第217行,在randrange中
raise VALUERROR,“randrange()的空范围(%d,%d,%d)”%(istart,istop,width)
ValueError:randrange()的范围为空(1,1,0)
>>>一般问题(“第8条”)

很明显,
randint()
在抱怨,因为
术语列表是空的,对吗?然后

random.randint(1, len(term_list))

并且
randint
被卡住。那么为什么
term\u list
是空的呢?因为这句话:

test_terms = list_scrambler(gen_test(int(raw_input("How many questions on your test? (There are " + str(len(term_list)) + " questions in total.) "))))
销毁术语列表,这可能是;-)不是故意的

很难按照代码来追踪发生这种情况的原因。基本问题是
gen_test
可以设置

test_terms = term_list
然后在名称
test\u terms
下返回
term\u list
。然后
术语列表
列表加扰器
开始时仍保持完整,但在
列表加扰器
结束时为空。

        del unscrambled_list[transfer_var]

删除
术语列表中的所有元素,一次删除一个。

这就是您得到的:

term_list = [...]
是在文件开头定义的,但稍后当输入的金额为最大值时,您将执行以下操作

test_term = term_list 
这不会创建数组的副本,而是创建两个变量,这两个变量都引用同一数组。因此,对
test\u term
的任何进一步修改实际上都反映在两个变量引用的列表中

由于您在脚本的全局级别上定义了
test\u术语
,因此在进行此调用时,您可以使用NUKE

def list_scrambler(unscrambled_list):
    test_terms=[]
    countdown = len(unscrambled_list) + 1
    for x in range(1, countdown):
        transfer_var = random.randint(0,len(unscrambled_list)-1)
        test_terms.append(unscrambled_list[transfer_var])
        del unscrambled_list[transfer_var]
    return test_terms
还要补充一点

匈牙利符号是一个很大的禁忌,python是一种强类型语言。如果你很难记录时间,不要依赖变量名。取而代之的是为自己准备一个IDE,或者使用能够表达他们正在做什么的名称

if something == false:
应改写为

if not something
这是一个更多的首选项,但当打印出需要浮动数据的文本时,您可以省去一些头痛和写

"D) {0}".format(somelist[index]) 
这将把变量填充到{0}中,为您提供一些格式化上下文,并防止您必须
str()
对象


此外,一般来说,全球化被认为是一件糟糕的事情,它们是有争议的。与C中的globals一样,它们有时有明确的用途,但在大多数情况下,它们隐藏了bug,使问题更难跟踪。有时,变量声明会影响全局变量,而其他声明(如您所见)会让您把事情搞砸

test\u terms=term\u list
更改为
test\u terms=term\u list[:]
,看看它是否解决了您的问题。@peter确实解决了,太棒了。A对代码做了一点修改,使它看起来不那么像我上面写的,但我仍然有一点问题,它吞噬了我的学期清单,你所说的解决了它。谢谢太棒了,现在可以用了。我完全改变了很多代码,使它看起来不那个么凌乱,但我的术语表一直像你们说的那个样被吃掉。正如上面的一条评论所建议的那样,编写
term\u list=list\u of_terms[:]
(我不得不改变一些变量名)似乎可以很好地解决这个问题。它现在工作得像发条了!:)我想我理解了你说的一些内容,但是什么是
“D{0}”.format(somelist[index])
?这是在创建一本包含答案的词典吗?(顺便说一句,代码现在已经修复了。除了列表扰码器之外,我重新编辑了所有内容,并使其不那么混乱。)@user3043902这将通过在
{}
花括号中插入值来格式化字符串<代码>“Hello{0}”。格式(“world”)
变成
“Hello world”
“Hello{0},日期是{1}”。格式(“John”,now())
变成
“Hello John,日期是2013年12月8日”
这是一种很好的格式化字符串的方法,而不必执行所有的“somestring”+str(变量)+“另一str”…等等繁琐的操作!哦,好的,谢谢。我正在读的书说格式化字符串的方式是“Hello%s”(“world”)来获取t
if not something
"D) {0}".format(somelist[index])