Python技巧:用isnumeric等代替數值異常處理

書籍尋找發表於2019-02-19

實現Python程式碼,輸入數字,然後輸出這個數字的三倍。

>>> n = input("Enter a number: ")
Enter a number: 6
>>> print(f"{n} * 3 = {n*3}")
6 * 3 = 666

input函式總是返回字串。可以通過int轉換字串為整數:

>>> n = int(n)
>>> print(f"{n} * 3 = {n*3}")
6 * 3 = 18

但是,如果輸入不是數值,則會報錯:

Enter a number: abcd
ValueError: invalid literal for int() with base 10: `abcd`

比較常用的方法是在“try”塊中執行轉換,並捕獲我們可能獲得的任何異常。但字串的isdigit方法可以更優雅地解決這個問題。

>>> `1234`.isdigit()
True
>>> `1234 `.isdigit()  # space at the end
False
>>> `1234a`.isdigit()  # letter at the end
False
>>> `a1234`.isdigit()  # letter at the start
False
>>> `12.34`.isdigit()  # decimal point
False
>>> ``.isdigit()   # empty string
False

str.isdigit對正規表示式`^ d + $`返回True。

>>> n = input("Enter a number: ")
>>> if n.isdigit():
        n = int(n)
        print(f"{n} * 3 = {n*3}")

Python還包括另一方法str.isnumeric,他們有什麼區別?

>>> n = input("Enter a number: ")
>>> if n.numeric():
        n = int(n)
        print(f"{n} * 3 = {n*3}")

字串只包含數字0-9時str.isdigit返回True。str.isnumeric則還能識別英語意外語言的數值。

>>> `一二三四五`.isdigit()
False
>>> `一二三四五`.isnumeric()
True
>>> int(`二`)
ValueError: invalid literal for int() with base 10: `二`

str.isdecimal

>>> s = `2²`    # or if you prefer, s = `2` + `u00B2`
>>> s.isdigit()
True
>>> s.isnumeric()
True
>>> s.isdecimal()
False