2015-05-04 28 views
-1

你好,我有這個問題有一個功能,我用Python創建了:問題,試圖限制數據類型輸入

def intcheck(num) 
    if isinstance(num, int): 
     return num 
    else: 
     intcheck(input("Invalid datatype: Input integer only: ")) 

它應該檢查,如果輸入的是一個整數,如果不是,請用戶另一個輸入,然後檢查一個,等等。等。

但是代碼似乎卡在else語句中,即使正確的輸入也不會返回,並且它只會無限期地請求另一個輸入。

+2

您需要將輸入轉換爲int –

+0

'import pdb; pdb.set_trace();打印類型(num)' –

+0

,並且您還需要在'else'分支中返回intcheck(...)',否則在這種情況下您的函數將返回'None'。 –

回答

1

更簡單的方法是:

def is_int(foo): 
    try: 
     return int(foo) 
    except ValueError: 
     print('{} is not a number'.format(foo)) 
     return is_int(input('Please enter a number: ')) 

如果你在Python 2中,請確保您使用raw_input而不是input

0

您忘記了input函數返回str對象!所以,你永遠循環於intcheck函數的其他部分。相反,你可以這樣做:

def intcheck(num): 
    if isinstance(num, int): 
     return num 
    else: 
     input_string = input("Invalid datatype: Input integer only: ") 
     try: 
      input_int = int(input_string) 
     except ValueError: 
      input_int = input_string 
     finally: 
      intcheck(input_int) 
+0

在Python 2.x中,'input()'試圖轉換它的值。 「等同於eval(raw_input(提示))」。「 –

+0

@brunodesthuilliers如果OP使用Python 2.x,他永遠不會發布他的問題。 – Spirine

+0

可能是的,但問題沒有明確標記爲Python 3,而使用Python 2的其他人可能會閱讀答案並且無法獲得隱含的上下文。 –

0

輸入在Python是總是加載爲字符串,所以,首先,你需要將輸入轉化爲一個。優雅的方法是檢查它是否有例外:如果它是int,則返回它,如果不是,則請求另一個輸入。

def intcheck(num): 
    try: 
     return int(num) 
    except ValueError: 
     return intcheck(input("That is not a integer, please enter integer: ")) 
+0

,'input()'試圖轉換它的值。 「等同於eval(raw_input(提示))」。「 –

+0

由於在問題中使用'輸入'我猜他正在使用Python 3.x – Adalee

1

如果你使用的是Python 3.x中,input()返回一個字符串,所以你必須把它轉換爲int。如果你使用Python 2.x,你真的應該使用raw_input()來代替(Python 2.x input()是非常不安全的),並且因爲raw_input()與Python 3.x input()相同,所以你也必須將字符串到一個int。

在這兩種情況下,您都需要在else子句中返回遞歸調用的結果,如其他答案中所示。

現在使用遞歸這種方式,而可能是「優雅」,不是簡單的解決方案 - 一個很好的舊while循環工作的罰款,並避免堆積幀(Python中沒有做尾遞歸優化):

def checkint(): 
    while True: 
     num = input("your prompt here") 
     try: 
      return int(num) 
     except ValueError: 
      print "'{}' is not a valid integer".format(num)