Python 判断数字类型的实战指南
在写 Python 代码时,经常得确认手里的数据到底是不是数字。无论是处理用户表单、清洗数据还是执行数学运算,类型校验都是避免程序崩溃的第一道防线。
对象类型检查:isinstance
如果你确定传入的是对象而非字符串,isinstance 是最直接的方式。它能识别 int、float 甚至 complex 等内置数值类型。
def is_number(n):
return isinstance(n, (int, float, complex))
注意,这不会把字符串 "123" 判为真,因为它是 str 类型,而不是数字对象。
字符串数字验证
如果输入是字符串,情况就复杂些了。Python 提供了几个字符串方法来区分不同类型的数字字符。
纯整数判断
isdigit() 只能认阿拉伯数字,遇到小数点或负号会返回 False。
def is_integer_string(s):
return s.isdigit()
更广泛的数字
isnumeric() 能识别罗马数字或中文数字(如'三'),但依然不支持小数点。
def is_numeric_string(s):
return s.isnumeric()
十进制专用
isdecimal() 严格限制为十进制,比 isdigit() 更安全,适合需要严格校验的场景。
def is_decimal_string(s):
return s.isdecimal()
Unicode 数值
unicodedata.numeric() 可以获取字符对应的数值,适合处理特殊符号,但需遍历检查。
import unicodedata
def get_unicode_value(char):
try:
return unicodedata.numeric(char)
except TypeError:
return None
异常捕获:最稳妥的用户输入处理
实际开发中,用户输入往往不可控。用 try-except 尝试转换是最通用的做法,因为它能覆盖绝大多数可转换为浮点数的情况。
def is_number_safe(n):
try:
float(n)
return True
except (ValueError, TypeError):
return False
正则表达式:格式控制
如果需要严格的格式(比如不允许前导零或特定小数位),正则更灵活,但性能开销稍大。
import re
def is_number_regex(s):
pattern = r'^-?\d+(\.\d+)?$'
return bool(re.match(pattern, s))
总结
没有万能的方法,看场景选工具。对象类型用 isinstance,字符串校验看需求,用户输入优先 try-except,格式严格再上正则。理解每种方法的边界,才能写出健壮的代码。


