random.choice在计算其参数时遇到问题

时间:2018-05-21 16:54:32

标签: python random

我在随机模块中遇到random.choice的问题。所以这里有一个漂亮的代码块:

for trap in range(11):
    leftorright = raw_input("")
    if leftorright == "left" or "right":
        leftchoice = random.choice(True, False)
        if leftchoice:
            print "You don't feel anything on your legs, so you think you're okay."
        else:
            print "You feel a sharp pain on your %s leg." %(random.choice("left", "right"))
    else:
        print sorrycommand

所以这里的问题是两个random.choice个实例(leftchoice = random.choice(True, False)print "You feel a sharp pain on your %s leg." %(random.choice("left", "right")))给了我这个错误:

Traceback (most recent call last):
  File "main.py", line 408, in <module>
    startmenuchoice() 
  File "main.py", line 404, in startmenuchoice
    room7()
  File "main.py", line 386, in room7
    leftchoice = random.choice(True, False)
TypeError: choice() takes exactly 2 arguments (3 given)

现在,在这里走向真实:TypeError: choice() takes exactly 2 arguments (3 given)

它在错误中说明了 3 参数,但是如果你看一下错误代码,那么显然只有 2 给出的参数(需要适当数量的参数)。有人可以帮帮我吗?

附注:

  1. 我会提供评论中所需的任何其他信息,因为我不太了解所需的所有信息。
  2. 我正在使用网站repl.it,一个在线IDE和编译器。也许这可能与它有关?

1 个答案:

答案 0 :(得分:1)

random.choice没有多个参数;它需要一个序列来从中选择一个值。

leftchoice = random.choice([True, False])

random模块定义了一个类Random,它封装了一个随机数生成器。您创建一个实例,使用可选的种子来初始化它,然后调用其方法来获取各种随机值。

gen = random.Random(2382948)
x = gen.choice([True, False])

这非常适合测试,因为您可以使用相同的种子创建可重现的随机序列。但是,在一般使用中,您可能不关心种子并对某些默认种子感到满意(此处,基于os.urandom返回的值的值)。为方便该用例,random模块在​​导入时创建了Random的模块级实例:

_inst = Random()

并为该实例的方法创建一堆模块级别名:

...
choice = _inst.choice

所以random.choice,而不是一个接受一个序列参数的函数,真的一个绑定方法,其底层非绑定方法有两个参数(一个实例和一个序列),因此只需要一个。 (请记住_inst.choice([True, False])解析为Random.choice(_inst,[True,False])`。)

您看到的random.choice(True, False)错误消息是由于您实际上正在尝试调用Random.choice,定义为

def choice(self, seq):
    ...

_inst.choice(True, False)或(Random.choice(_inst, True, False)),现在应该很清楚,你有一个参数太多了。