2017-04-13 7 views
1

私は、次のダイスロール機能では単純なミス行わ:私はリストやタプルとしてシーケンスを渡す必要があるが、私は、次のエラーメッセージの詳細に興味があったことを知っていますrandom.choice()には2つの引数がありますか?

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つは指定されました」と表示されます。

しかし、ドキュメントは1つの引数(シーケンス)を示しています。 https://docs.python.org/3/library/random.html

第2引数(私の場合は7番目)は何ですか?これは種ですか(これは私が指定していないので、時計によって初期化されていますか)?

答えて

8

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] 
+0

ありがとうございました。私はこれについてもっと考えなければならない。私はちょうど '自己'の特徴が目立っているクラスについて学んだ。これは同じ概念ですか?つまり、random.Randomはクラスであり、このクラス内の関数を選択するか、完全に混乱していますか?あるいは、どのようにして誰がどのように「自己」議論を使用するのでしょうか? – apotheosied

+1

@apotheosied:あなたは混乱していない、それはまさにそれです。 'class Random(...):'は 'def choice(self、seq):'を定義しています。 'Random()。choice(some_sequence)'を使うと(クラスの*インスタンス*のために)、Pythonは自動的に 'self'引数を提供します(* binding *というプロセスを通して、[descriptor howto]深いダイビングに行く場合はhttps://docs.python.org/3/howto/descriptor.htmlを参照してください)。 –

+0

素晴らしいです、ありがとう! – apotheosied

関連する問題