2012-10-16 37 views
1

我試圖編寫一個程序,用戶輸入一個兩位數的整數,輸出結果是第二位數字打印第一位數字所指示的次數。以下是我迄今爲止:如何檢查Python 3.2中的整數?

number = input('Type two-digit integer \n') 
a = int(number)//10 
b = int(number)%10 
if len(number) != 2: 
    print(number, 'is not a two-digit integer') 
else: 
    print(a*str(b)) 

當我測試了這一點,它做什麼,我打算只要它做的事,如數字有人類型。如果有人輸入,也就是說,6R,錯誤消息將彈出說:

一個= INT(數字)// 10

ValueError異常:無效的字面INT()基數爲10:「6R '

所以我會假設有些東西需要放在代碼的第二行來測試輸入實際上是一個整數,我該怎麼做?用不同的方式改寫它會更好嗎?請記住,我正在參加Python入門課程,這是我正在採用的練習期中的一個問題,所以在這種情況下,我必須在實際期中回答這樣的問題,我不能使用很多複雜的過程。

這是我嘗試過,如果有人輸入的東西不是一個整數,但由於某種原因,我不知道它給非整數相同的消息整數,不起作用打算:

number = input('Type two-digit integer \n') 
if (isinstance(number, int)) == False: 
    print(number, 'is not a two-digit integer') 
elif len(number) != 2: 
    print(number, 'is not a two-digit integer') 
else: 
    a = int(number)//10 
    b = int(number)%10 
    print(a*str(b)) 

幫助將不勝感激!

回答

4

這裏最好的選擇是捕捉異常。出了問題,而這正是例外旨在處理:

try: 
    ... 
except ValueError: 
    print("You need to enter an integer!") 
    ... 

Python就口頭禪這是更好地請求原諒比許可,所以不要檢查是否正常工作事前,試試吧,如果不起作用,則處理該問題。

這使得代碼更加可靠(檢查可能會意外地拒絕正確的輸入,或者通過錯誤的輸入),並使代碼更好地被讀取(首先處理正常情況,然後處理問題,而不是檢查問題,然後處理)。

+0

我個人的偏好是當你通常使用'試穿except'不會期望一個無效的輸入,並且當你期望在大多數時間內輸入無效時使用'if-elif-else'。既然你期待用戶輸入一個int,'try-except'將是最好的構造。這絕對是最好的答案! –

+1

@ThaneBrimhall從性能和代碼清晰度的角度來看,這是一個很好的方法,儘管我不知道應該在每個**時間都應該執行捕獲異常的情況,比如處理文件系統的任何地方(因爲存在競爭條件的可能性)。 –

+1

這是一個很好的觀點。我的規定絕對有*例外*。 'try:my_rule();除了:do_something_else()'。 –

1

也許最簡單的事情就是做number.isdigit()isdigit將返回true,如果字符串中的所有字符都是數字,這意味着它是一個正整數。所以,你可以這樣做:

if not number.isdigit(): 
    print "You didn't enter an integer!" 

注意使用try /除其他答案建議將允許負整數,這可能沒有意義了你的使用情況(不能打印字符串-2次)。

問題是你並不是真的想要「兩位數的整數」,你需要一個由兩位數字組成的字符串,你將使用它作爲兩個獨立的數字。

+0

但對負整數沒有好處(這可能超出了這個問題的範圍,但它仍然很好理解)。 – mgilson

+0

@mgilson:是的,但這是一個優點,因爲他的實際使用案例也不適用於負整數。 – BrenBarn

+0

你建議捕捉異常很糟糕,因爲它可能會通過錯誤的輸入,但我認爲最好在(''if x <0:...'')之後明確檢查該情況。 –

2

這是tryexcept一個完美的時間:

try: 
    val = int(number) 
except ValueError: 
    print("That's not a number...") 
0

我會去這樣的事情:

number = re.match(r'(\d)(\d)', input('Typo two digit number:\n')) 
if number is not None: 
    print(int(number.group(1)) * number.group(2)) 
else: 
    pass # something wasn't right... 
+0

真的嗎?這是一個正則表達式嗎?大規模的矯枉過正。這樣更加複雜,不那麼清晰。 –

+0

@Lattyware一個正則表達式對於大多數事情來說並不是我的第一個想法,但是:3行 - 自動字符和長度驗證,自動變量分割,根本不*不清楚*(恕我直言,無論如何) –