2017-04-13 221 views
1

我做下面的模切輥功能的簡單的錯誤:random.choice()需要兩個參數?

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

第二個參數是什麼(在我的情況下是第七個參數)?這是種子(我沒有這樣指定,是由時鐘初始化)?

回答

8

choice()random模塊維護的隱藏的Random()實例上的方法。因爲它是一種方法,所以它有兩個參數: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] 
+0

謝謝。我需要更多地考慮這一點。我剛剛瞭解了「自我」突出顯示的課程。這是一個概念嗎?也就是說,random.Random是這個類中的一個類和選擇的函數,還是我完全混淆了?或者,如何以及爲什麼會有人使用「自我」論點? – apotheosied

+1

@apotheosied:你沒有混淆,就是這樣。 class Random(...):''''def choice(self,seq):'defined。然後,當你使用Random().selection(some_sequence)'(所以在類的*實例*上)時,Python自動提供'self'參數(通過一個名爲* binding *的進程,參見[descriptor howto]( https://docs.python.org/3/howto/descriptor.html)如果你想深入潛水)。 –

+0

太棒了,謝謝! – apotheosied

相關問題