2016-06-13 49 views
-2

我想在python中做一个简单的命令行游戏。唯一的问题是,当我想让问题随机显示时,他们不会。我会告诉你目前我用来选择功能(问题)的方法。不能随机生成与random.shuffle函数列表

while 1: 
    questionList = [Question1(), Question2(), Question3(), Question4(), Question5()] 
    newList = random.shuffle(questionList) 
    print(newList.pop()) 
    print("Checking question list\n") 

我也用random.sample并没有运气,要么:/

请帮助^ -^

+1

'random.shuffle()'不返回一个新的列表;它随机化现有的列表。 –

+1

当在代码中提出有关错误的问题时,请描述预期的行为以及实际发生的情况。 – user2357112

回答

0

请记住,在这种情况下,数组中的函数,即Question1(), Question2(), Question3(), Question4(), Question5()将首先被调用。这些评估的结果将被指定为questionList的元素。

如果你想拥有的功能本身作为一个数组的元素,你需要删除括号:

random.shuffle(questionList) 
print(questionList.pop()()) 

questionList = [Question1, Question2, Question3, Question4, Question5] 

然后你原来的代码将与一个小的修改工作

请注意额外的一对括号,并且newList变量已经消失。

这里发生了以下情况。当Python在标识符后面看到()时,它会立即尝试调用该标识符。所以基本Question1()将得到评估,其结果被分配为questionList的第一个元素。第二个为Question2(),依此类推。但是,如果省略(),则函数本身将被分配为questionList的元素。然后你只需要调用“弹出”功能,这就是pop()之后额外的()

正如John Gordon在他的评论中提到的,random.shuffle(questionList)修改了questionList,并返回None。当你喜欢写东西

newList = random.shuffle(questionList) 

返回的值(即None)实际上是分配给newList。因此,在这种情况下newList的值将只是None。相反,你应该在洗牌后使用questionList。这就是为什么你需要删除newList

然而,你仍可以通过使用random.choice()而不是使用random.shuffle()然后pop(),正如我在原来的答复建议简化代码:

while 1: 
    questionList = [Question1, Question2, Question3, Question4, Question5] 
    print(random.choice(questionList)()) 
    print("Checking question list\n") 

祝你好运!

+0

这意味着为什么问题仍然按顺序显示。那么,在定义变量之前,是否必须移动打印(random.choice(questionList))?编辑:这也没有工作:/我真的不知道要做这个。 – Chris

+0

我认为你的意思是这些函数在分配给questionList之前运行。不知道如何解决这个问题,因为这是我第一个将实际时间和精力投入到 – Chris

+0

的蟒蛇项目,非常感谢。现在我需要做的就是让挑选出来的问题永远不会再被挑选出来。我看到你提到.pop,但我不知道在哪里放行1: questionList = [Question1,Question2,Question3,Question4,Question5] print(random.choice(questionList)()) print (“检查问题列表\ n”) – Chris

0

要对约翰·戈登的评论扩大,这是你所需要的:

while 1: 
    questionList = [Question1(), Question2(), Question3(), Question4(), Question5()] 
    random.shuffle(questionList) 
    print(questionList.pop()) 
    print("Checking question list\n") 
+0

这仍然不起作用...仍按1,2,3等的顺序显示问题; - ; – Chris

0

可以使用随机播放功能从随机模块:

while 1: 
    questionList = [Question1(), Question2(), Question3(), Question4(), Question5()] 
    newList = questionList 
    random.shuffle(questionList) 
    print(newList.pop(newList.index(holder))) 
    print("Checking question list\n") 

我创建原始列表副本的原因是它看起来像要保留原始问题列表(而弹出窗口会删除从列表中选择的项目)。如果不是这种情况,则可以删除此行。

尽管如此,因为这里的while循环基本上会一直持续下去,直到程序被手动强制停止。

+0

也许我把正确的代码放在错误的地方,因为这些代码仍然不能正常工作:/在定义了所有函数后,我放了这些代码行,因为如果我把它放在上面,它就不会知道函数是什么是。 – Chris