2013-10-23 80 views
1

這裏是我到目前爲止的代碼:的Python - 補射默認預設範圍

import random 

normal_dice=6 

def roll(sides): 
    for i in range(sides == ""): 
     return random.randint(1,normal_dice) 
    for i in range(1,int(sides)): 
     return random.randint(1,int(sides)) 
    for i in range(int(sides),1): 
     print("None") 

一切正常,除了當用戶輸入是空白的,我得到錯誤信息:

Traceback (most recent call last): 
    File "<pyshell#29>", line 1, in <module> 
    roll() 
TypeError: roll() missing 1 required positional argument: 'sides' 

我想要什麼是用於當用戶輸入爲空時,產生1和6之間的隨機數字

任何幫助將不勝感激,在此先感謝!

+0

如果用戶輸入爲空,並且調用'roll(the_user_input)',則不會出現此錯誤。問題在於,你在某個地方調用'roll()',而沒有傳遞任何東西。 – abarnert

回答

1

您沒有向我們展示調用roll的代碼,這是問題所在。

但是,如果你想要讓這個roll可以在沒有在所有任何參數來調用,你可以做,通過使用默認參數值:如果默認是更復雜的東西(

def roll(sides='6'): 

例如,而不是「使用通常的規則,使用6面」這是「使用不同的規則」),您只需將默認值設置爲無效。無論是None

def roll(sides=None): 
    if sides is None: 
     return special_rule() 

...或者,如果None是一個有效的參數,自定義定點對象:

_sentinel = object() 
def roll(sides=_sentinel): 
    if sides is _sentinel: 
     return special_rule() 

作爲一個側面說明,你的代碼是不是做了正確的事幾乎任何投入。讓我們一步一步來:

for i in range(sides == ""): 
    return random.randint(1,normal_dice) 

這是正確的,但以一種非常複雜的方式。如果是sides == "",它將從0到1進行計數,並在第一次循環時從1到6返回一個數字。否則,它將從0到0計數,這意味着我們跳過整個循環。

for i in range(1,int(sides)): 
    return random.randint(1,int(sides)) 

這裏,如果sides大於1的任何數字,比如"8",你會從1數到8,並通過返回randint(1, 1)第一次,所以它會始終返回1,並永遠不會休息的循環。如果它是1或更少,它將跳過循環。

for i in range(int(sides),1): 
    print("None") 

而這段代碼將打印出字符串None多次,這不可能是非常有用的,最後脫落功能的結束並返回None之前。

我想你想是這樣的:

def roll(sides='6'): 
    sides = int(sides) 
    if sides > 1: 
     return random.randint(1, sides) 
    else: 
     raise ValueError("Can't roll a {}-sided die".format(sides)) 

如果你拿出if檢查,只是做了return random.randint(1, sides),傳遞一個數字小於1將引發一個異常喜歡ValueError: empty range for randrange() (1, 0, 0)。這對用戶來說很難理解。你是(我認爲)在原始版本中明確檢查這種情況。所以,我加入了一個更簡單明確的檢查,它給了你一個更好的錯誤信息:ValueError: can't roll a 0-sided die

+0

我不太確定我的理解。 進口隨機 高清輥(邊= '6'): 如果雙方> = 1: 回報random.randint(1,中間體(邊)) 其他: 打印( 「無」) – user2913576

+0

@ user2913576:做什麼你不明白嗎?我可以嘗試添加一些解釋,但它會幫助您知道哪個部分會讓您感到困惑...... – abarnert

+0

對不起,我是這個網站的新手。即使當我寫def roll(sides ='6')時,它仍然返回NameError。也叫卷的代碼可能是roll()或roll(8) – user2913576