【问题标题】:random.choice() takes 2 positional arguments but 3 were givenrandom.choice() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2021-02-22 13:20:02
【问题描述】:

当我输入这个时:

rand_num = random.choice(1, 101)

它显示:

TypeError: choice() takes 2 positional arguments but 3 were given

这些都是放在函数中的,我不明白为什么这么说。

【问题讨论】:

标签: python python-3.x random


【解决方案1】:

random.choice() 的签名是:

choice(seq)

你传递给它一个序列,例如:

>>> random.choice([1, 2, 6, 8, 9])
2

range 对象也有效,如此处的其他答案所示。

您可能会问,为什么 Python 会告诉您 choice()需要 2 个位置参数 而不是一个 (seq)?那是因为 choice() 隐含 takes a self parameter 因为它是一个实例方法。但是出于作为函数调用者的意图和目的,您应该只传递一个参数,即一个序列,例如列表或元组。

【讨论】:

    【解决方案2】:

    当您只输入 2 时,错误提示给出了 3 个参数,这可能看起来很奇怪,但您可能不知道 random.choice() 方法实际上是 random.Random() 对象的绑定方法。

    因此,当错误显示but 3 were given 时,它们包含了您未传入的self 参数。下面是更清晰的错误场景演示:

    obj = random.Random()
    rand_num = random.Random.choice(obj, 1, 101)
    

    输出:

    Traceback (most recent call last):
      File "<pyshell#17>", line 1, in <module>
        random.Random.choice(obj, 1, 101)
    TypeError: choice() takes 2 positional arguments but 3 were given
    

    修复它的方法很简单;将1 和101 传递给range() 方法以将两个数字转换为一个元素:

    rand_num = random.choice(range(1,101))
    

    但更实用的方法是使用random.randint() 方法:

    rand_num = random.randint(1,100)
    

    【讨论】:

      【解决方案3】:

      我认为你想做:

      rand_num = random.choice(range(1,101))
      

      The docs 表示您必须将一个序列传递给choice()(在本例中为一个范围)。

      【讨论】:

        【解决方案4】:

        Choice 从给定的直接指令中随机选择,例如 [1,2,3,4,5....]
        看看你需要什么:

        1. 如果您从列表中随机选择某项,则:
          rand_num = random.choice([1,2,3,...., 101])

        2. 如果你需要一个从 1 到 101 的随机数,例如 a randint: rand_num = random.randint(1, 101) 或者你可以使用标准函数range(start, stop, step)
          rand_num = random.choice(range(1, 101, 1))

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 2019-09-21
          • 2019-07-19
          • 2021-02-02
          • 2020-02-07
          • 2017-03-14
          • 2014-09-07
          • 1970-01-01
          • 2022-12-12
          相关资源
          最近更新 更多