【问题标题】:random.choice() takes two arguments?random.choice() 需要两个参数?
【发布时间】:2017-04-13 09:45:29
【问题描述】:

我在下面的掷骰子函数中犯了一个简单的错误:

import random

def rollDie():
    return random.choice(1,2,3,4,5,6)

print(rollDie())

我确实知道我需要将序列作为列表或元组传递,但我对以下错误消息更加好奇。

Traceback (most recent call last):
  File "Lecture 5.2 -- stochastic - die roll example.py", line 8, in <module>
    print(rollDie())
  File "Lecture 5.2 -- stochastic - die roll example.py", line 6, in rollDie
    return random.choice(1,2,3,4,5,6)
TypeError: choice() takes 2 positional arguments but 7 were given

消息说“choice() 接受 2 个位置参数,但给出了 7 个”。

但是文档只指出了一个参数(序列)。 https://docs.python.org/3/library/random.html

第二个参数是什么(在我的例子中是第七个)?这是种子吗(我没有指定,所以正在由时钟初始化)?

【问题讨论】:

    标签: python random arguments


    【解决方案1】:

    choice()random 模块维护的隐藏Random() 实例上的方法。因为它是一个方法,所以它有 2 个参数:self 和从中做出选择的可迭代对象。

    来自module documentation

    此模块提供的函数实际上是random.Random 类的隐藏实例的绑定方法。

    还有random module source code:

    def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
        try:
            i = self._randbelow(len(seq))
        except ValueError:
            raise IndexError('Cannot choose from an empty sequence') from None
        return seq[i]
    

    【讨论】:

    • 谢谢。我需要再考虑一下。我刚刚了解了“自我”特征突出的课程。这是同一个概念吗?也就是说, random.Random 是一个类,并且选择了这个类中的一个函数,还是我完全糊涂了?或者,有人会如何以及出于什么原因使用“自我”论点?
    • @apotheosied:你没有糊涂,就是这样。 class Random(...): 已定义 def choice(self, seq):。然后,当您使用 Random().choice(some_sequence)(在类的 instance 上)时,Python 会自动提供 self 参数(通过称为 binding 的过程,请参阅 @987654323 @如果你想深入了解)。
    【解决方案2】:

    要修复代码,请执行以下操作:

    import random
    options=[1,2,3,4,5,6]
    def rollDie():
          return random.choice(options)
    
    
    #whenever you use choice you must put the options in a list since choice only takes one argument.
    
    print(rollDie())
    

    【讨论】:

      【解决方案3】:

      根据我的经验: random.sample 是比 random.choice 更好的解决方案。

      【讨论】:

      • 嗨,Shalini,详细说明原因可能会很有用。我不熟悉 random.sample
      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2021-12-18
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多